/ Hex Artifact Content
Login

Artifact 9806fb4030d0af907cf5cd7d4b9c8fd939eccfef:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0400: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0410: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0420: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0430: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0440: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0450: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0460: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0470: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0480: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0490: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
04c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
04d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
04e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
04f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0500: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0510: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0520: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0530: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0540: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0550: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0560: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0570: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0580: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0590: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
05a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
05b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
05c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
05d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
05e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
05f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0600: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0610: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0620: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0630: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0640: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0650: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0660: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0670: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0680: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0690: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
06a0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
06b0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
06c0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
06d0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
06e0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
06f0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0700: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0710: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0720: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0730: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0740: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0750: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0790: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
07a0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
07b0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
07c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
07d0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
07e0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
07f0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0800: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0810: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0820: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0830: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0840: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0850: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0860: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0870: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0880: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0890: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
08a0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
08b0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
08c0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
08d0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
08e0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
08f0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0900: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0910: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0920: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0930: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0940: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0950: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0960: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0970: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0980: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0990: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
09a0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
09b0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
09c0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
09d0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
09e0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
09f0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0a10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0a20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0a30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0a40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0a50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0a60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0a70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0a80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0a90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0aa0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0ab0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ac0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ad0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ae0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0af0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0b00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0b20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0b30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0b40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0b50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0b60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0b70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0b80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0b90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0ba0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0bb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0bc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0bd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0be0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0bf0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
0c00: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
0c10: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c20: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
0c30: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
0c40: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
0c50: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
0c60: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
0c70: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
0c80: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
0c90: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
0ca0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
0cb0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
0cc0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
0cd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
0ce0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
0cf0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d00: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d10: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d20: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d30: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
0d40: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
0d50: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
0d60: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
0d70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0d80: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
0d90: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
0da0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
0db0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
0dc0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
0dd0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
0de0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
0df0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
0e00: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
0e10: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
0e20: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
0e30: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
0e40: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
0e50: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
0e60: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
0e70: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
0e80: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
0e90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ea0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
0eb0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
0ec0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
0ed0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
0ee0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
0ef0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
0f00: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
0f10: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
0f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0f30: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
0f40: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
0f50: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
0f60: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
0f70: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
0f80: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
0f90: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0fa0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
0fb0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
0fc0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
0fd0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
0fe0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
0ff0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1000: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1010: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1020: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1030: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1040: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1050: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1060: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1070: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1080: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1090: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
10a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
10b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
10c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
10d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
10e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
10f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1100: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1110: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1120: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1130: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1140: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1150: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1160: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1170: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1180: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1190: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
11a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
11b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
11c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
11d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
11e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
11f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1200: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1210: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1220: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1230: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1240: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1250: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1260: 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  ->flags&DB_Schem
1270: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1280: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1290: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
12a0: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
12b0: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
12c0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
12d0: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
12e0: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
12f0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1300: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1310: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1320: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1330: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1340: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1350: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1360: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1370: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1380: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1390: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
13a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
13b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
13c0: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
13d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
13e0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
13f0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1400: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1410: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1420: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1430: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61  t ){.        iTa
1440: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1450: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1460: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1470: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1480: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1490: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
14a0: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
14b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
14c0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
14d0: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
14e0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
14f0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1500: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1510: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1520: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1530: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1540: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1550: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1560: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1570: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1580: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1590: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
15a0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
15b0: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
15c0: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
15d0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
15e0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
15f0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1600: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1610: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1620: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1630: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1640: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1650: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1660: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1670: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1680: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
16a0: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
16b0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
16c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16d0: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
16e0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
16f0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1700: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1710: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1720: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1730: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
1740: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
1750: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
1760: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
1770: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
1780: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
1790: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
17a0: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
17b0: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
17c0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
17d0: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
17e0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
17f0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
1800: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
1810: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
1820: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
1830: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
1840: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1850: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
1860: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
1870: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
1880: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
1890: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
18a0: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
18b0: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
18c0: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
18d0: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
18e0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
18f0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
1900: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
1910: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1920: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
1930: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
1940: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
1950: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
1960: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
1970: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
1980: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
1990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
19a0: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
19b0: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
19c0: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
19d0: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
19e0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
19f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1a00: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1a10: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
1a20: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
1a30: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
1a40: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
1a50: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
1a60: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
1a70: 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20  mitted).    ){. 
1a80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1aa0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20  n 0;.}.#endif   
1ab0: 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54   /* #ifdef SQLIT
1ac0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1ad0: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
1ae0: 66 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f Btree handle p
1af0: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
1b00: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
1b10: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
1b20: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
1b30: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1b40: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
1b50: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
1b60: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
1b70: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
1b80: 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   (by calling.** 
1b90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1ba0: 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53  bleLock()), or S
1bb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
1bc0: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
1bd0: 6e 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61  nt querySharedCa
1be0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
1bf0: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
1c00: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
1c10: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c20: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
1c30: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
1c40: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1c50: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1c60: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
1c70: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
1c80: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1ca0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
1cb0: 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  t( !(p->db->flag
1cc0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
1cd0: 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b  ommitted)||eLock
1ce0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54  ==WRITE_LOCK||iT
1cf0: 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a  ab==1 );.  .  /*
1d00: 20 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61   If requesting a
1d10: 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65   write-lock, the
1d20: 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74  n the Btree must
1d30: 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1d40: 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ite.  ** transac
1d50: 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c  tion on this fil
1d60: 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c  e. And, obviousl
1d70: 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62  y, for this to b
1d80: 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a  e so there .  **
1d90: 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1da0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1db0: 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  on on the file i
1dc0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73  tself..  */.  as
1dd0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1de0: 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42  D_LOCK || (p==pB
1df0: 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d  t->pWriter && p-
1e00: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e10: 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65  WRITE) );.  asse
1e20: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1e30: 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  LOCK || pBt->inT
1e40: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e50: 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20  S_WRITE );.  .  
1e60: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1e70: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1e80: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1e90: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1ea0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1eb0: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1ec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ed0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
1ee0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1ef0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
1f00: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
1f10: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
1f20: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
1f30: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
1f40: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
1f50: 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73  er!=p && pBt->is
1f60: 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1f70: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1f80: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1f90: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1fa0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
1fb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1fc0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
1fd0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1fe0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1ff0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2000: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2010: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2020: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2030: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2040: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2050: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2060: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2070: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2080: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2090: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
20a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
20b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
20c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
20d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
20e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
20f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2100: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2110: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2120: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2130: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2140: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2150: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2160: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2180: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2190: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
21a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
21b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
21d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
21e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
21f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2200: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2210: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2220: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2230: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2240: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2250: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2260: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2270: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2280: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2290: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
22a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
22b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
22c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
22d0: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
22e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
22f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2300: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
2310: 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  HE;.    }.  }.  
2320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2330: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
2340: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2350: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e  D_CACHE */..#ifn
2360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2370: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
2380: 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e  ** Add a lock on
2390: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
23a0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
23b0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
23c0: 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20  tree used.** by 
23d0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20  Btree handle p. 
23e0: 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20  Parameter eLock 
23f0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52  must be either R
2400: 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20  EAD_LOCK or .** 
2410: 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  WRITE_LOCK..**.*
2420: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2430: 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c  assumes the foll
2440: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  owing:.**.**   (
2450: 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64  a) The specified
2460: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20   Btree object p 
2470: 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
2480: 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20  a sharable.**   
2490: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e      database (on
24a0: 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61  e with the BtSha
24b0: 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61  red.sharable fla
24c0: 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  g set), and.**.*
24d0: 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72  *   (b) No other
24e0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68   Btree objects h
24f0: 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20  old a lock that 
2500: 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20  conflicts.**    
2510: 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75     with the requ
2520: 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e  ested lock (i.e.
2530: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
2540: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73  eTableLock() has
2550: 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64  .**       alread
2560: 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e  y been called an
2570: 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  d returned SQLIT
2580: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  E_OK)..**.** SQL
2590: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25a0: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
25b0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
25c0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d  ully. SQLITE_NOM
25d0: 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  EM .** is return
25e0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61  ed if a malloc a
25f0: 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f  ttempt fails..*/
2600: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53  .static int setS
2610: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2620: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
2630: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
2640: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
2650: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2660: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
2670: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
2680: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2690: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
26a0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
26b0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
26c0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
26d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
26e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
26f0: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63  !=0 );..  /* A c
2700: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74  onnection with t
2710: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
2720: 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c  ted flag set wil
2730: 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20  l never try to. 
2740: 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61   ** obtain a rea
2750: 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69  d-lock using thi
2760: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  s function. The 
2770: 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  only read-lock o
2780: 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20  btained.  ** by 
2790: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  a connection in 
27a0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
27b0: 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20   mode is on the 
27c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20  sqlite_master . 
27d0: 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74   ** table, and t
27e0: 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  hat lock is obta
27f0: 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67  ined in BtreeBeg
2800: 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20  inTrans().  */. 
2810: 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e   assert( 0==(p->
2820: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
2830: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2840: 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  ) || eLock==WRIT
2850: 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
2860: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2870: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2880: 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c  led on a sharabl
2890: 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69  e b-tree after i
28a0: 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  t .  ** has been
28b0: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
28c0: 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65   no other b-tree
28d0: 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63   holds a conflic
28e0: 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  ting lock.  */. 
28f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
2900: 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
2910: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65  ( SQLITE_OK==que
2920: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
2930: 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
2940: 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f  , eLock) );..  /
2950: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
2960: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
2970: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
2980: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
2990: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
29a0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
29b0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
29c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
29d0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
29e0: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
29f0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
2a00: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
2a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2a20: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2a30: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
2a40: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
2a50: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
2a60: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
2a70: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
2a80: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
2a90: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
2aa0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
2ab0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
2ac0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
2ad0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
2ae0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
2af0: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
2b00: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2b10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2b30: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
2b40: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
2b50: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
2b60: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
2b70: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
2b80: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
2b90: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
2ba0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
2bb0: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
2bc0: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
2bd0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2be0: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
2bf0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2c00: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
2c10: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
2c20: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
2c30: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
2c40: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
2c50: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
2c60: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
2c70: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
2c80: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
2c90: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
2ca0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
2cb0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
2cc0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
2cd0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
2ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2cf0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2d00: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2d10: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2d20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2d30: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
2d40: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
2d50: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
2d60: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
2d70: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
2d80: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2d90: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
2da0: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
2db0: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
2dc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2dd0: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
2de0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2df0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2e00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2e10: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2e20: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2e30: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2e40: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2e50: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2e60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2e70: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2e80: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2e90: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2ea0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2eb0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2ec0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2ed0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2ee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2ef0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2f00: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2f10: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2f20: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2f30: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2f40: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2f50: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2f60: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2f80: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2f90: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2fa0: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2fb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2fc0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2fd0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2fe0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ff0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3000: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
3010: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
3020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3030: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3040: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
3050: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
3060: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
3070: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3080: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
3090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30a0: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
30b0: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
30c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
30d0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
30e0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
30f0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
3100: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3110: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3120: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3130: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3140: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3150: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3160: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3170: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3180: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3190: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31a0: 77 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20  when Btree p is 
31b0: 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a  concluding its .
31c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
31d0: 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72  on. If there cur
31e0: 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20  rently exists a 
31f0: 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73  writer, and p is
3200: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   not.    ** that
3210: 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68   writer, then th
3220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  e number of lock
3230: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
3240: 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20  tions other.    
3250: 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74  ** than the writ
3260: 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74  er must be about
3270: 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f   to drop to zero
3280: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20  . In this case. 
3290: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73     ** set the is
32a0: 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20  Pending flag to 
32b0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
32c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
32d0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
32e0: 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72  ter, then BtShar
32f0: 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73  ed.isPending mus
3300: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3310: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3320: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3330: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3340: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3350: 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
3360: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
3370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3380: 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74  changes all writ
3390: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  e-locks held by 
33a0: 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61  Btree p into rea
33b0: 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  d-locks..*/.stat
33c0: 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64  ic void downgrad
33d0: 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
33e0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
33f0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
3400: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
3410: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3420: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f  r==p ){.    BtLo
3430: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  ck *pLock;.    p
3440: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3450: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
3460: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
3470: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
3480: 30 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b  0;.    for(pLock
3490: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  =pBt->pLock; pLo
34a0: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
34b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
34c0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c  ssert( pLock->eL
34d0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
34e0: 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  | pLock->pBtree=
34f0: 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63  =p );.      pLoc
3500: 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  k->eLock = READ_
3510: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
3520: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3530: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3540: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
3550: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
3560: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
3570: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
3580: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
3590: 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  ***** This routi
35a0: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
35b0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e  e of assert() on
35c0: 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65  ly ****.**.** Ve
35d0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
35e0: 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d  rsor holds the m
35f0: 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68  utex on its BtSh
3600: 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ared.*/.#ifdef S
3610: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
3620: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
3630: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
3640: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
3650: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3660: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
3670: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
3680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3690: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
36a0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
36b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
36c0: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
36d0: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
36e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36f0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3700: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
3710: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
3720: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
3730: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
3740: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
3750: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
3760: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
3770: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
3780: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3790: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
37a0: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
37b0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
37c0: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
37d0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
37e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
37f0: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
3800: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
3810: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
3820: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
3830: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3840: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
3850: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
3860: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
3870: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
3880: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
3890: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
38a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
38c0: 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  ed before modify
38d0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
38e0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74   of a table.** t
38f0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  o invalidate any
3900: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
3910: 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  s that are open 
3920: 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72  on the.** row or
3930: 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73   one of the rows
3940: 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e   being modified.
3950: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
3960: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3970: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
3980: 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
3990: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s of the.** tabl
39a0: 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
39b0: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
39c0: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
39d0: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a  e all incrblob.*
39e0: 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
39f0: 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e  n any row within
3a00: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
3a10: 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f  root-page pgnoRo
3a20: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ot..**.** Otherw
3a30: 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74  ise, if argument
3a40: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3a50: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65   false, then the
3a60: 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77   row with.** row
3a70: 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67  id iRow is being
3a80: 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c   replaced or del
3a90: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
3aa0: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a  se invalidate.**
3ab0: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72   only those incr
3ac0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
3ad0: 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66  n on that specif
3ae0: 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  ic row..*/.stati
3af0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3b00: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3b10: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
3b20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3b30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3b40: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
3b50: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
3b60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
3b70: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
3b80: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
3b90: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3bb0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
3bc0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
3bd0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
3be0: 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
3bf0: 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
3c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c10: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3c20: 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
3c30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3c40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3c50: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  t){.    if( p->i
3c60: 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
3c70: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
3c80: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
3c90: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
3ca0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
3cb0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
3cc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
3cd0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
3ce0: 6f 6e 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ons when INCRBLO
3cf0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
3d00: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3d10: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d20: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
3d30: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3d40: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
3d50: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
3d60: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3d70: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
3d80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
3d90: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
3da0: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
3db0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
3dc0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
3dd0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
3de0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
3df0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
3e00: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
3e10: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
3e20: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
3e30: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
3e40: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
3e50: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
3e60: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
3e70: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
3e80: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
3e90: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
3ea0: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
3eb0: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
3ec0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
3ed0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
3ee0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
3ef0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
3f00: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
3f10: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
3f20: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
3f30: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3f40: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
3f50: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
3f60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3f70: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
3f80: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
3f90: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
3fa0: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
3fb0: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
3fc0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
3fd0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
3fe0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
3ff0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
4000: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
4010: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4020: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4030: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4040: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4050: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4060: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4070: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4080: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4090: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40a0: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
40b0: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
40c0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
40d0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
40e0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
40f0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
4100: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
4110: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4120: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4130: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4140: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4150: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4160: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4170: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4180: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4190: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
41a0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
41b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
41c0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
41d0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
41e0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
41f0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4200: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4210: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4220: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4230: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4240: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4250: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4260: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4270: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4280: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4290: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
42a0: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
42b0: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
42c0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
42d0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
42e0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
42f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4300: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4310: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4320: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4330: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4340: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4350: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4360: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4370: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4380: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4390: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
43a0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
43b0: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
43c0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
43d0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
43e0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
43f0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
4400: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4410: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4420: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4430: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4440: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4450: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4460: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4470: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4480: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4490: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
44a0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
44b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
44c0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
44d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
44e0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
44f0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
4500: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
4510: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4520: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4530: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4540: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4550: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4560: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4570: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4580: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4590: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
45a0: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
45b0: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
45c0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
45d0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
45e0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
45f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
4600: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
4610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4620: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4630: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4640: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4660: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4670: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4680: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4690: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
46a0: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
46b0: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
46c0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
46d0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
46e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
46f0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4700: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
4710: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
4720: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
4730: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
4740: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4750: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
4760: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
4770: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
4780: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
4790: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
47a0: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
47b0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
47c0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
47d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
47e0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
47f0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4800: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
4810: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
4820: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
4830: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
4840: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
4850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4860: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
4870: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4880: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
4890: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
48a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
48b0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
48c0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
48d0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
48e0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
48f0: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4900: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4910: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4920: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4930: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4940: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4950: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4960: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4970: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4980: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4990: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
49a0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
49b0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
49c0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
49d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
49e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
49f0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
4a00: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
4a10: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
4a20: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
4a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
4a40: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
4a50: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
4a60: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
4a70: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4a80: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
4a90: 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29  ur, &pCur->nKey)
4aa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
4ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a  SQLITE_OK );  /*
4ac0: 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f   KeySize() canno
4ad0: 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  t fail */..  /* 
4ae0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
4af0: 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  tKey table, then
4b00: 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20   the above call 
4b10: 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28  to BtreeKeySize(
4b20: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
4b30: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e  e integer key in
4b40: 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20   pCur->nKey. In 
4b50: 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76  this case this v
4b60: 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c  alue is.  ** all
4b70: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
4b80: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
4b90: 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65   pCur is not ope
4ba0: 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20  n on an intKey. 
4bb0: 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20   ** table, then 
4bc0: 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72  malloc space for
4bd0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70   and store the p
4be0: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
4bf0: 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74  of key .  ** dat
4c00: 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  a..  */.  if( 0=
4c10: 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
4c20: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
4c30: 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c  void *pKey = sql
4c40: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74  ite3Malloc( (int
4c50: 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20  )pCur->nKey );. 
4c60: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
4c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4c80: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
4c90: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
4ca0: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
4cb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4cc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
4cd0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
4ce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4d00: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
4d10: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4d20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4d30: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
4d40: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
4d50: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
4d60: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
4d70: 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  y );..  if( rc==
4d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4d90: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
4da0: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
4db0: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
4dc0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
4dd0: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
4de0: 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67       pCur->apPag
4df0: 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
4e00: 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
4e10: 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  = -1;.    pCur->
4e20: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
4e30: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
4e40: 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ..  invalidateOv
4e50: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
4e60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
4e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
4e80: 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
4e90: 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65  ll cursors (exce
4ea0: 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74  pt pExcept) that
4eb0: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20   are open on.** 
4ec0: 74 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20  the table  with 
4ed0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
4ee0: 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
4ef0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
4f00: 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70  fore cursor.** p
4f10: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
4f20: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62  o modify the tab
4f30: 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28  le (BtreeDelete(
4f40: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
4f50: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
4f60: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
4f70: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
4f80: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
4f90: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
4fa0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
4fb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4fc0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
4fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
4fe0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
4ff0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5000: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5010: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5020: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5030: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5040: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5050: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5060: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
5070: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
5080: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5090: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
50a0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
50b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
50c0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
50d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
50e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
50f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5100: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5110: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
5120: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5130: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5140: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
5150: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
5160: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
5170: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5180: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
5190: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
51a0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
51b0: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
51c0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
51d0: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
51e0: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
51f0: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
5200: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
5210: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
5220: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
5230: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
5240: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
5250: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
5260: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
5270: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
5280: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
5290: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
52b0: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
52c0: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
52d0: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
52e0: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
52f0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
5300: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
5310: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
5320: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
5330: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
5340: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
5350: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
5360: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
5370: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
5380: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
5390: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
53a0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
53b0: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
53c0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
53d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
53e0: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
53f0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5400: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
5410: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
5420: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
5430: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
5440: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
5450: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
5460: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 31 35    char aSpace[15
5470: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
5480: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
5490: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
54a0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  d a malloc */.. 
54b0: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
54c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
54d0: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
54e0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
54f0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
5500: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
5510: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
5520: 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , pKey,.        
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
5550: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
5560: 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
5570: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5580: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
55a0: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
55b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
55c0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
55d0: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
55e0: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
55f0: 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  );.  if( pKey ){
5600: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5610: 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
5620: 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20  cord(pIdxKey);. 
5630: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5640: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
5650: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
5660: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
5670: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
5680: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
5690: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
56a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
56b0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
56c0: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
56d0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
56e0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
56f0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
5700: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5710: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
5720: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
5730: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
5740: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5750: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
5760: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
5770: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
5780: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
5790: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
57a0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
57b0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
57c0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
57d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
57e0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
57f0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
5800: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5810: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
5820: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5830: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
5840: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
5850: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
5860: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5870: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
5880: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
5890: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
58a0: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
58b0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20  ur->skipNext);. 
58c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
58d0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
58e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
58f0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
5900: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
5910: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
5920: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
5930: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
5940: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
5950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5960: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
5970: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5980: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
5990: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
59a0: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
59b0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
59c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59d0: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
59e0: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
59f0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
5a00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
5a10: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
5a20: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
5a30: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
5a40: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
5a50: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
5a60: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
5a70: 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  are pointing.** 
5a80: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
5a90: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
5aa0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  m..**.** This ro
5ab0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e  utine returns an
5ac0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73   error code if s
5ad0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5ae0: 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74  ong.  The.** int
5af0: 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20  eger *pHasMoved 
5b00: 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66  is set to one if
5b10: 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
5b20: 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e  moved and 0 if n
5b30: 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
5b40: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
5b50: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
5b60: 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d  pCur, int *pHasM
5b70: 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
5b80: 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ..  rc = restore
5b90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5ba0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
5bb0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5bc0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
5bd0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
5be0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
5bf0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5c00: 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29  r->skipNext!=0 )
5c10: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5c20: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5c30: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5c40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5c50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5c70: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
5c80: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
5c90: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
5ca0: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
5cb0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
5cc0: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
5cd0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
5ce0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
5cf0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
5d00: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
5d10: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  age number..*/.s
5d20: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5d30: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5d40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5d50: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5d60: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5d70: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
5d80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5da0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50  ->mutex) );.  nP
5db0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
5dc0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
5dd0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
5de0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
5df0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
5e00: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
5e10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
5e20: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
5e30: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
5e40: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
5e50: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
5e60: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
5e70: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
5e80: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
5e90: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
5ea0: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
5eb0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
5ec0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
5ed0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
5ee0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
5ef0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
5f00: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
5f10: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
5f20: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
5f30: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
5f40: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
5f50: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
5f60: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
5f70: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
5f80: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
5f90: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
5fa0: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
5fb0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
5fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
5fd0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
5fe0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
5ff0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6000: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6010: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
6020: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
6030: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6040: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
6050: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
6060: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
6070: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
6080: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
6090: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
60a0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
60b0: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
60c0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
60d0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
60e0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
60f0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
6100: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
6110: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
6120: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
6130: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6140: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6150: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
6160: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
6170: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
6180: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
6190: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
61a0: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
61b0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
61c0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
61d0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
61e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
61f0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
6200: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
6210: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6220: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6230: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6240: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
6250: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
6260: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
6270: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
6280: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
6290: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
62a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
62b0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
62c0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
62d0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
62e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
62f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6300: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
6310: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6320: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6330: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
6340: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72  exit;.  }.  pPtr
6350: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6360: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6370: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6380: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6390: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
63a0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
63b0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
63c0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
63d0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
63e0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
63f0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6400: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
6410: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6420: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6430: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6450: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6460: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6470: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6480: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6490: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
64a0: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
64b0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
64c0: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
64d0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
64e0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
64f0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6500: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
6510: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6520: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6530: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6540: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6550: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6560: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6570: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6580: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6590: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
65a0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
65b0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
65c0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
65d0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
65e0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
65f0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6600: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6610: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6620: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6630: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6640: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6650: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6660: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6670: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6680: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6690: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
66a0: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
66b0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
66c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
66d0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
66e0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
66f0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6700: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6710: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6720: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6730: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6740: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6750: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6760: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6770: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6780: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6790: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
67a0: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
67b0: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
67c0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
67d0: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
67e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
67f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6800: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
6810: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
6820: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6830: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
6840: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
6850: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6860: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
6870: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
6880: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
6890: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
68a0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
68b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
68c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
68d0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
68e0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
68f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6900: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
6910: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
6920: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
6930: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
6940: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
6950: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
6960: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
6970: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
6980: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
6990: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
69a0: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
69b0: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
69c0: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
69d0: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
69e0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
69f0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
6a00: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
6a10: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
6a20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6a30: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
6a40: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
6a50: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
6a60: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
6a70: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
6a80: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
6a90: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
6aa0: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
6ab0: 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65  )->aData[(P)->ce
6ac0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29  llOffset+2*(I)])
6ad0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ))../*.** This a
6ae0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
6af0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
6b00: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
6b10: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
6b20: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
6b30: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
6b40: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
6b50: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
6b60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
6b70: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
6b80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6b90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6ba0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6bb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
6bc0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
6bd0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
6be0: 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74  nt k;.    struct
6bf0: 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66   _OvflCell *pOvf
6c00: 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26  l;.    pOvfl = &
6c10: 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b  pPage->aOvfl[i];
6c20: 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e  .    k = pOvfl->
6c30: 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d  idx;.    if( k<=
6c40: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  iCell ){.      i
6c50: 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k==iCell ){. 
6c60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f         return pO
6c70: 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20  vfl->pCell;.    
6c80: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
6c90: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
6ca0: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
6cb0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
6cc0: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
6cd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
6ce0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
6cf0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
6d00: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
6d10: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
6d20: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
6d30: 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65  n.  btreeParseCe
6d40: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
6d50: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
6d60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6d70: 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73  nt and btreePars
6d80: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
6d90: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
6da0: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
6db0: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
6dc0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6dd0: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
6de0: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
6df0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
6e00: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
6e10: 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61  ad of.** btreePa
6e20: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
6e30: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
6e40: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
6e50: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
6e60: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
6e70: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
6e80: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
6e90: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
6ea0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
6eb0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ed0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
6ee0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
6ef0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
6f00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6f10: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
6f20: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
6f50: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
6f60: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
6f70: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
6f80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6f90: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
6fa0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
6fb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6fc0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6fd0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6fe0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
6ff0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
7000: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
7010: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
7020: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
7030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7040: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
7050: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
7060: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7070: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7080: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7090: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
70a0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
70b0: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
70c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
70d0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
70e0: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
70f0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
7100: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
7110: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
7120: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
7130: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
7140: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7150: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
7160: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
7170: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
7180: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
7190: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
71a0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
71b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
71c0: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
71d0: 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  n;.  testcase( n
71e0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
71f0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
7200: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7210: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7220: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b  l+1 );.  if( lik
7230: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
7240: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
7250: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
7260: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
7270: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7280: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
7290: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
72a0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
72b0: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
72c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
72d0: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
72e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
72f0: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
7300: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
7310: 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e  */.    nSize = n
7320: 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20  Payload + n;.   
7330: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7340: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
7350: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
7360: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66  flow = 0;.    if
7370: 28 20 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d  ( (nSize & ~3)==
7380: 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 ){.      nSize
7390: 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 4;        /* 
73a0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
73b0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a  e is 4 */.    }.
73c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
73d0: 20 3d 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20   = (u16)nSize;. 
73e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
73f0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
7400: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
7410: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
7420: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
7430: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
7440: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
7450: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
7460: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
7470: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
7480: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
7490: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
74a0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
74b0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
74c0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
74d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
74e0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
74f0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
7500: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
7510: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
7520: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
7530: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7540: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
7550: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
7560: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
7570: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
7580: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
7590: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
75a0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
75b0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
75c0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
75d0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
75e0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
75f0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7600: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
7610: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
7620: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7630: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7640: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
7650: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
7660: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
7670: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
7680: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
7690: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
76a0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
76b0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
76c0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
76d0: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
76e0: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
76f0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
7700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7710: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
7720: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7730: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7740: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
7750: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7760: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7770: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7780: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7790: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
77a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77b0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
77c0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
77d0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
77e0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
77f0: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
7800: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
7810: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
7820: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
7830: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
7840: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7850: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7860: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7870: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
7880: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
7890: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
78a0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
78b0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
78c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
78d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
78e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
78f0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
7900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7910: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
7920: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
7930: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
7940: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7950: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7960: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7970: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
7980: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
79a0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
79b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
79c0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
79d0: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
79e0: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
79f0: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
7a00: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
7a10: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
7a20: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
7a30: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
7a40: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
7a50: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
7a60: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
7a70: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
7a80: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
7a90: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7aa0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
7ab0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
7ac0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70    u8 *pIter = &p
7ad0: 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c  Cell[pPage->chil
7ae0: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32  dPtrSize];.  u32
7af0: 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20   nSize;..#ifdef 
7b00: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
7b10: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7b20: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7b30: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
7b40: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
7b50: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
7b60: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
7b70: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
7b80: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
7b90: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
7ba0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
7bb0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
7bc0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
7bd0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
7be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
7bf0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
7c00: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
7c10: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
7c20: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
7c30: 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  fo;.  btreeParse
7c40: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7c50: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
7c60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
7c70: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7c80: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
7c90: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7ca0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7cb0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
7cc0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
7cd0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
7ce0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
7cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
7d00: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
7d10: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
7d20: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
7d30: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
7d40: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
7d50: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
7d60: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
7d70: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
7d80: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
7d90: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
7da0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
7db0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
7dc0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
7dd0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
7de0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
7df0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
7e00: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
7e10: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
7e20: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
7e30: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
7e40: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7e50: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
7e60: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
7e70: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
7e80: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
7e90: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
7ea0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
7eb0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7ec0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
7ed0: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
7ee0: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
7ef0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7f00: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7f10: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
7f20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7f30: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7f40: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
7f50: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7f60: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
7f70: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
7f80: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
7f90: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
7fa0: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
7fb0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
7fc0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
7fd0: 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75  .  /* The minimu
7fe0: 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65  m size of any ce
7ff0: 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a  ll is 4 bytes. *
8000: 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20  /.  if( nSize<4 
8010: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  ){.    nSize = 4
8020: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
8030: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
8040: 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74  o.nSize );.  ret
8050: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
8060: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8070: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
8080: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
8090: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
80a0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
80b0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
80c0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
80d0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
80e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
80f0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
8100: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
8110: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8120: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
8130: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
8140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8150: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8160: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
8170: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
8180: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
8190: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
81a0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
81b0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
81c0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
81d0: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
81e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
81f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8200: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
8210: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8220: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
8230: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
8240: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
8250: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
8260: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
8270: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8280: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8290: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
82a0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
82b0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
82c0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
82d0: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
82e0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
82f0: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
8300: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
8310: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
8320: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70  verflow]);.    p
8330: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
8340: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
8350: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
8360: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
8370: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8380: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
8390: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
83a0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
83b0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
83c0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
83d0: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
83e0: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
83f0: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8400: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8410: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8420: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
8430: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
8440: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
8450: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
8460: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
8470: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
8480: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
8490: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
84a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
84b0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
84c0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
84e0: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
84f0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8520: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
8530: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
8560: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
8570: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
8580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
8590: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
85a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
85b0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
85c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
85d0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
85e0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
85f0: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8610: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8620: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8630: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8650: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
8660: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
8670: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8680: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
8690: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
86a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
86b0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
86c0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
86d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
86e0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8700: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8710: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8720: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
8730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8740: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
8750: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
8760: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8770: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8780: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8790: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
87a0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
87b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
87c0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
87d0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
87e0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
87f0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8800: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8810: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8820: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8830: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
8840: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
8850: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
8860: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
8870: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8880: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8890: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
88a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
88b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
88c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
88d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
88e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
88f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8900: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8910: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8920: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
8930: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
8940: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
8950: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
8960: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
8970: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
8980: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8990: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
89a0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
89b0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
89c0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
89d0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
89e0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
89f0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8a00: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8a10: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8a20: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
8a30: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
8a40: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
8a50: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
8a60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a70: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
8a80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a90: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8aa0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8ab0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8ac0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8ad0: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8ae0: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8af0: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8b00: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8b10: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8b20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8b30: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
8b40: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
8b50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8b60: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
8b70: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
8b80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8b90: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ba0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8bb0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8bc0: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8bd0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8be0: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8bf0: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8c00: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8c10: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8c20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8c30: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8c40: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
8c50: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8c60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8c70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8c80: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8c90: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8ca0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8cb0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8cc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8ce0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
8cf0: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
8d00: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
8d10: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
8d20: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8d30: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
8d40: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
8d50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8d60: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
8d70: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
8d80: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
8d90: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
8da0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
8db0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
8dc0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
8dd0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
8de0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
8df0: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
8e00: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
8e10: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
8e20: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
8e30: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
8e40: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
8e50: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
8e60: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
8e70: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8e80: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8e90: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
8ea0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
8eb0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
8ec0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8ed0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8ee0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8ef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8f00: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
8f10: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
8f20: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
8f30: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
8f40: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
8f50: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8f60: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
8f70: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
8f80: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
8f90: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
8fa0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
8fb0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
8fc0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
8fd0: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
8fe0: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
8ff0: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9000: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9010: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9020: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9030: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9040: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9050: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9060: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
9070: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
9080: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
9090: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
90a0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
90b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
90c0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
90d0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
90e0: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
90f0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
9100: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
9110: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
9120: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
9130: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
9140: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
9150: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
9160: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
9170: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
9180: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
9190: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
91a0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
91b0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
91c0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
91d0: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
91e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
91f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
9200: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
9210: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
9220: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
9230: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
9240: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
9250: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
9260: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9290: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
92a0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
92b0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
92e0: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
92f0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9300: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9310: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9320: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
9330: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
9340: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9350: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9360: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
9370: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
9380: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  nt usableSize; /
9390: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
93a0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a   the page */.  .
93b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93c0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93d0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
93f0: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9400: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9410: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9420: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9430: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9440: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9450: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9460: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
9470: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
9480: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
9490: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
94a0: 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  =0 );.  usableSi
94b0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
94c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61  >usableSize;.  a
94d0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75  ssert( nByte < u
94e0: 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a  sableSize-8 );..
94f0: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9500: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9510: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9520: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9530: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9540: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
9550: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
9560: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
9570: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9580: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9590: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
95a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
95b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
95c0: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
95d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
95e0: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
95f0: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9600: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9610: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9620: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9630: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9640: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
9650: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9660: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9670: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9680: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9690: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
96a0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
96b0: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
96c0: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
96d0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
96e0: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
96f0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9700: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9710: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9720: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9730: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9740: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
9750: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
9760: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
9770: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
9780: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
9790: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
97a0: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
97b0: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
97c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
97d0: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
97e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
97f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9800: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
9810: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69   slot */.      i
9820: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
9830: 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20  -4 || pc<addr+4 
9840: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9850: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9860: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
9870: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
9880: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9890: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
98a0: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
98b0: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
98c0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
98d0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
98e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
98f0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
9900: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
9910: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9920: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9930: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9940: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9950: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9960: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9970: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9980: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9990: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
99a0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
99b0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
99c0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
99d0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
99e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
99f0: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
9a00: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
9a10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9a20: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9a30: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9a40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9a50: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
9a60: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9a70: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9a80: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9a90: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9aa0: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9ab0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9ac0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9ad0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9ae0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9af0: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9b00: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
9b10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9b20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9b30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
9b40: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
9b50: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
9b60: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
9b70: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
9b80: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
9b90: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9ba0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9bb0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9bc0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9bd0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
9bf0: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
9c00: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
9c10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9c20: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9c30: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c40: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
9c50: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
9c60: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
9c70: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
9c80: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
9c90: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
9ca0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
9cb0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9cc0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
9cd0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
9ce0: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
9cf0: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
9d00: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
9d10: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
9d20: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
9d30: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
9d40: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
9d50: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
9d60: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
9d70: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
9d80: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
9d90: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
9da0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
9db0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
9dc0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
9dd0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
9de0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
9df0: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67  op+nByte <= pPag
9e00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9e10: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
9e20: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
9e30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9e40: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
9e50: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
9e60: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
9e70: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
9e80: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
9e90: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
9ea0: 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b  is pPage->aDisk[
9eb0: 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  start].** and th
9ec0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
9ed0: 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79  ock is "size" by
9ee0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  tes..**.** Most 
9ef0: 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65  of the effort he
9f00: 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  re is involved i
9f10: 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61  n coalesing adja
9f20: 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f  cent.** free blo
9f30: 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  cks into a singl
9f40: 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b  e big free block
9f50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9f60: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
9f70: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
9f80: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
9f90: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
9fa0: 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69  in, hdr;.  int i
9fb0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fd0: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
9fe0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
9ff0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
a000: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
a010: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
a020: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a030: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a040: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a050: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a060: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a070: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
a080: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
a090: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a0a0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
a0b0: 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c   (start + size)<
a0c0: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
a0d0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
a0e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a0f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a100: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a110: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20  assert( size>=0 
a120: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
a130: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
a140: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  /..  if( pPage->
a150: 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
a160: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  e ){.    /* Over
a170: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
a180: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
a190: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
a1a0: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20  cure_delete.    
a1b0: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
a1c0: 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  bled */.    mems
a1d0: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
a1e0: 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a   0, size);.  }..
a1f0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
a200: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
a210: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
a220: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74  freeblocks.  Not
a230: 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e  e that.  ** even
a240: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
a250: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
a260: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
a270: 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20  nitPage(),.  ** 
a280: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
a290: 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  did not detect o
a2a0: 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73  verlapping cells
a2b0: 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f   or.  ** freeblo
a2c0: 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70  cks that overlap
a2d0: 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72  ped cells.   Nor
a2e0: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
a2f0: 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65  when the.  ** ce
a300: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
a310: 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75  exceeds the valu
a320: 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  e in the page he
a330: 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a  ader.  If these.
a340: 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20    ** situations 
a350: 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73  arise, then subs
a360: 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70  equent insert op
a370: 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63  erations might c
a380: 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20  orrupt.  ** the 
a390: 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65  freelist.  So we
a3a0: 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   do need to chec
a3b0: 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e  k for corruption
a3c0: 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a   while scanning.
a3d0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a3e0: 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  t..  */.  hdr = 
a3f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
a400: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
a410: 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50   1;.  iLast = pP
a420: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a430: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65  Size - 4;.  asse
a440: 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74  rt( start<=iLast
a450: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   );.  while( (pb
a460: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a470: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
a480: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
a490: 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  ){.    if( pbegi
a4a0: 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  n<addr+4 ){.    
a4b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a4d0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
a4e0: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  begin;.  }.  if(
a4f0: 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b   pbegin>iLast ){
a500: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a510: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
a530: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
a540: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
a550: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a560: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
a570: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a580: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
a590: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
a5a0: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
a5b0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
a5c0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28  pPage->nFree + (
a5d0: 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  u16)size;..  /* 
a5e0: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
a5f0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
a600: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a610: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
a620: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a630: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
a640: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
a650: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
a660: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
a670: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
a680: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
a690: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a6a0: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
a6b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a6c0: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
a6d0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a6e0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
a6f0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
a700: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
a710: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
a720: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
a730: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
a740: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
a750: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
a760: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
a770: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
a780: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a790: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
a7c0: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
a7d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a7e0: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
a7f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a800: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
a810: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
a820: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a830: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
a840: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
a850: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
a860: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
a870: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
a880: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
a890: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
a8a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
a8b0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
a8c0: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
a8d0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
a8e0: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
a8f0: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
a900: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
a910: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
a920: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
a930: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a940: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
a950: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
a960: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
a970: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a980: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a990: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
a9a0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a9b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a9c0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a9d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
a9e0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a9f0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
aa00: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
aa10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
aa20: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
aa30: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
aa40: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
aa50: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aa60: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
aa70: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
aa80: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
aa90: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
aaa0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
aab0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
aac0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
aad0: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
aae0: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
aaf0: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
ab00: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
ab10: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
ab20: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
ab30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ab40: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
ab50: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
ab60: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
ab70: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
ab80: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
ab90: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
aba0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
abb0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
abc0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
abd0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
abe0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
abf0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
ac00: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
ac10: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
ac20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
ac30: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
ac40: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
ac50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ac60: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ac70: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ac80: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
ac90: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
aca0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
acb0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
acc0: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
acd0: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
ace0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
acf0: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
ad00: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
ad10: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
ad20: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
ad30: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
ad40: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
ad50: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
ad60: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
ad70: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
ad80: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
ad90: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
ada0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
adb0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
adc0: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
add0: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
ade0: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
adf0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
ae00: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
ae10: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
ae20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
ae30: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
ae40: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
ae50: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
ae60: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
ae70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ae80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ae90: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
aea0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
aeb0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
aec0: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
aed0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
aee0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
aef0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
af00: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
af10: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
af20: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
af30: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
af40: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
af50: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
af60: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
af70: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
af80: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
af90: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
afa0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
afb0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
afc0: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
afd0: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
afe0: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
aff0: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
b000: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b010: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d   btreeInitPage(M
b020: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
b030: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b040: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b050: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b060: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b070: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b080: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b090: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
b0a0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
b0b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b0c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
b0d0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b0e0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
b0f0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b100: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
b110: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
b120: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
b130: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
b140: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
b150: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
b160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b170: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
b180: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
b190: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
b1a0: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
b1b0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b1c0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
b1d0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
b1e0: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
b1f0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
b200: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
b210: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
b220: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
b230: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
b240: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
b250: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
b260: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
b270: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
b280: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
b290: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
b2a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
b2b0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
b2c0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
b2d0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
b2e0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
b2f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
b300: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
b310: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
b320: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
b330: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
b340: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
b350: 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
b360: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
b370: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
b380: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b390: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b3a0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
b3b0: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
b3c0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
b3d0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
b3e0: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
b3f0: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
b400: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
b410: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
b420: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
b430: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
b440: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
b450: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
b460: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b470: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
b480: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
b490: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
b4a0: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
b4b0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
b4c0: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
b4d0: 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67  ze - 1;.    pPag
b4e0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
b4f0: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
b500: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
b510: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
b520: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
b530: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
b540: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b550: 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  f;.    top = get
b560: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b570: 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  5]);.    pPage->
b580: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
b590: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
b5a0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
b5b0: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
b5c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
b5d0: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
b5e0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
b5f0: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
b600: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
b610: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b620: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b630: 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
b640: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
b650: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
b660: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72  .    /* A malfor
b670: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
b680: 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73  e might cause us
b690: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
b6a0: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
b6b0: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
b6c0: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
b6d0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
b6e0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
b6f0: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
b700: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
b710: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
b720: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
b730: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
b740: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
b750: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
b760: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
b770: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
b780: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
b790: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
b7a0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
b7b0: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
b7c0: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
b7d0: 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  - 4;.#if defined
b7e0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
b7f0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
b800: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
b810: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b820: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
b830: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b840: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
b850: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
b860: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
b870: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ell */..      if
b880: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
b890: 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
b8a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b8b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
b8c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20  ){.        pc = 
b8d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
b8e0: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
b8f0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b900: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
b910: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
b920: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
b930: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
b940: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b950: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b960: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
b970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b980: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b990: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
b9a0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
b9b0: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
b9c0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b9d0: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
b9e0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
b9f0: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
ba00: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
ba10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ba20: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ba30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ba40: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
ba50: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
ba60: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65  st++;.    }  .#e
ba70: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ndif..    /* Com
ba80: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
ba90: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
baa0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20   page */.    pc 
bab0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bac0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
bad0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
bae0: 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69  ] + top;.    whi
baf0: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
bb00: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
bb10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
bb20: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
bb30: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
bb40: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
bb50: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   free block is o
bb60: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
bb70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bb80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bb90: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bba0: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
bbb0: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
bbc0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
bbd0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
bbe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78  ;.      if( (nex
bbf0: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
bc00: 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69  size+3) || pc+si
bc10: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
bc20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
bc30: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
bc40: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
bc50: 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74  er. And the last
bc60: 20 62 79 74 65 20 6f 66 0a 09 2a 2a 20 74 68 65   byte of..** the
bc70: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
bc80: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
bc90: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
bca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bcb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bcc0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bcd0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
bce0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
bcf0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
bd00: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
bd10: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
bd20: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
bd30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
bd40: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
bd50: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
bd60: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
bd70: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
bd80: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
bd90: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
bda0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
bdb0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
bdc0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
bdd0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
bde0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
bdf0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
be00: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
be10: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
be20: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
be30: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
be40: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
be50: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
be60: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
be70: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
be80: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
be90: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
beb0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
bec0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
bed0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bee0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
bef0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
bf00: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
bf10: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
bf20: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
bf30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
bf40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bf50: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
bf60: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
bf70: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
bf80: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
bf90: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
bfa0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
bfb0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
bfc0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
bfd0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
bfe0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
bff0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
c000: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c010: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
c020: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c030: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
c040: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
c050: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c060: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
c070: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
c080: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
c090: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c0a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
c0b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
c0c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
c0d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c0e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
c0f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
c100: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c110: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c120: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c130: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c140: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c150: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c160: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65  );.  if( pBt->se
c170: 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
c180: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c190: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
c1a0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
c1b0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
c1c0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
c1d0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
c1e0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
c1f0: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
c200: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c210: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
c220: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c230: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c240: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
c250: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
c260: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42  Page->nFree = pB
c270: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c280: 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46  first;.  decodeF
c290: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
c2a0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
c2b0: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
c2c0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c2d0: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
c2e0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
c2f0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
c300: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
c310: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
c320: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61  <=32768 );.  pPa
c330: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
c340: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
c350: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
c360: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
c370: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
c380: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
c390: 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
c3a0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
c3b0: 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
c3c0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
c3d0: 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
c3e0: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
c3f0: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
c400: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
c410: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
c420: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
c430: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
c440: 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
c450: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
c460: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
c470: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
c480: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
c490: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c4a0: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
c4b0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
c4c0: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
c4d0: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
c4e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c4f0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
c500: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
c510: 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
c520: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c530: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
c540: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
c550: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
c560: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
c570: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
c580: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eded..**.** If t
c590: 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
c5a0: 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
c5b0: 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
c5c0: 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
c5d0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
c5e0: 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
c5f0: 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
c600: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
c610: 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
c620: 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
c630: 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
c640: 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
c650: 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
c660: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
c670: 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
c680: 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
c690: 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
c6a0: 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
c6b0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
c6c0: 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
c6d0: 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
c6e0: 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
c6f0: 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
c700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c710: 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
c720: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
c730: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
c740: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c750: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c760: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c770: 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
c780: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
c790: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
c7a0: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
c7b0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
c7c0: 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
c7d0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f      /* Do not lo
c7e0: 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
c7f0: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
c800: 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
c810: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
c820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c830: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c840: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
c850: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
c860: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
c870: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
c880: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
c890: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
c8a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
c8b0: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
c8c0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
c8d0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
c8e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c8f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
c900: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
c910: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
c920: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
c930: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
c940: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
c950: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
c960: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
c970: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c980: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c990: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c9a0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c9b0: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
c9c0: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
c9d0: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
c9e0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
c9f0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
ca00: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ca10: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ca20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
ca30: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
ca40: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
ca50: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
ca60: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
ca70: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
ca80: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
ca90: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
caa0: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
cab0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
cac0: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
cad0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cae0: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
caf0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
cb00: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
cb10: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
cb20: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
cb30: 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
cb40: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
cb50: 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
cb60: 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
cb70: 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
cb80: 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
cb90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
cba0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
cbb0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
cbc0: 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
cbd0: 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
cbe0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
cbf0: 69 6e 74 29 62 74 72 65 65 50 61 67 65 63 6f 75  int)btreePagecou
cc00: 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
cc10: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
cc20: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
cc30: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
cc40: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
cc50: 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e  is just a.** con
cc60: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
cc70: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
cc80: 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47   calls to btreeG
cc90: 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a  etPage() and .**
cca0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
ccb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
ccc0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
ccd0: 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61   the value *ppPa
cce0: 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20  ge is set to is 
ccf0: 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
cd00: 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
cd10: 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
cd20: 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
cd30: 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
cd40: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
cd50: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
cd60: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
cd70: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
cd80: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
cd90: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
cda0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cdb0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
cdc0: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
cdd0: 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72  ppPage     /* Wr
cde0: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
cdf0: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  nter here */.){.
ce00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
ce10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ce20: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ce30: 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  x) );..  if( pgn
ce40: 6f 3c 3d 30 20 7c 7c 20 70 67 6e 6f 3e 62 74 72  o<=0 || pgno>btr
ce50: 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
ce60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ce70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ce80: 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 62  PT;.  }.  rc = b
ce90: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
cea0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
ceb0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
cec0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
ced0: 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
cee0: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
cef0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cf00: 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
cf10: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
cf20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
cf30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cf40: 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
cf50: 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
cf60: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
cf70: 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
cf80: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
cf90: 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
cfa0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
cfb0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
cfc0: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
cfd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
cfe0: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
cff0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d000: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
d010: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d020: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
d030: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
d040: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
d050: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d060: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
d070: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
d080: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
d090: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d0a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d0b0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d0c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
d0d0: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
d0e0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
d0f0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
d100: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
d110: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
d120: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
d130: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
d140: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
d150: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
d160: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
d170: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
d180: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
d190: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
d1a0: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
d1b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d1c0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d1d0: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
d1e0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
d1f0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
d200: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
d210: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
d220: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
d230: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
d240: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
d250: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
d260: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
d270: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
d280: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
d290: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
d2a0: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
d2b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d2c0: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d2d0: 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
d2e0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
d2f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d300: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d310: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d320: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
d330: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
d340: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
d350: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
d360: 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
d370: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
d380: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
d390: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
d3a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
d3b0: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
d3c0: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
d3d0: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
d3e0: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
d3f0: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
d400: 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
d410: 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
d420: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
d430: 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
d440: 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
d450: 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
d460: 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
d470: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
d480: 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
d490: 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
d4a0: 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
d4b0: 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
d4c0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
d4d0: 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
d4e0: 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
d4f0: 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
d500: 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
d510: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
d520: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d530: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
d540: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
d550: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
d560: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
d570: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
d580: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
d590: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
d5a0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
d5b0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
d5c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d5d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d5e0: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
d5f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d600: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d610: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
d620: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
d630: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
d640: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
d650: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
d660: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
d670: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
d680: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
d690: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
d6a0: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
d6b0: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
d6c0: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
d6d0: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
d6e0: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
d6f0: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
d700: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
d710: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
d720: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
d730: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
d740: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
d750: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
d760: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
d770: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
d780: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
d790: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
d7a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
d7b0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
d7c0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
d7d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
d7e0: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
d7f0: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
d800: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
d810: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
d820: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
d830: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
d840: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
d850: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
d860: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
d870: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
d880: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d890: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
d8a0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
d8b0: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
d8c0: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
d8d0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
d8e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d8f0: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
d900: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
d910: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
d920: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
d930: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
d940: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
d950: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
d960: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
d970: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
d980: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
d990: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
d9a0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
d9b0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d9d0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
d9e0: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
d9f0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
da00: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
da10: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
da20: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
da30: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
da40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
da50: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
da60: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
da70: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
da80: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
da90: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
daa0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
dab0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
dae0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
daf0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
db00: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
db10: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
db20: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
db30: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
db40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
db50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
db60: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
db70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
db80: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
dbb0: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
dbc0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
dbd0: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
dbe0: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
dbf0: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
dc00: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
dc10: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
dc20: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
dc30: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
dc40: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
dc50: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
dc60: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
dc70: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
dc80: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
dc90: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
dca0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
dcb0: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
dcc0: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
dcd0: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
dce0: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
dcf0: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
dd00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
dd10: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
dd20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dd30: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
dd40: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
dd50: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
dd60: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
dd70: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
dd80: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
dd90: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
dda0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
ddb0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
ddc0: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
ddd0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
dde0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
ddf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
de00: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
de10: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
de20: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
de30: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
de40: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
de50: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
de60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
de70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
de80: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
de90: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
dea0: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
deb0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
dec0: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
ded0: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
dee0: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
def0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
df00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
df10: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
df20: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
df30: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
df40: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
df50: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
df60: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
df70: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
df80: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
df90: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
dfa0: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
dfb0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
dfc0: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
dfd0: 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26  0 && zFilename &
dfe0: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
dff0: 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
e000: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e010: 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
e020: 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
e030: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
e040: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
e050: 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
e060: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e070: 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74  3Malloc(nFullPat
e080: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  hname);.      sq
e090: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
e0a0: 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20  exShared;.      
e0b0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e0c0: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
e0d0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e0e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e0f0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
e100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e110: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
e120: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
e130: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
e140: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
e150: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
e160: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
e170: 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
e180: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
e190: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
e1a0: 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
e1b0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e1c0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
e1d0: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
e1e0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
e1f0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
e200: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
e210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e220: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
e230: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ared);.      for
e240: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
e250: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
e260: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
e270: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
e280: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
e290: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
e2a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e2b0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
e2c0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
e2d0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
e2e0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
e300: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
e310: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
e320: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
e330: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
e340: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
e350: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
e360: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
e370: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
e380: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
e390: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
e3a0: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
e3b0: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
e3c0: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
e3d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e3e0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e3f0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
e400: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e410: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e420: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e440: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e450: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
e460: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e470: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e490: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
e4a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e4b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
e4c0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
e4d0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
e4e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
e4f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
e500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e510: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e520: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e530: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e540: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e550: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
e560: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
e570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
e580: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
e590: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
e5a0: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
e5b0: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
e5c0: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
e5d0: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
e5e0: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
e5f0: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
e600: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
e610: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
e620: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
e630: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e640: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
e650: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
e660: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
e670: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e680: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e690: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e6a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
e6b0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
e6c0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
e6d0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
e6e0: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
e6f0: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
e700: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
e710: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
e720: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
e730: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
e740: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
e750: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
e760: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
e770: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
e780: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
e790: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e7a0: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
e7b0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
e7c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e7d0: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
e7e0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
e7f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e800: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
e810: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e820: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
e830: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e840: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
e850: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
e860: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
e870: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
e880: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
e890: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e8a0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e8b0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
e8c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
e8d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e8e0: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
e8f0: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
e900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e910: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
e920: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
e930: 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
e940: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
e950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e970: 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
e980: 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
e990: 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
e9a0: 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
e9b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
e9c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e9d0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
e9e0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
e9f0: 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
ea00: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ea10: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
ea20: 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
ea30: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
ea40: 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
ea50: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
ea60: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
ea70: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
ea80: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
ea90: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71  t->readOnly = sq
eaa0: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
eab0: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
eac0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
ead0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
eae0: 20 20 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65     pBt->secureDe
eaf0: 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  lete = 1;.#endif
eb00: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
eb10: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a  ze = get2byte(&z
eb20: 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20  DbHeader[16]);. 
eb30: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
eb40: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
eb50: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
eb60: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
eb70: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
eb80: 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
eb90: 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
eba0: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
ebb0: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
ebc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ebd0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
ebe0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
ebf0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
ec00: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
ec10: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
ec20: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
ec30: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
ec40: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
ec50: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
ec60: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
ec70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
ec80: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
ec90: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
eca0: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
ecb0: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
ecc0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
ecd0: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
ece0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
ecf0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
ed00: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
ed10: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
ed20: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
ed30: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
ed40: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
ed50: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
ed60: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
ed70: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
ed80: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
ed90: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
eda0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
edb0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
edc0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
edd0: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
ede0: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
edf0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
ee00: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
ee10: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
ee20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
ee30: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
ee40: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
ee50: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
ee60: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
ee70: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
ee80: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
ee90: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
eea0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
eeb0: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
eec0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
eed0: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
eee0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
eef0: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
ef00: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
ef10: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ef20: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
ef30: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
ef40: 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
ef50: 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
ef60: 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
ef70: 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
ef80: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
ef90: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
efa0: 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
efb0: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
efc0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
efd0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
efe0: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
eff0: 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
f000: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
f010: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
f020: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f030: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
f040: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
f050: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
f060: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
f070: 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
f080: 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
f090: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
f0a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f0b0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
f0c0: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d  ared;.      pBt-
f0d0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
f0e0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
f0f0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
f100: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
f110: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
f120: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
f130: 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
f140: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
f150: 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
f160: 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
f170: 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
f180: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
f190: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
f1a0: 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
f1b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f1c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
f1d0: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
f1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
f1f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
f200: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
f210: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
f220: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f230: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
f240: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
f250: 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
f260: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
f270: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
f280: 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
f290: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
f2a0: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
f2b0: 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
f2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f2d0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
f2e0: 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
f2f0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
f300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f310: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
f320: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
f330: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
f340: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
f350: 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
f360: 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
f370: 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
f380: 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
f390: 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
f3a0: 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
f3b0: 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
f3c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
f3d0: 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
f3e0: 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
f3f0: 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
f400: 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
f410: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
f420: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
f430: 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
f440: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
f450: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
f460: 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
f470: 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
f480: 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
f490: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
f4a0: 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
f4b0: 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
f4c0: 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
f4d0: 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
f4e0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
f4f0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
f500: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
f510: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
f520: 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
f530: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
f540: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
f550: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
f560: 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
f570: 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
f580: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
f590: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
f5a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f5b0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
f5c0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
f5d0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
f5e0: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
f5f0: 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
f600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
f610: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
f620: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
f630: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
f640: 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
f650: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
f660: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
f670: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
f680: 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
f690: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
f6a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f6b0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
f6c0: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
f6d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f6e0: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
f6f0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
f700: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f710: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
f720: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
f730: 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
f740: 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
f750: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f760: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f770: 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
f780: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
f790: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
f7a0: 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
f7b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
f7c0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
f7d0: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
f7e0: 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
f7f0: 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
f800: 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
f810: 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
f820: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
f830: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
f840: 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
f850: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
f860: 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
f870: 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
f880: 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
f890: 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
f8a0: 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
f8b0: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
f8c0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
f8d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f8e0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
f8f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
f900: 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61  pMaster;.  BtSha
f910: 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
f920: 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
f930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f940: 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
f950: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
f960: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
f970: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
f980: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
f990: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69  _MASTER);.  sqli
f9a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f9b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
f9c0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
f9d0: 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
f9e0: 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
f9f0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
fa00: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
fa10: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
fa20: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fa30: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fa40: 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
fa50: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
fa60: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
fa70: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fa80: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fa90: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
faa0: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
fab0: 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
fac0: 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
fad0: 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
fae0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
faf0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
fb00: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
fb10: 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
fb20: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
fb30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fb40: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
fb50: 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
fb60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
fb70: 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
fb80: 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
fb90: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
fba0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
fbb0: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
fbc0: 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
fbd0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
fbe0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
fbf0: 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
fc00: 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
fc10: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
fc20: 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
fc30: 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
fc40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
fc50: 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
fc60: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
fc70: 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
fc80: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
fc90: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
fca0: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
fcb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
fcc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
fcd0: 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
fce0: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
fcf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fd00: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
fd10: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
fd20: 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
fd30: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
fd40: 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
fd50: 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
fd60: 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
fd70: 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
fd80: 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
fd90: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
fda0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
fdb0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
fdc0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
fdd0: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
fde0: 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
fdf0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
fe00: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
fe10: 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
fe20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fe30: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
fe40: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
fe50: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
fe60: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
fe70: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
fe80: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
fe90: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
fea0: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
feb0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
fec0: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
fed0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fee0: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
fef0: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
ff00: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
ff10: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
ff20: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
ff30: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
ff40: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
ff50: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
ff60: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
ff70: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
ff80: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
ff90: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
ffa0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
ffb0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
ffc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
ffd0: 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
ffe0: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
fff0: 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
10000 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
10010 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10020 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
10030 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
10040 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
10050 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
10060 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
10070 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
10080 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10090 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
100a0 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
100b0 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
100c0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
100d0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
100e0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
100f0 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
10100 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
10110 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
10120 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
10130 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
10140 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
10150 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
10160 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
10170 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
10180 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
10190 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
101a0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
101b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
101c0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
101d0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
101e0 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
101f0 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
10200 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
10210 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
10220 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
10230 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
10240 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10250 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10260 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10270 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10290 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
102a0 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
102b0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
102c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
102d0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
102e0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
102f0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10300 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10310 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10320 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10330 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10340 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10360 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10370 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
10380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10390 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
103a0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
103b0 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
103c0 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
103d0 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
103e0 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
103f0 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
10400 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
10410 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
10420 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
10430 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
10440 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
10450 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
10460 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
10470 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
10480 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
10490 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
104a0 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
104b0 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
104c0 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
104d0 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
104e0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
104f0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
10500 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
10510 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
10520 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
10530 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10540 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
10550 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
10560 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
10570 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
10580 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10590 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
105a0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
105b0 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
105c0 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
105d0 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
105e0 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
105f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10600 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
10610 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
10620 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10630 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
10640 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
10650 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
10660 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10670 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10680 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10690 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
106a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
106b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
106c0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
106d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
106e0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
106f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10720 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
10730 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
10740 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
10750 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
10760 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
10770 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
10780 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
10790 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
107a0 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
107b0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
107c0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
107d0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
107e0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
107f0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
10800 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10810 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
10820 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
10830 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
10840 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
10850 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
10860 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
10870 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
10880 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
10890 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
108a0 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
108b0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
108c0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
108d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
108e0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
108f0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
10900 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
10910 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
10920 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
10930 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
10940 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10950 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10960 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
10970 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
10980 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10990 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
109a0 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
109b0 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
109c0 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
109d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
109e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
109f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10a00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
10a10 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
10a20 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
10a30 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
10a40 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
10a50 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
10a60 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
10a70 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
10a80 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
10a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10aa0 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
10ab0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
10ac0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10ad0 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
10ae0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10af0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
10b00 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
10b10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10b20 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
10b30 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
10b40 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
10b50 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
10b60 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10b70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10b80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10b90 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
10ba0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
10bb0 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
10bc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10bd0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
10be0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
10bf0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
10c00 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
10c10 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
10c20 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
10c30 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
10c40 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
10c50 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
10c60 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
10c70 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
10c80 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
10c90 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
10ca0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
10cb0 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
10cc0 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
10cd0 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
10ce0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
10cf0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
10d00 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
10d10 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
10d20 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
10d30 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
10d40 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
10d50 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
10d60 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
10d70 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
10d80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10d90 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
10da0 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
10db0 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
10dc0 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
10dd0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
10de0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
10df0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
10e00 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
10e10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
10e20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
10e30 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
10e40 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
10e50 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
10e60 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
10e70 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
10e80 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
10e90 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
10ea0 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
10eb0 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78 65  the pageSizeFixe
10ec0 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  d flag is set so
10ed0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
10ee0 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
10ef0 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
10f00 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
10f10 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
10f20 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
10f30 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
10f40 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
10f50 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
10f60 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
10f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
10f80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
10f90 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
10fa0 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
10fb0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
10fc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10fd0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
10fe0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
10ff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
11000 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11020 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
11030 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
11040 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
11050 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
11060 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11070 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11080 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
11090 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
110a0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
110b0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
110c0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
110d0 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
110e0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
110f0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
11100 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
11110 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
11120 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
11130 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
11140 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
11150 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
11160 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
11170 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
11180 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
11190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
111a0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
111b0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
111c0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
111d0 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
111e0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
111f0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
11200 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
11210 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ) pBt->pageSize
11220 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c  Fixed = 1;.  sql
11230 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11240 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11260 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
11270 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
11280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11290 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
112a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
112b0 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
112c0 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
112d0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
112e0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
112f0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
11300 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
11310 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
11320 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
11330 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
11340 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
11350 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
11360 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
11370 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sions..*/.int sq
11380 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
11390 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
113a0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
113b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
113c0 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
113d0 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
113e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
113f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11400 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
11410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11420 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
11430 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
11440 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
11450 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
11460 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
11470 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
11480 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
11490 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
114a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
114b0 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
114c0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
114d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
114e0 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
114f0 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
11500 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
11510 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11520 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11530 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
11540 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
11550 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
11560 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
11570 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11580 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
11590 20 53 65 74 20 74 68 65 20 73 65 63 75 72 65 44   Set the secureD
115a0 65 6c 65 74 65 20 66 6c 61 67 20 69 66 20 6e 65  elete flag if ne
115b0 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e  wFlag is 0 or 1.
115c0 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20    If newFlag is 
115d0 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65  -1,.** then make
115e0 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c   no changes.  Al
115f0 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
11600 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63  value of the sec
11610 75 72 65 44 65 6c 65 74 65 0a 2a 2a 20 73 65 74  ureDelete.** set
11620 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
11630 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
11640 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
11650 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
11660 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
11670 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
11680 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
11690 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
116a0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
116b0 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
116c0 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c  ->pBt->secureDel
116d0 65 74 65 20 3d 20 28 6e 65 77 46 6c 61 67 21 3d  ete = (newFlag!=
116e0 30 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20 7d 20  0) ? 1 : 0;.  } 
116f0 0a 20 20 62 20 3d 20 70 2d 3e 70 42 74 2d 3e 73  .  b = p->pBt->s
11700 65 63 75 72 65 44 65 6c 65 74 65 3b 0a 20 20 73  ecureDelete;.  s
11710 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11720 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
11730 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
11740 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
11750 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
11760 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
11770 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
11780 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
11790 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
117a0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
117b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
117c0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
117d0 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
117e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
117f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
11800 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
11810 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
11820 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
11830 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
11840 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
11850 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
11860 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
11870 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
11880 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
11890 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
118a0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
118b0 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
118c0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
118d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
118e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
118f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
11900 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
11910 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11920 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
11930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11940 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
11950 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
11960 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11970 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
11980 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20  izeFixed && (av 
11990 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
119a0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
119b0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
119c0 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
119d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
119e0 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
119f0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11a00 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
11a10 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
11a20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11a30 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
11a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11a50 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
11a60 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
11a70 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
11a80 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
11a90 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
11aa0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
11ab0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11ac0 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
11ad0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
11ae0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11af0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
11b00 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
11b10 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
11b20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
11b30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11b40 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
11b50 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
11b60 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
11b70 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
11b80 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
11b90 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
11ba0 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
11bb0 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
11bc0 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
11bd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11be0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
11bf0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
11c00 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
11c10 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
11c20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11c30 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
11c40 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
11c50 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
11c60 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
11c70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11c80 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
11c90 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
11ca0 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
11cb0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
11cc0 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
11cd0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
11ce0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
11cf0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
11d00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
11d10 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
11d20 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
11d30 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
11d40 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
11d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
11d60 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
11d70 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
11d80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
11d90 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
11da0 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
11db0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
11dc0 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
11dd0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
11de0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
11df0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
11e00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11e10 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
11e20 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
11e30 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
11e40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
11e50 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
11e60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
11e70 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
11e80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11e90 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
11ea0 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
11eb0 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
11ec0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11ed0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
11ee0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11ef0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
11f00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11f10 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
11f20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
11f30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f40 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
11f50 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
11f60 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
11f70 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
11f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
11f90 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
11fa0 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
11fb0 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
11fc0 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
11fd0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
11fe0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
11ff0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
12000 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
12010 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
12020 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
12030 61 44 61 74 61 29 3b 0a 20 20 69 66 28 20 28 72  aData);.  if( (r
12040 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12050 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
12060 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
12070 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  e))!=SQLITE_OK )
12080 7b 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  {;.    goto page
12090 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
120a0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d   }.  if( nPage==
120b0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
120c0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
120d0 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
120e0 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
120f0 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
12100 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
12110 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
12120 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a    int pageSize;.
12130 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
12140 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
12150 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
12160 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
12170 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
12180 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
12190 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
121a0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
121b0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
121c0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
121d0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
121e0 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
121f0 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
12200 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
12210 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
12220 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
12230 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
12240 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
12250 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
12260 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
12270 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
12280 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
12290 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
122a0 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
122b0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
122c0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
122d0 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
122e0 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
122f0 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
12300 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
12310 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
12320 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
12330 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
12340 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
12350 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
12360 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
12370 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
12380 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
12390 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
123a0 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
123b0 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
123c0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
123d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
123e0 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
123f0 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
12400 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
12410 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
12420 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
12430 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
12440 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
12450 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
12460 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
12470 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
12480 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
12490 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
124a0 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d 3e 64  19]==2 && pBt->d
124b0 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20 29 7b  oNotUseWAL==0 ){
124c0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65  .      int isOpe
124d0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  n = 0;.      rc 
124e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
124f0 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  enWal(pBt->pPage
12500 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20  r, &isOpen);.   
12510 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12530 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
12540 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65  failed;.      }e
12550 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d  lse if( isOpen==
12560 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        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 20 20 72 65 74 75 72 6e  ;.        return
12590 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
125a0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53    }.      rc = S
125b0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
125c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
125d0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
125e0 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
125f0 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
12600 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
12610 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
12620 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
12630 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
12640 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
12650 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
12660 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
12670 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
12680 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
12690 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
126a0 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
126b0 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
126c0 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
126d0 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
126e0 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
126f0 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
12700 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
12710 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
12720 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
12730 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
12740 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
12750 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20  (&page1[16]);.  
12760 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
12770 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
12780 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32   || pageSize<512
12790 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c   ||.        (SQL
127a0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
127b0 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53  E<32768 && pageS
127c0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
127d0 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b  AGE_SIZE).    ){
127e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
127f0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
12800 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
12810 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
12820 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65  =0 );.    usable
12830 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
12840 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
12850 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70   if( pageSize!=p
12860 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
12870 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
12880 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
12890 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
128a0 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
128b0 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
128c0 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
128d0 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
128e0 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
128f0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
12900 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
12910 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
12920 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
12930 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
12940 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
12950 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
12960 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
12970 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
12980 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
12990 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
129a0 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
129b0 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
129c0 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
129d0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
129e0 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
129f0 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62  Size = (u16)usab
12a00 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
12a10 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
12a20 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  16)pageSize;.   
12a30 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
12a40 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
12a50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
12a60 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
12a70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
12a80 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69            pageSi
12ab0 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  ze-usableSize);.
12ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12ad0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
12ae0 50 61 67 65 48 65 61 64 65 72 3e 6e 50 61 67 65  PageHeader>nPage
12af0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
12b00 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12b10 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
12b20 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
12b30 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
12b40 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
12b50 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
12b60 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
12b70 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
12b80 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
12b90 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  16)pageSize;.   
12ba0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
12bb0 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69   = (u16)usableSi
12bc0 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
12bd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12be0 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
12bf0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
12c00 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
12c10 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
12c20 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
12c30 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
12c40 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
12c50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
12c60 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
12c70 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
12c80 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
12c90 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
12ca0 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
12cb0 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
12cc0 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
12cd0 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
12ce0 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
12cf0 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
12d00 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
12d10 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
12d20 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
12d30 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
12d40 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
12d50 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
12d60 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
12d70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
12d80 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
12d90 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
12da0 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
12db0 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
12dc0 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
12dd0 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
12de0 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
12df0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
12e00 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
12e10 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
12e20 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
12e30 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
12e40 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
12e50 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
12e60 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
12e70 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
12e80 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
12e90 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
12ea0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
12eb0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
12ec0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
12ed0 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*64/255 - 23;.
12ee0 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
12ef0 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
12f00 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
12f10 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
12f20 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
12f30 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
12f40 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
12f50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
12f60 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
12f70 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
12f80 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
12f90 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
12fa0 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
12fb0 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
12fc0 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
12fd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12fe0 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
12ff0 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
13000 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
13010 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
13020 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13030 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
13040 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
13050 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
13060 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
13070 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
13080 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
13090 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
130a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
130b0 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
130c0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
130d0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
130e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
130f0 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
13100 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
13110 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
13120 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
13130 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
13140 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
13150 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
13160 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
13170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13180 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
13190 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
131a0 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
131b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
131c0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
131d0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
131e0 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42  pCursor==0 || pB
131f0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13200 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
13210 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
13220 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
13230 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
13240 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e1!=0 ){.    ass
13250 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
13260 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
13270 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
13280 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
13290 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20  >pPager)==1 );. 
132a0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
132b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
132c0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
132d0 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
132e0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
132f0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
13300 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74   If pBt points t
13310 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20  o an empty file 
13320 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61  then convert tha
13330 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20  t empty file.** 
13340 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79  into a new empty
13350 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
13360 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
13370 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  rst page of.** t
13380 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
13390 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
133a0 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
133b0 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
133c0 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
133d0 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
133e0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
133f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13400 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
13410 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
13420 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
13430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13440 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
13450 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
13460 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
13470 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
13480 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
13490 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
134a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
134b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
134c0 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
134d0 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
134e0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
134f0 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
13500 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
13510 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
13520 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
13530 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
13540 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
13550 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
13560 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
13570 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
13580 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
13590 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
135a0 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
135b0 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
135c0 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
135d0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
135e0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
135f0 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
13600 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
13610 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
13620 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
13630 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
13640 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
13650 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
13660 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
13670 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
13680 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
13690 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
136a0 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
136b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
136c0 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
136d0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
136e0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
136f0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
13700 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
13710 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
13720 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
13730 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
13740 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
13750 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
13760 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
13770 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ndif.  pBt->nPag
13780 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31  e = 1;.  data[31
13790 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 1;.  return 
137a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
137b0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
137c0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
137d0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
137e0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
137f0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
13800 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13810 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
13820 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
13830 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
13840 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
13850 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
13860 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
13870 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
13880 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
13890 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
138a0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
138b0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
138c0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
138d0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
138e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
138f0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
13900 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
13910 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
13920 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
13930 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
13940 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
13950 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
13960 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
13970 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
13980 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
13990 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
139a0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
139b0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
139c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
139d0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
139e0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
139f0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
13a00 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
13a10 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
13a20 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
13a30 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
13a40 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
13a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
13a60 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
13a70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
13a80 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
13a90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13aa0 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
13ab0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13ac0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
13ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
13ae0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
13af0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
13b00 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
13b10 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
13b20 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
13b30 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
13b40 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
13b50 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
13b60 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
13b70 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
13b80 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
13b90 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
13ba0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
13bb0 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
13bc0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
13bd0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
13be0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
13bf0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
13c00 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
13c10 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
13c20 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
13c30 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
13c40 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
13c50 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
13c60 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
13c70 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
13c80 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
13c90 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
13ca0 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
13cb0 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
13cc0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
13cd0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
13ce0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
13cf0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
13d00 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
13d10 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
13d20 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
13d30 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
13d40 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
13d50 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
13d60 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
13d70 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
13d80 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
13d90 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
13da0 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
13db0 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
13dc0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
13dd0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
13de0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
13df0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
13e00 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
13e10 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
13e20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
13e30 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
13e40 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13e50 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
13e60 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
13e70 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
13e80 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
13e90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13ea0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
13eb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
13ec0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13ed0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
13ee0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
13ef0 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
13f00 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
13f10 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13f20 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
13f30 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
13f40 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
13f50 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
13f60 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
13f70 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
13f80 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
13f90 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
13fa0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
13fb0 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
13fc0 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
13fd0 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
13fe0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
13ff0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
14000 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
14010 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
14020 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
14030 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
14040 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
14050 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
14060 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
14070 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
14080 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
14090 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
140a0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
140b0 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
140c0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
140d0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
140e0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
140f0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
14100 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
14110 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
14120 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
14130 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
14140 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
14150 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
14160 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
14170 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
14180 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
14190 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
141a0 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20  isPending ){.   
141b0 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
141c0 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
141d0 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
141e0 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
141f0 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
14200 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
14210 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
14220 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
14230 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
14240 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
14250 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
14260 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
14270 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14290 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
142a0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
142b0 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
142c0 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
142d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
142e0 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
142f0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
14300 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
14310 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
14320 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
14330 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
14340 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
14350 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
14360 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
14370 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
14380 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
14390 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
143a0 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
143b0 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
143c0 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
143d0 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
143e0 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
143f0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
14400 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
14410 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
14420 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
14430 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
14440 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79 45   pBt->initiallyE
14450 6d 70 74 79 20 3d 20 70 42 74 2d 3e 6e 50 61 67  mpty = pBt->nPag
14460 65 3d 3d 30 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  e==0;.  do {.   
14470 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72   /* Call lockBtr
14480 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65  ee() until eithe
14490 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73  r pBt->pPage1 is
144a0 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20   populated or.  
144b0 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29    ** lockBtree()
144c0 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
144d0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
144e0 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72  LITE_OK. lockBtr
144f0 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ee().    ** may 
14500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14510 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e   but leave pBt->
14520 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20  pPage1 set to 0 
14530 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20  if after.    ** 
14540 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69  reading page 1 i
14550 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  t discovers that
14560 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
14570 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
14580 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e      ** file is n
14590 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ot pBt->pageSize
145a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
145b0 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20  ockBtree() will 
145c0 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42  update.    ** pB
145d0 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74  t->pageSize to t
145e0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
145f0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
14600 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
14610 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
14620 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  =0 && SQLITE_OK=
14630 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65  =(rc = lockBtree
14640 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69  (pBt)) );..    i
14650 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14660 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
14670 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61      if( pBt->rea
14680 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
14690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
146a0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
146b0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
146c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
146d0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
146e0 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
146f0 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
14700 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
14710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14720 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
14730 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
14740 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14750 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
14760 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
14780 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
14790 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
147a0 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
147b0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
147c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
147d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
147e0 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
147f0 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
14800 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
14810 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14820 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
14830 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
14840 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
14850 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
14860 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14870 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14880 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
14890 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65  harable ){..asse
148a0 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
148b0 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
148c0 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
148d0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
148e0 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
148f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
14900 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
14910 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
14920 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
14930 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
14940 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
14950 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
14960 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
14970 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
14980 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
14990 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
149a0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
149b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
149c0 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
149d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
149e0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
149f0 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
14a00 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14a10 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
14a20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
14a30 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
14a40 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76   pBt->isExclusiv
14a50 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e  e = (u8)(wrflag>
14a60 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  1);.    }.#endif
14a70 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
14a80 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
14a90 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
14aa0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
14ab0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
14ac0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
14ad0 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
14ae0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
14af0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
14b00 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
14b10 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
14b20 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
14b30 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
14b40 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
14b50 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
14b60 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
14b70 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
14b80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14b90 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
14ba0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
14bb0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
14bc0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
14bd0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
14be0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14bf0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14c00 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
14c10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14c20 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
14c30 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
14c40 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
14c50 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
14c60 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
14c70 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
14c80 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
14c90 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
14ca0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
14cb0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
14cc0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
14cd0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
14ce0 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
14cf0 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
14d00 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
14d10 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
14d40 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
14d50 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14d80 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
14d90 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
14da0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14dc0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14dd0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14de0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
14df0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
14e00 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
14e10 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
14e20 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
14e30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14e40 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
14e50 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14e60 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
14e70 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
14e80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14e90 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
14ea0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
14eb0 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
14ec0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
14ed0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
14ee0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
14ef0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
14f00 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
14f10 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
14f20 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
14f30 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
14f40 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
14f50 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
14f60 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
14f70 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
14f80 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
14f90 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
14fa0 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
14fb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14fc0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
14fd0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
14fe0 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
14ff0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
15000 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
15010 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
15020 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
15030 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
15040 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
15050 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
15060 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
15070 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
15080 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
15090 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
150a0 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
150b0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
150c0 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
150d0 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
150e0 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
150f0 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
15100 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
15110 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
15120 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
15130 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
15140 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
15150 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
15160 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
15170 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
15180 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
15190 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151b0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
151c0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
151d0 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
151e0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
151f0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
15200 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
15210 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15220 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
15230 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
15240 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
15250 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
15260 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
15270 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
15280 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
15290 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
152a0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
152b0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
152c0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
152d0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
152e0 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
152f0 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
15300 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
15310 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
15320 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
15330 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15340 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
15350 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
15360 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
15370 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
15380 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
15390 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
153a0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
153b0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
153c0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
153d0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
153e0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
153f0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
15400 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
15410 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
15420 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
15430 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
15440 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
15450 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
15460 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
15470 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
15480 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
15490 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
154a0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
154b0 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
154c0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
154d0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
154e0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
154f0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
15500 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
15510 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
15520 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
15530 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
15540 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
15550 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
15560 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
15570 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
15580 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
15590 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
155a0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
155b0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
155c0 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
155d0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
155e0 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
155f0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
15600 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
15610 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
15620 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
15630 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
15640 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15660 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
15670 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
15680 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
15690 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
156a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
156b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
156c0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
156d0 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
156e0 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
156f0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
15700 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
15710 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
15720 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
15730 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
15740 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15750 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
15760 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
15770 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
15780 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
15790 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
157a0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
157b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
157c0 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
157d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
157e0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
157f0 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
15800 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
15810 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
15820 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
15830 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
15840 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
15850 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
15860 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
15870 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
15880 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
15890 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
158a0 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
158b0 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
158c0 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
158d0 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
158e0 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
158f0 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
15900 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
15910 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
15920 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
15930 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
15940 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
15950 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
15960 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
15970 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
15980 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
15990 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
159a0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
159b0 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
159c0 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
159d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
159e0 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
159f0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15a00 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
15a10 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
15a20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
15a30 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
15a40 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
15a50 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
15a60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
15a70 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
15a80 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
15a90 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
15aa0 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
15ab0 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
15ac0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
15ad0 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
15ae0 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
15af0 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
15b00 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
15b10 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
15b20 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
15b30 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
15b40 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
15b50 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
15b60 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
15b70 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
15b80 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
15b90 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
15ba0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
15bb0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
15bc0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
15bd0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
15be0 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
15bf0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15c00 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
15c20 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
15c30 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
15c40 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
15c50 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
15c60 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
15c70 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
15c80 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
15c90 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
15ca0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
15cb0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
15cc0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
15cd0 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
15ce0 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
15cf0 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
15d00 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
15d10 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
15d20 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
15d30 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
15d40 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
15d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
15d70 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
15d80 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
15d90 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
15da0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
15db0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
15dc0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
15dd0 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
15de0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
15df0 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
15e00 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
15e10 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
15e20 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
15e30 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
15e40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
15e50 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
15e60 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
15e70 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15e80 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
15e90 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
15ea0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
15eb0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
15ec0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
15ed0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
15ee0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
15ef0 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
15f00 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
15f10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
15f20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
15f30 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
15f40 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
15f50 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
15f60 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
15f70 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
15f80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15f90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15fa0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15fb0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
15fc0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
15fd0 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
15fe0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
15ff0 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
16000 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
16010 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
16020 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
16030 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
16040 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16060 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16070 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16080 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
16090 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
160a0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
160b0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
160c0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
160d0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
160e0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
160f0 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
16100 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
16110 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
16120 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
16130 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
16140 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
16150 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
16160 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
16170 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
16180 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16190 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
161a0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
161b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
161c0 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
161d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
161e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
161f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16200 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
16210 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16220 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
16230 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
16240 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
16250 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
16260 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
16270 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
16280 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
162a0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
162b0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
162c0 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
162d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
162e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
162f0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
16300 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
16310 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
16320 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
16330 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
16340 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
16350 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
16360 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
16370 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
16380 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
16390 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
163a0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
163b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
163c0 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
163d0 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
163e0 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
163f0 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
16400 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
16410 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
16420 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
16430 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
16440 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
16450 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
16460 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
16470 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
16480 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
16490 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
164a0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
164b0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
164c0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
164d0 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
164e0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
164f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
16500 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
16510 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
16520 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
16530 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
16540 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
16550 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
16560 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
16570 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
16580 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
16590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
165a0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
165b0 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
165c0 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
165d0 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a  e.  If nFin is z
165e0 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
165f0 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56  ed that.** incrV
16600 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  acuumStep() will
16610 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e   be called a fin
16620 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ite amount of ti
16630 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79  mes.** which may
16640 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74   or may not empt
16650 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  y the freelist. 
16660 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75   A full autovacu
16670 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30  um.** has nFin>0
16680 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63  .  A "PRAGMA inc
16690 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22  remental_vacuum"
166a0 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f   has nFin==0..*/
166b0 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
166c0 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
166d0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
166e0 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
166f0 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  g){.  Pgno nFree
16700 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
16710 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16720 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
16730 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
16740 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16750 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16760 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
16780 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
16790 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
167a0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
167b0 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
167c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
167d0 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
167e0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
167f0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
16800 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
16810 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
16820 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
16830 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
16840 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
16850 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16860 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
16870 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
16880 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
16890 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
168a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
168b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
168c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
168d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
168e0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
168f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16900 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
16910 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
16920 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
16930 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
16940 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
16950 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
16960 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
16970 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
16980 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
16990 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
169a0 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
169b0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
169c0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
169d0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
169e0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
169f0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
16a00 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
16a10 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
16a20 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
16a30 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
16a40 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
16a50 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
16a60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16a70 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
16a80 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
16a90 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
16aa0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
16ab0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
16ac0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
16ad0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
16ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16b10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
16b20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
16b30 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
16b40 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
16b50 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
16b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
16b70 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
16b80 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
16b90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
16ba0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
16bb0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
16bc0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
16bd0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
16be0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
16bf0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
16c00 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
16c10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16c20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16c30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16c40 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
16c50 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
16c60 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
16c70 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
16c80 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
16c90 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
16ca0 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
16cb0 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
16cc0 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
16cd0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
16ce0 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
16cf0 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
16d00 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
16d10 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
16d20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
16d30 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
16d40 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
16d50 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
16d60 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
16d70 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
16d80 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
16d90 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
16da0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
16db0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
16dc0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
16dd0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
16de0 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
16df0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16e10 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
16e20 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
16e30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16e40 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
16e50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16e60 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
16e70 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
16e80 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
16e90 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
16ea0 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
16eb0 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
16ec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16ed0 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
16ee0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
16ef0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16f00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16f10 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
16f20 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
16f30 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
16f40 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d   iFreePg, nFin!=
16f50 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
16f60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
16f70 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
16f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16f90 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
16fa0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
16fb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e    }.  }..  if( n
16fc0 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c  Fin==0 ){.    iL
16fd0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69  astPg--;.    whi
16fe0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
16ff0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
17000 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41  Bt)||PTRMAP_ISPA
17010 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
17020 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54   ){.      if( PT
17030 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
17040 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
17050 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
17060 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
17070 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
17080 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c  , iLastPg, &pPg,
17090 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
170a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
170b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
170c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
170d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
170e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
170f0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
17100 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
17110 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ge(pPg);.       
17120 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17130 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17140 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17150 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17160 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
17170 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
17180 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
17190 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  e(pBt->pPager, i
171a0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74  LastPg);.    pBt
171b0 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
171c0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
171d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
171e0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
171f0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
17200 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
17210 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
17220 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
17230 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
17240 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
17250 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
17260 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
17270 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
17280 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
17290 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
172a0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
172b0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
172c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
172d0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
172e0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
172f0 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
17300 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
17310 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
17320 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
17330 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
17340 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
17350 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
17360 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
17370 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17380 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
17390 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
173a0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
173b0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
173c0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
173d0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
173e0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
173f0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
17400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
17410 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
17420 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
17430 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
17440 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
17450 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
17460 30 2c 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  0, btreePagecoun
17470 74 28 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28  t(pBt));.    if(
17480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17490 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
174a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
174b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
174c0 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
174d0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
174e0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
174f0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
17500 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
17510 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17520 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17530 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17540 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
17550 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
17560 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
17570 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
17580 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
17590 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
175a0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
175b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
175c0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
175d0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
175e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
175f0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
17600 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
17610 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
17620 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
17630 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
17640 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
17650 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
17660 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
17670 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
17680 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
17690 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
176a0 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
176b0 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
176c0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
176d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
176e0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
176f0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
17700 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
17710 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
17720 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
17730 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
17740 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17750 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17760 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
17770 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
17780 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
17790 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
177a0 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
177b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
177c0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
177d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
177e0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
177f0 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
17800 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
17810 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
17820 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
17830 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
17840 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
17850 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
17860 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17870 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
17880 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
17890 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
178a0 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
178b0 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
178c0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72  */.    int nEntr
178d0 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  y;        /* Num
178e0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
178f0 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
17900 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  e */.    Pgno nO
17910 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
17920 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
17930 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
17940 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
17950 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
17960 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
17970 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
17980 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
17990 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
179a0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
179b0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
179c0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
179d0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
179e0 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
179f0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
17a00 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
17a10 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
17a20 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
17a30 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
17a40 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
17a50 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
17a60 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
17a70 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
17a80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17a90 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
17aa0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
17ab0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
17ac0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
17ad0 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
17ae0 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20  sableSize/5;.   
17af0 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
17b00 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
17b10 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
17b20 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
17b30 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ;.    nFin = nOr
17b40 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
17b50 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f  rmap;.    if( nO
17b60 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
17b70 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
17b80 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
17b90 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
17ba0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
17bb0 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
17bc0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
17bd0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
17be0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
17bf0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46  pBt) ){.      nF
17c00 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in--;.    }.    
17c10 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
17c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17c30 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
17c40 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
17c50 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
17c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
17c70 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
17c80 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
17c90 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
17ca0 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
17cb0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
17cc0 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
17cd0 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
17ce0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
17cf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17d00 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
17d10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
17d20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
17d30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
17d40 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
17d50 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
17d60 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
17d70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
17d80 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
17d90 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
17da0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
17db0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
17dc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46  (pBt->pPager, nF
17dd0 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
17de0 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
17df0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
17e00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17e10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
17e20 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
17e30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
17e40 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
17e50 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
17e60 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
17e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
17e80 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
17e90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17ea0 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
17eb0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
17ec0 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
17ed0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
17ee0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
17ef0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
17f00 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
17f10 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
17f20 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
17f30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
17f40 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
17f50 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
17f60 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
17f70 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
17f80 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
17f90 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
17fa0 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
17fb0 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
17fc0 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
17fd0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
17fe0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
17ff0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
18000 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
18010 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18020 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
18030 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
18040 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
18050 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
18060 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
18070 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
18080 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
18090 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
180a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
180b0 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
180c0 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
180d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
180e0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
180f0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
18100 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
18110 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
18120 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
18130 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
18140 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
18150 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
18160 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
18170 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18180 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
18190 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
181a0 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
181b0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
181c0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
181d0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
181e0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
181f0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
18200 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
18210 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
18220 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
18230 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
18240 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
18250 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
18260 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18270 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
18280 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
18290 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
182a0 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
182b0 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
182c0 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
182d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
182e0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
182f0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
18300 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
18310 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
18320 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18330 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
18340 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
18350 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
18360 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
18370 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
18380 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
18390 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
183a0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
183b0 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
183c0 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
183d0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
183e0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
183f0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
18400 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
18410 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
18420 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
18430 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
18440 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
18450 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
18460 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
18470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
18480 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
18490 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
184a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
184b0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
184c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
184d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
184e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
184f0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
18500 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
18510 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
18520 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
18530 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18550 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18560 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
18570 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18580 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
18590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
185a0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
185b0 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
185c0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
185d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
185e0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
185f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18600 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
18610 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
18620 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
18630 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
18640 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
18650 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
18660 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
18670 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
18680 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
18690 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
186a0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
186b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
186c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
186d0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
186e0 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72  );..  btreeClear
186f0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
18700 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
18710 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
18720 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62  p->db->activeVdb
18730 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  eCnt>1 ){.    /*
18740 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
18750 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
18760 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
18770 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
18780 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
18790 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
187a0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
187b0 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
187c0 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
187d0 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
187e0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
187f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
18800 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
18810 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
18820 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
18830 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
18840 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
18850 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
18860 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
18870 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
18880 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
18890 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
188a0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
188b0 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
188c0 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
188d0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
188e0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
188f0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
18900 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
18910 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
18920 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
18930 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
18940 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
18950 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
18960 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
18970 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
18980 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
18990 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
189a0 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
189b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
189c0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
189d0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
189e0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
189f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
18a00 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
18a10 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
18a20 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
18a30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
18a40 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
18a50 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
18a60 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
18a70 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
18a80 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
18a90 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
18aa0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
18ab0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
18ac0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
18ad0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
18ae0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
18af0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
18b00 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
18b10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18b20 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
18b30 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
18b40 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
18b50 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
18b60 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
18b70 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
18b80 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
18b90 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
18ba0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
18bb0 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
18bc0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
18bd0 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
18be0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
18bf0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
18c00 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18c10 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
18c20 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
18c30 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
18c40 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
18c50 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
18c60 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
18c70 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
18c80 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
18c90 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
18ca0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
18cb0 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
18cc0 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
18cd0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
18ce0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
18cf0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
18d00 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
18d10 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
18d20 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
18d30 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
18d40 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
18d50 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
18d60 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
18d70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18d80 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
18d90 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
18da0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
18db0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
18dc0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
18dd0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
18de0 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
18df0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
18e00 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
18e10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18e20 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
18e30 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
18e40 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
18e50 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
18e60 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
18e70 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
18e80 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
18e90 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
18ea0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
18eb0 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
18ec0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
18ed0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
18ee0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
18ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
18f00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18f10 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
18f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
18f30 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
18f40 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
18f50 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
18f60 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
18f70 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
18f80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18f90 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
18fa0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
18fb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18fc0 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
18fd0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
18fe0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74  _READ;.  }..  bt
18ff0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
19000 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
19010 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
19040 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
19050 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
19060 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
19070 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
19080 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
19090 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
190a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
190b0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
190c0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
190d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
190e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
190f0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
19100 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  o(p);.  }.  sqli
19110 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19120 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19130 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
19140 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19150 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
19160 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
19170 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
19180 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
19190 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
191a0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
191b0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
191c0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
191d0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
191e0 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
191f0 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
19200 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
19210 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
19220 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
19230 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
19240 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
19250 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
19260 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
19270 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
19280 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
19290 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
192a0 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
192b0 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
192c0 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
192d0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
192e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
192f0 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
19300 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19310 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
19320 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
19330 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
19340 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
19350 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
19360 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
19370 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
19380 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
19390 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
193a0 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
193b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
193c0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
193d0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
193e0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
193f0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
19400 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
19410 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
19420 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
19430 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
19440 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
19450 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
19460 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
19470 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
19480 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
19490 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
194a0 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
194b0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
194c0 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
194d0 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
194e0 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
194f0 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
19500 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
19510 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
19520 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
19530 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
19540 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
19550 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
19560 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
19570 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
19580 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
19590 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
195a0 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
195b0 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
195c0 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
195d0 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
195e0 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
195f0 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
19600 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
19610 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
19620 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
19630 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
19640 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
19650 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
19660 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
19670 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
19680 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
19690 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
196a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
196b0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
196c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
196d0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
196e0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e  rsor(p);.    p->
196f0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
19700 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b  FAULT;.    p->sk
19710 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
19720 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19730 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
19740 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
19750 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
19760 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61  );.      p->apPa
19770 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
19780 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
19790 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
197a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
197b0 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
197c0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
197d0 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
197e0 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
197f0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
19800 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
19810 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
19820 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
19830 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
19840 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
19850 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
19860 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
19870 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
19880 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
19890 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
198a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
198b0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
198c0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
198d0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
198e0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
198f0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
19900 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
19910 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
19920 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
19930 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19940 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
19950 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
19960 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
19970 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
19980 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
19990 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
199a0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
199b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
199c0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
199d0 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
199e0 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
199f0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
19a00 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  r occurred whils
19a10 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  t.    ** trying 
19a20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70  to save cursor p
19a30 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  ositions. If thi
19a40 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  s is an automati
19a50 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20  c rollback (as. 
19a60 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
19a70 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
19a80 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  , malloc() failu
19a90 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  re or IO error) 
19aa0 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  then .    ** the
19ab0 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e   cache may be in
19ac0 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69  ternally inconsi
19ad0 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61  stent (not conta
19ae0 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20  in valid trees) 
19af0 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  so.    ** we can
19b00 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72  not simply retur
19b10 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74  n the error to t
19b20 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65  he caller. Inste
19b30 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a  ad, abort .    *
19b40 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68  * all queries th
19b50 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20  at may be using 
19b60 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f  any of the curso
19b70 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74  rs that failed t
19b80 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  o save..    */. 
19b90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
19ba0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
19bb0 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   rc);.  }.#endif
19bc0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
19bd0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
19be0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
19bf0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
19c00 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
19c10 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
19c20 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19c30 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
19c40 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
19c50 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
19c60 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
19c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c80 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
19c90 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
19ca0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
19cb0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
19cc0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
19cd0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
19ce0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
19cf0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
19d00 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
19d10 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
19d20 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
19d30 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
19d40 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
19d50 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
19d60 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
19d70 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
19d80 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
19d90 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
19da0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
19db0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
19dc0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
19dd0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
19de0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
19df0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
19e00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19e10 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
19e20 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
19e30 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
19e40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
19e50 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
19e60 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
19e70 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
19e80 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
19e90 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
19ea0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
19eb0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
19ec0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
19ed0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19ee0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
19ef0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
19f00 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
19f10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
19f20 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
19f30 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  can can be rolle
19f40 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
19f50 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
19f60 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
19f70 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
19f80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
19f90 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
19fa0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
19fb0 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
19fc0 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
19fd0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
19fe0 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
19ff0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
1a000 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
1a010 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
1a020 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
1a030 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
1a040 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
1a050 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
1a060 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
1a070 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
1a080 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
1a090 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
1a0a0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
1a0b0 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
1a0c0 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
1a0d0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
1a0e0 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
1a0f0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
1a100 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1a110 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
1a120 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
1a130 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
1a140 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
1a150 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1a160 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
1a170 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
1a180 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
1a190 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
1a1a0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1a1b0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1a1c0 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
1a1d0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
1a1e0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1a1f0 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
1a200 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
1a210 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1a220 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
1a230 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
1a240 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
1a250 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
1a260 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
1a270 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
1a280 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
1a290 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
1a2a0 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
1a2b0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
1a2c0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
1a2d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1a2e0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1a2f0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
1a300 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
1a310 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1a320 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a330 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
1a340 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1a350 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1a360 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a370 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1a380 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
1a390 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1a3a0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
1a3b0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
1a3c0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1a3d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1a3e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1a3f0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1a400 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
1a410 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
1a420 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1a430 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
1a440 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
1a450 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
1a460 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
1a470 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
1a480 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
1a490 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
1a4a0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
1a4b0 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
1a4c0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
1a4d0 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
1a4e0 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
1a4f0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1a500 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
1a510 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
1a520 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1a530 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1a540 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
1a550 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
1a560 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1a570 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a580 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1a590 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1a5a0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
1a5b0 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
1a5c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
1a5d0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
1a5e0 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
1a5f0 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
1a600 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
1a610 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
1a620 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
1a630 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
1a640 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
1a650 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
1a660 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
1a670 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
1a680 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
1a690 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1a6a0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
1a6b0 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
1a6c0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
1a6d0 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
1a6e0 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
1a6f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
1a700 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1a710 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1a720 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
1a730 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
1a740 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
1a750 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
1a760 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
1a770 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
1a780 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
1a790 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1a7a0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
1a7b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a7c0 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
1a7d0 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1a7e0 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
1a7f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a800 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
1a810 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1a820 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1a830 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1a840 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1a850 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
1a860 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
1a870 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1a880 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1a890 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
1a8a0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
1a8b0 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
1a8c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
1a8d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a8e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
1a8f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1a900 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1a910 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
1a920 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
1a930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a940 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
1a950 6f 69 6e 74 3c 30 20 26 26 20 70 42 74 2d 3e 69  oint<0 && pBt->i
1a960 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79 20 29 20  nitiallyEmpty ) 
1a970 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
1a980 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1a990 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1a9a0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1a9b0 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
1a9c0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1a9d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  );.      if( pBt
1a9e0 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->nPage==0 ){.  
1a9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1aa00 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1aa10 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 2a 29 26  >pPager, (int*)&
1aa20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1aa30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1aa40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1aa50 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1aa60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1aa70 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
1aa80 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
1aa90 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
1aaa0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
1aab0 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
1aac0 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
1aad0 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
1aae0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
1aaf0 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
1ab00 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
1ab10 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1ab20 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
1ab30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1ab40 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
1ab50 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
1ab60 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
1ab70 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
1ab80 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
1ab90 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
1aba0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1abb0 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68  If wrFlag==0, th
1abc0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1abd0 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66  n only be used f
1abe0 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49  or reading..** I
1abf0 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65  f wrFlag==1, the
1ac00 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1ac10 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1ac20 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77  ding or for.** w
1ac30 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20  riting if other 
1ac40 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77  conditions for w
1ac50 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20  riting are also 
1ac60 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61  met.  These.** a
1ac70 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  re the condition
1ac80 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d  s that must be m
1ac90 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  et in order for 
1aca0 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65  writing to.** be
1acb0 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20   allowed:.**.** 
1acc0 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  1:  The cursor m
1acd0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  ust have been op
1ace0 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
1acf0 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  ==1.**.** 2:  Ot
1ad00 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1ad10 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
1ad20 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
1ad30 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
1ad40 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
1ad50 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
1ad60 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
1ad70 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
1ad80 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
1ad90 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
1ada0 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
1adb0 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
1adc0 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
1add0 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
1ade0 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
1adf0 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
1ae00 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
1ae10 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
1ae20 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1ae30 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
1ae40 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
1ae50 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
1ae60 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
1ae70 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
1ae80 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
1ae90 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
1aea0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  saction..**.** N
1aeb0 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  o checking is do
1aec0 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
1aed0 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65  that page iTable
1aee0 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a   really is the.*
1aef0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  * root page of a
1af00 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20   b-tree.  If it 
1af10 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  is not, then the
1af20 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64   cursor acquired
1af30 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  .** will not wor
1af40 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a  k correctly..**.
1af50 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
1af60 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
1af70 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f  3BtreeCursorZero
1af80 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  () has been call
1af90 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f  ed.** on pCur to
1afa0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
1afb0 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69  memory space pri
1afc0 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
1afd0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1afe0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
1aff0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
1b000 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b020 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1b030 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1b060 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1b070 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1b080 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0a0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1b0b0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1b0c0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1b0d0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1b0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1b0f0 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61  rst arg to compa
1b100 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a  rison function *
1b110 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1b120 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1b130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
1b140 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73  ace for new curs
1b150 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  or */.){.  BtSha
1b160 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1b170 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1b180 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72    /* Shared b-tr
1b190 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20  ee handle */..  
1b1a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1b1b0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1b1c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
1b1d0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1b1e0 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ag==1 );..  /* T
1b1f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1b200 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
1b210 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
1b220 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
1b230 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
1b240 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
1b250 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
1b260 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
1b270 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
1b280 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
1b290 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
1b2a0 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
1b2b0 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
1b2c0 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
1b2d0 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
1b2e0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
1b2f0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1b300 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
1b310 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20  o!=0, wrFlag+1) 
1b320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1b330 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
1b340 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
1b350 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
1b360 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
1b370 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
1b380 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
1b390 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
1b3a0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1b3b0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
1b3c0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1b3d0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
1b3e0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1b3f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1b400 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
1b410 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
1b420 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1b430 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72  wrFlag && pBt->r
1b440 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
1b450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
1b460 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
1b470 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
1b480 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1b490 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  t)==0 ){.    ret
1b4a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  urn SQLITE_EMPTY
1b4b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
1b4c0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
1b4d0 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
1b4e0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
1b4f0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
1b500 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
1b510 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
1b520 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
1b530 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
1b540 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
1b550 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
1b560 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
1b570 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
1b580 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1b590 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
1b5a0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
1b5b0 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
1b5c0 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c  rFlag = (u8)wrFl
1b5d0 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
1b5e0 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
1b5f0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
1b600 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
1b610 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1b620 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
1b630 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
1b640 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
1b650 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1b660 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64  ;.  pCur->cached
1b670 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74  Rowid = 0;.  ret
1b680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b690 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b6a0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1b6b0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1b6e0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1b6f0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b710 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1b720 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1b730 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1b740 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1b770 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1b780 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1b790 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1b7c0 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
1b7d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1b800 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
1b810 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1b820 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1b830 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1b840 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
1b850 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
1b860 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
1b870 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
1b880 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1b890 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b8a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1b8b0 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
1b8c0 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
1b8d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
1b8e0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
1b8f0 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
1b900 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
1b910 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
1b920 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
1b930 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
1b940 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
1b950 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
1b960 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
1b970 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
1b980 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
1b990 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
1b9a0 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
1b9b0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
1b9c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1b9d0 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
1b9e0 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69  return ROUND8(si
1b9f0 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b  zeof(BtCursor));
1ba00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1ba10 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  lize memory that
1ba20 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
1ba30 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73  ed into a BtCurs
1ba40 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  or object..**.**
1ba50 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72   The simple appr
1ba60 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20  oach here would 
1ba70 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74  be to memset() t
1ba80 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74  he entire object
1ba90 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75  .** to zero.  Bu
1baa0 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74  t it turns out t
1bab0 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d  hat the apPage[]
1bac0 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72   and aiIdx[] arr
1bad0 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65  ays.** do not ne
1bae0 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20  ed to be zeroed 
1baf0 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72  and they are lar
1bb00 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61  ge, so we can sa
1bb10 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72  ve a lot.** of r
1bb20 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70  un-time by skipp
1bb30 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
1bb40 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20  zation of those 
1bb50 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  elements..*/.voi
1bb60 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
1bb70 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f  rsorZero(BtCurso
1bb80 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  r *p){.  memset(
1bb90 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42  p, 0, offsetof(B
1bba0 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29  tCursor, iPage))
1bbb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1bbc0 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1bbd0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63  value of every c
1bbe0 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d  ursor in the sam
1bbf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1bc00 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68  ** as pCur and h
1bc10 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72  aving the same r
1bc20 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
1bc30 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61  as pCur.  The va
1bc40 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
1bc50 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f   iRowid..**.** O
1bc60 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77  nly positive row
1bc70 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  id values are co
1bc80 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66  nsidered valid f
1bc90 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a  or this cache..*
1bca0 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69  * The cache is i
1bcb0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
1bcc0 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  ro, indicating a
1bcd0 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e  n invalid cache.
1bce0 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c  .** A btree will
1bcf0 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20   work fine with 
1bd00 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1bd10 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73   rowids.  We jus
1bd20 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68  t cannot.** cach
1bd30 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  e zero or negati
1bd40 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68  ve rowids, which
1bd50 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68   means tables th
1bd60 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a  at use zero or.*
1bd70 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  * negative rowid
1bd80 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
1bd90 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75  ttle slower.  Bu
1bda0 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a  t in practice, z
1bdb0 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69  ero.** or negati
1bdc0 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65  ve rowids are ve
1bdd0 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74  ry uncommon so t
1bde0 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  his should not b
1bdf0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
1be00 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1be10 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eSetCachedRowid(
1be20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1be30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
1be40 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f  owid){.  BtCurso
1be50 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43  r *p;.  for(p=pC
1be60 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ur->pBt->pCursor
1be70 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1be80 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1be90 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e  oRoot==pCur->pgn
1bea0 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65  oRoot ) p->cache
1beb0 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  dRowid = iRowid;
1bec0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1bed0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1bee0 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f  ==iRowid );.}../
1bef0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1bf00 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72  cached rowid for
1bf10 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
1bf20 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f  r.  A negative o
1bf30 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e  r zero.** return
1bf40 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1bf50 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
1bf60 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64  cache is invalid
1bf70 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a   and should be.*
1bf80 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74  * ignored.  If t
1bf90 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68  he rowid cache h
1bfa0 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
1bfb0 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61  been set, then a
1bfc0 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75  .** zero is retu
1bfd0 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rned..*/.sqlite3
1bfe0 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
1bff0 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69  reeGetCachedRowi
1c000 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1c010 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1c020 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d  ->cachedRowid;.}
1c030 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1c040 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
1c050 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1c060 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
1c070 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
1c080 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
1c090 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
1c0a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
1c0b0 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
1c0c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
1c0d0 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
1c0e0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
1c0f0 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
1c100 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
1c110 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1c120 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1c130 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1c140 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
1c150 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1c160 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
1c170 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
1c180 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
1c190 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
1c1a0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
1c1b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
1c1c0 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
1c1d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1c1e0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1c1f0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
1c200 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
1c210 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
1c220 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
1c230 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1c240 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1c250 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1c260 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
1c270 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1c280 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
1c290 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1c2a0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
1c2b0 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
1c2c0 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
1c2d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c2e0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
1c2f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1c310 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
1c320 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
1c330 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
1c340 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
1c350 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
1c360 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
1c370 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
1c380 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
1c390 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
1c3a0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
1c3b0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
1c3c0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
1c3d0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
1c3e0 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
1c3f0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
1c400 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
1c410 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
1c420 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
1c430 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
1c440 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
1c450 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
1c460 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
1c470 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
1c480 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
1c490 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
1c4a0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
1c4b0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
1c4c0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1c4d0 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
1c4e0 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
1c4f0 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
1c500 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
1c510 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
1c520 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
1c530 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
1c540 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
1c550 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
1c560 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
1c570 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
1c580 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
1c590 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
1c5a0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
1c5b0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
1c5c0 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
1c5d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1c5e0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
1c5f0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1c600 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1c610 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
1c620 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
1c630 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1c640 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
1c650 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
1c660 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
1c670 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1c680 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
1c690 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1c6a0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
1c6b0 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
1c6c0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
1c6d0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
1c6e0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
1c6f0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
1c700 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
1c710 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
1c720 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
1c730 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
1c740 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
1c750 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
1c760 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
1c770 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
1c780 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1c790 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
1c7a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1c7b0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1c7c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1c7d0 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
1c7e0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1c7f0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1c800 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1c810 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1c820 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1c830 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
1c840 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1c850 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1c860 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
1c870 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
1c880 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
1c890 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
1c8a0 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
1c8b0 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
1c8c0 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
1c8d0 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
1c8e0 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
1c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
1c930 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c970 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
1c980 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72    \.    btreePar
1c9d0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1c9e0 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1c9f0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1ca00 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20  Cur->info); \.  
1ca10 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1ca20 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  y = 1;          
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ca60 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
1ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1cab0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1cac0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1cb00 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
1cb10 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e  MSC_VER */..#ifn
1cb20 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
1cb30 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
1cb40 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1cb50 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1cb60 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
1cb70 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1cb80 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
1cb90 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
1cba0 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
1cbb0 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
1cbc0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
1cbd0 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
1cbe0 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
1cbf0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
1cc00 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
1cc10 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
1cc20 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1cc30 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
1cc40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1cc50 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
1cc60 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1cc70 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
1cc80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1cc90 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
1cca0 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
1ccb0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1ccc0 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
1ccd0 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
1cce0 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
1ccf0 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
1cd00 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
1cd10 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
1cd20 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1cd30 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
1cd40 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
1cd50 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
1cd60 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
1cd70 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
1cd80 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
1cd90 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1cda0 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
1cdb0 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
1cdc0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1cdd0 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  n the key..**.**
1cde0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1cdf0 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   position the cu
1ce00 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e  rsor prior to in
1ce10 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
1ce20 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ine..** .** This
1ce30 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
1ce40 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73  fail.  It always
1ce50 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1ce60 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OK.  .*/.int sql
1ce70 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1ce80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1ce90 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1cea0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ceb0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1cec0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1ced0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1cee0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
1cef0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1cf00 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
1cf10 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1cf20 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
1cf30 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
1cf40 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65  }else{.    getCe
1cf50 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1cf60 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1cf70 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
1cf80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1cf90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
1cfa0 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
1cfb0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1cfc0 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
1cfd0 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
1cfe0 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
1cff0 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ts to..**.** The
1d000 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
1d010 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
1d020 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1d030 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
1d040 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
1d050 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1d060 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
1d070 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
1d080 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
1d090 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
1d0a0 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
1d0b0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
1d0c0 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
1d0d0 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20  possible.  This 
1d0e0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
1d0f0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1d100 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a  K..** It might j
1d110 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61  ust as well be a
1d120 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75   procedure (retu
1d130 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20  rning void) but 
1d140 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74  we continue.** t
1d150 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  o return an inte
1d160 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ger result code 
1d170 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
1d180 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  easons..*/.int s
1d190 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
1d1a0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1d1b0 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
1d1c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d1d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d1e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1d1f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1d200 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
1d210 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1d220 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
1d230 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
1d240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d250 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  K;.}../*.** Give
1d260 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1d270 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
1d280 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
1d290 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
1d2a0 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
1d2b0 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
1d2c0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1d2d0 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
1d2e0 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
1d2f0 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
1d300 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
1d310 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
1d320 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
1d330 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
1d340 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
1d350 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
1d360 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
1d370 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
1d380 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1d390 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
1d3a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1d3b0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
1d3c0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
1d3d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1d3e0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1d3f0 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
1d400 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
1d410 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
1d420 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
1d430 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1d440 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
1d450 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
1d460 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
1d470 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
1d480 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
1d490 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
1d4a0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
1d4b0 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
1d4c0 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
1d4d0 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
1d4e0 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
1d4f0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1d500 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
1d510 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
1d520 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
1d530 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
1d540 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
1d550 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
1d560 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
1d570 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
1d580 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
1d590 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
1d5a0 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
1d5b0 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
1d5c0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
1d5d0 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
1d5e0 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
1d5f0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1d600 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
1d610 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
1d620 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1d630 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1d640 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1d650 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
1d660 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
1d670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1d680 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
1d690 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
1d6a0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1d6b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1d6c0 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
1d6d0 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
1d6e0 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
1d6f0 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
1d700 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
1d710 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1d720 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
1d730 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
1d740 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1d750 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
1d760 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1d770 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1d780 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1d790 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
1d7a0 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
1d7b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d7c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
1d7d0 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
1d7e0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1d7f0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
1d800 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
1d810 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
1d820 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
1d830 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
1d840 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
1d850 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
1d860 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
1d870 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
1d880 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
1d890 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
1d8a0 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
1d8b0 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
1d8c0 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
1d8d0 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
1d8e0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
1d8f0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
1d900 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
1d910 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1d920 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
1d930 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
1d940 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
1d950 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
1d960 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1d970 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
1d980 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
1d990 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1d9a0 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
1d9b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
1d9c0 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65  Guess<=btreePage
1d9d0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
1d9e0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1d9f0 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
1da00 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
1da10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1da20 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
1da30 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1da40 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
1da50 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
1da60 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
1da70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1da80 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
1da90 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1daa0 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
1dab0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
1dac0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
1dad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dae0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1daf0 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
1db00 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61  pPage, 0);.    a
1db10 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1db20 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
1db30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1db40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1db50 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
1db60 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1db70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
1db80 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
1db90 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
1dba0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
1dbb0 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
1dbc0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1dbd0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
1dbe0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
1dbf0 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
1dc00 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
1dc10 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1dc20 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
1dc30 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
1dc40 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
1dc50 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
1dc60 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1dc70 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
1dc80 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1dc90 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
1dca0 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
1dcb0 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
1dcc0 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
1dcd0 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
1dce0 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
1dcf0 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
1dd00 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
1dd10 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
1dd20 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1dd30 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1dd40 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
1dd50 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
1dd60 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1dd70 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1dd80 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
1dd90 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
1dda0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
1ddb0 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
1ddc0 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
1ddd0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
1dde0 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
1ddf0 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
1de00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1de10 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
1de20 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
1de30 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1de40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1de50 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
1de60 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
1de70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1de80 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
1de90 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
1dec0 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
1ded0 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
1dee0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
1def0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1df00 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
1df10 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
1df20 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
1df30 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
1df40 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
1df50 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
1df60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
1df70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1df80 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
1df90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1dfa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1dfb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1dfc0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
1dfd0 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
1dfe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1dff0 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
1e000 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
1e010 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
1e020 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
1e030 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
1e040 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
1e050 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e060 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e070 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1e080 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
1e090 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
1e0a0 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
1e0b0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
1e0c0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1e0d0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20  pointing to. If 
1e0e0 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d  the eOp.** param
1e0f0 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20  eter is 0, this 
1e100 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
1e110 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64  ion (data copied
1e120 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20   into.** buffer 
1e130 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20  pBuf). If it is 
1e140 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74  non-zero, a writ
1e150 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66  e (data copied f
1e160 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  rom.** buffer pB
1e170 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  uf)..**.** A tot
1e180 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
1e190 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
1e1a0 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
1e1b0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
1e1c0 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
1e1d0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
1e1e0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
1e1f0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
1e200 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1e210 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
1e220 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
1e230 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
1e240 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
1e250 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1e260 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
1e270 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c  tCursor.isIncrbl
1e280 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
1e290 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75   set, and the cu
1e2a0 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20  rrent.** cursor 
1e2b0 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
1e2c0 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
1e2d0 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63  pages, this func
1e2e0 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  tion.** allocate
1e2f0 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  s space for and 
1e300 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73  lazily popluates
1e310 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1e320 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68  ge-list .** cach
1e330 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
1e340 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75  r.aOverflow). Su
1e350 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
1e360 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65  se this.** cache
1e370 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
1e380 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
1e390 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66   offset more eff
1e3a0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
1e3b0 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
1e3c0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
1e3d0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
1e3e0 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
1e3f0 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
1e400 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
1e410 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
1e420 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
1e430 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
1e440 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
1e450 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
1e460 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
1e470 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
1e480 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
1e490 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
1e4a0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
1e4b0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1e4c0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
1e4d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1e4e0 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
1e4f0 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
1e500 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
1e510 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
1e520 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
1e530 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
1e540 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
1e550 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
1e560 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
1e570 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1e580 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1e590 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1e5a0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1e5b0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
1e5c0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
1e5d0 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
1e5e0 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
1e5f0 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
1e600 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
1e610 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
1e620 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1e630 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
1e640 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
1e650 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
1e660 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
1e670 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
1e680 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
1e690 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
1e6a0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1e6b0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
1e6c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e6d0 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
1e6e0 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
1e6f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1e700 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1e710 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
1e720 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
1e730 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
1e740 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1e750 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e770 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
1e780 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
1e790 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e7a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1e7b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e7c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1e7d0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1e7e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1e7f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1e800 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e810 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e820 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
1e830 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
1e840 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1e850 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
1e860 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
1e870 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
1e880 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
1e890 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
1e8a0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f  ;..  if( NEVER(o
1e8b0 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
1e8c0 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
1e8d0 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c  a) .   || &aPayl
1e8e0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
1e8f0 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
1e900 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
1e910 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20  leSize].  ){.   
1e920 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
1e930 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
1e940 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1e950 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
1e960 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1e970 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e980 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
1e990 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
1e9a0 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
1e9b0 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
1e9c0 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
1e9d0 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1e9e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1e9f0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
1ea00 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
1ea10 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
1ea20 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1ea30 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
1ea40 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
1ea50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1ea60 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1ea70 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
1ea80 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
1ea90 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1eaa0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1eab0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
1eac0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
1ead0 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
1eae0 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
1eaf0 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
1eb00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1eb10 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
1eb20 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
1eb30 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
1eb40 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
1eb50 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
1eb60 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
1eb70 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
1eb80 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
1eb90 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
1eba0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1ebb0 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
1ebc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1ebd0 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
1ebe0 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
1ebf0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
1ec00 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
1ec10 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
1ec20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
1ec30 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
1ec40 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
1ec50 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
1ec60 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
1ec70 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
1ec80 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1ec90 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
1eca0 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
1ecb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1ecc0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
1ecd0 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1ece0 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
1ecf0 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
1ed00 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
1ed10 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
1ed20 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
1ed30 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
1ed40 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
1ed50 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
1ed60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1ed70 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
1ed80 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
1ed90 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
1eda0 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
1edb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
1edc0 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
1edd0 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
1ede0 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
1edf0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1ee00 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
1ee10 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
1ee20 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
1ee30 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c  ;.      /* nOvfl
1ee40 20 69 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74   is always posit
1ee50 69 76 65 2e 20 20 49 66 20 69 74 20 77 65 72 65  ive.  If it were
1ee60 20 7a 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c   zero, fetchPayl
1ee70 6f 61 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20  oad would have. 
1ee80 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65       ** been use
1ee90 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69  d instead of thi
1eea0 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20  s routine. */.  
1eeb0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e      if( ALWAYS(n
1eec0 4f 76 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e  Ovfl) && !pCur->
1eed0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1eee0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1eef0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1ef00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1ef10 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1ef20 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
1ef30 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1ef40 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
1ef50 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1ef60 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
1ef70 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
1ef80 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
1ef90 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
1efa0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1efb0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1efc0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
1efd0 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
1efe0 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
1eff0 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
1f000 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
1f010 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
1f020 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
1f030 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
1f040 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
1f050 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1f060 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
1f070 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1f080 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
1f090 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
1f0a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1f0b0 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
1f0c0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
1f0d0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
1f0e0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1f0f0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
1f100 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1f110 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1f120 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
1f130 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
1f140 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1f150 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
1f160 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
1f170 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
1f180 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
1f190 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
1f1a0 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
1f1b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
1f1c0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
1f1d0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
1f1e0 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
1f1f0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1f200 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
1f210 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1f220 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
1f230 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
1f240 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
1f250 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
1f260 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
1f270 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
1f280 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
1f290 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
1f2a0 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
1f2b0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
1f2c0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
1f2d0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
1f2e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
1f2f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f300 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
1f310 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1f320 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
1f330 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
1f340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
1f350 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
1f360 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
1f370 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
1f380 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
1f390 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
1f3a0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
1f3b0 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
1f3c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
1f3d0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
1f3e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f3f0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
1f400 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
1f410 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
1f420 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
1f430 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
1f440 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
1f450 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
1f460 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
1f470 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
1f480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1f490 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
1f4a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
1f4b0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63   amt;.        rc
1f4c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1f4d0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
1f4e0 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
1f4f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1f500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f510 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79  {.          aPay
1f520 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
1f530 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
1f540 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ge);.          n
1f550 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1f560 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
1f570 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
1f580 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
1f590 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1f5a0 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
1f5b0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
1f5c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1f5d0 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
1f5e0 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
1f5f0 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
1f600 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
1f610 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f620 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
1f630 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73  ;.          offs
1f640 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
1f650 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
1f660 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
1f670 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f680 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1f690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f6a0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1f6b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f6c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f6d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1f6e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
1f6f0 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
1f700 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
1f710 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
1f720 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
1f730 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
1f740 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
1f750 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
1f760 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
1f770 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fset"..**.** The
1f780 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
1f790 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ure that pCur is
1f7a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
1f7b0 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74  alid row.** in t
1f7c0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1f7d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1f7e0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
1f7f0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1f800 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1f810 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
1f820 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
1f830 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
1f840 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
1f850 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
1f860 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
1f870 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
1f880 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1f890 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1f8a0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1f8b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1f8c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1f8d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f8e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f8f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1f900 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1f910 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
1f920 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f930 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
1f940 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f950 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
1f960 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f970 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
1f980 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
1f990 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
1f9a0 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
1f9b0 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
1f9c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1f9d0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1f9e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1f9f0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1fa00 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1fa10 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1fa20 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1fa30 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1fa40 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1fa50 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1fa60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1fa70 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1fa80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1fa90 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1faa0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1fab0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1fac0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1fad0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1fae0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1faf0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1fb00 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1fb10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1fb20 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1fb30 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1fb40 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1fb50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1fb60 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1fb70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1fb80 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1fb90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fba0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1fbb0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1fbc0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1fbd0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1fbe0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1fbf0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1fc00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fc10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1fc20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1fc30 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1fc40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1fc50 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1fc60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1fc70 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1fc80 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1fc90 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1fca0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1fcb0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1fcc0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1fcd0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1fce0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1fcf0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1fd00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1fd10 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1fd20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
1fd30 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
1fd40 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
1fd50 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
1fd60 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
1fd70 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
1fd80 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1fd90 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
1fda0 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
1fdb0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1fdc0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
1fdd0 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
1fde0 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
1fdf0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
1fe00 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
1fe10 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
1fe20 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
1fe30 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
1fe40 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1fe50 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
1fe60 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
1fe70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1fe80 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
1fe90 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
1fea0 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
1feb0 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
1fec0 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
1fed0 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
1fee0 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
1fef0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
1ff00 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
1ff10 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
1ff20 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
1ff30 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
1ff40 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
1ff50 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
1ff60 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
1ff70 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
1ff80 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
1ff90 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1ffa0 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
1ffb0 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
1ffc0 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
1ffd0 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
1ffe0 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
1fff0 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
20000 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
20010 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
20020 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
20030 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
20040 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
20050 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
20060 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
20070 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
20080 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
20090 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
200a0 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
200b0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
200c0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
200d0 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
200e0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
200f0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
20100 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
20110 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
20120 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
20130 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
20140 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
20150 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
20160 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
20170 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
20180 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
20190 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
201a0 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
201b0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
201c0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
201d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
201e0 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33    u32 nKey;.  u3
201f0 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  2 nLocal;..  ass
20200 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
20210 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
20220 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
20230 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
20240 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20250 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20260 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
20270 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20280 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67  (pCur) );.  pPag
20290 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
202a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
202b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
202c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
202d0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
202e0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
202f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
20300 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  0) ){.    btreeP
20310 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
20320 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20330 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
20340 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20360 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
20370 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20   }.  aPayload = 
20380 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
20390 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20  ;.  aPayload += 
203a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
203b0 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
203c0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
203d0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
203e0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e  {.    nKey = (in
203f0 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
20400 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69  y;.  }.  if( ski
20410 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79  pKey ){.    aPay
20420 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
20430 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
20440 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e  >info.nLocal - n
20450 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Key;.  }else{.  
20460 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d    nLocal = pCur-
20470 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
20480 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c    assert( nLocal
20490 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20  <=nKey );.  }.  
204a0 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a  *pAmt = nLocal;.
204b0 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61    return aPayloa
204c0 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  d;.}.../*.** For
204d0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
204e0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70  cursor pCur is p
204f0 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20  oint to, return 
20500 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73  as.** many bytes
20510 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64   of the key or d
20520 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c  ata as are avail
20530 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  able on the loca
20540 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65  l.** b-tree page
20550 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  .  Write the num
20560 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
20570 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d   bytes into *pAm
20580 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  t..**.** The poi
20590 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  nter returned is
205a0 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65   ephemeral.  The
205b0 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f   key/data may mo
205c0 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74  ve.** or be dest
205d0 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78  royed on the nex
205e0 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74  t call to any Bt
205f0 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20  ree routine,.** 
20600 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20  including calls 
20610 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61  from other threa
20620 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73  ds against the s
20630 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65  ame cache..** He
20640 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20  nce, a mutex on 
20650 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f  the BtShared sho
20660 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f  uld be held prio
20670 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  r to calling.** 
20680 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
20690 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
206a0 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  es is used to ge
206b0 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74  t quick access t
206c0 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a  o key and data.*
206d0 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  * in the common 
206e0 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76  case where no ov
206f0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
20700 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   used..*/.const 
20710 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
20720 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72  eeKeyFetch(BtCur
20730 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
20740 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76  pAmt){.  const v
20750 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73  oid *p = 0;.  as
20760 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20770 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
20780 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
20790 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
207a0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
207b0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41  pCur) );.  if( A
207c0 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61  LWAYS(pCur->eSta
207d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
207e0 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f  ) ){.    p = (co
207f0 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
20800 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
20810 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
20820 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn p;.}.const v
20830 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
20840 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
20850 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
20860 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76  pAmt){.  const v
20870 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73  oid *p = 0;.  as
20880 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20890 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
208a0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
208b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
208c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
208d0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41  pCur) );.  if( A
208e0 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61  LWAYS(pCur->eSta
208f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20900 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f  ) ){.    p = (co
20910 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
20920 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
20930 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 1);.  }.  ret
20940 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn p;.}.../*.**
20950 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
20960 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
20970 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
20980 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
20990 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
209a0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
209b0 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
209c0 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
209d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
209e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
209f0 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
20a00 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
20a10 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
20a20 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
20a30 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
20a40 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
20a50 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
20a60 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
20a70 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
20a80 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
20a90 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
20aa0 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
20ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20ac0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
20ad0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
20ae0 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
20af0 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
20b00 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
20b10 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
20b20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20b30 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
20b40 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20b50 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20b70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20b80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
20b90 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
20ba0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
20bb0 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  TH );.  if( pCur
20bc0 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
20bd0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
20be0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20bf0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20c00 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
20c10 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
20c20 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
20c30 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
20c40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
20c50 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d  Cur->apPage[i+1]
20c60 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
20c70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20  Cur->aiIdx[i+1] 
20c80 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
20c90 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ge++;..  pCur->i
20ca0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
20cb0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
20cc0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
20cd0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  Page->nCell<1 ||
20ce0 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65   pNewPage->intKe
20cf0 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  y!=pCur->apPage[
20d00 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  i]->intKey ){.  
20d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20d20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20d30 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
20d40 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
20d50 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61   NDEBUG./*.** Pa
20d60 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
20d70 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
20d80 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
20d90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
20da0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
20db0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
20dc0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
20dd0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
20de0 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
20df0 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
20e00 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
20e10 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
20e20 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
20e30 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
20e40 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
20e50 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
20e60 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
20e70 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
20e80 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
20e90 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
20ea0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
20eb0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
20ec0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
20ed0 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
20ee0 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
20ef0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
20f00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
20f10 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
20f20 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
20f30 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
20f40 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
20f50 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
20f60 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
20f70 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
20f80 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
20f90 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
20fa0 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
20fb0 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
20fc0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
20fd0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
20fe0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
20ff0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
21000 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
21010 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
21020 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
21030 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
21040 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
21050 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
21060 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
21070 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
21080 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
21090 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
210a0 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
210b0 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
210c0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
210d0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
210e0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
210f0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
21100 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21110 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21120 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21130 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21140 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
21150 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
21160 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21170 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21180 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
21190 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
211a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
211b0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
211c0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
211d0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
211e0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
211f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
21200 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61  gno.  );.  relea
21210 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
21220 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21230 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
21240 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  --;.  pCur->info
21250 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
21260 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
21270 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
21280 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
21290 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74  oint to the root
212a0 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74   page of its b-t
212b0 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ree structure..*
212c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c  *.** If the tabl
212d0 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20  e has a virtual 
212e0 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
212f0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
21300 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20  ved to point.** 
21310 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  to the virtual r
21320 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64  oot page instead
21330 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72   of the actual r
21340 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c  oot page. A tabl
21350 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75  e has a.** virtu
21360 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65  al root page whe
21370 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  n the actual roo
21380 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  t page contains 
21390 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a  no cells and a .
213a0 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20  ** single child 
213b0 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  page. This can o
213c0 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20  nly happen with 
213d0 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
213e0 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a   at page 1..**.*
213f0 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  * If the b-tree 
21400 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70  structure is emp
21410 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73  ty, the cursor s
21420 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a  tate is set to .
21430 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ** CURSOR_INVALI
21440 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  D. Otherwise, th
21450 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20  e cursor is set 
21460 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
21470 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f  first.** cell lo
21480 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f  cated on the roo
21490 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f  t (or virtual ro
214a0 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65  ot) page and the
214b0 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a   cursor state.**
214c0 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
214d0 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49  R_VALID..**.** I
214e0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
214f0 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
21500 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20  ully, it may be 
21510 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
21520 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20  .** page-header 
21530 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74  flags indicate t
21540 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c  hat the [virtual
21550 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74  ] root-page is t
21560 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
21570 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70  kind of b-tree p
21580 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65  age (i.e. if whe
21590 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75  n opening the cu
215a0 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20  rsor the caller 
215b0 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69  did not.** speci
215c0 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  fy a KeyInfo str
215d0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
215e0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
215f0 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a  0x05 or 0x0D,.**
21600 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61   indicating a ta
21610 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69  ble b-tree, or i
21620 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  f the caller did
21630 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
21640 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
21650 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
21660 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f  is set to 0x02 o
21670 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69  r 0x0A, indicati
21680 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62  ng an index.** b
21690 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  -tree)..*/.stati
216a0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
216b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
216c0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
216d0 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
216e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65  QLITE_OK;.  Btre
216f0 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
21700 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
21710 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
21720 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21730 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
21750 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
21760 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
21770 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
21780 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
21790 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
217a0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
217b0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
217c0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
217d0 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
217e0 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
217f0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
21800 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
21810 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
21820 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
21830 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
21840 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
21850 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
21860 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
21870 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
21880 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
21890 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
218a0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
218b0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
218c0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
218d0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
218e0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
218f0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
21900 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
21910 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
21920 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
21930 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
21940 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
21950 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
21960 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69  pPage[0]);.    i
21970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21980 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
21990 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
219a0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
219b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
219c0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
219d0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
219e0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
219f0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
21a00 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
21a10 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
21a20 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63  sor.    ** expec
21a30 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
21a40 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
21a50 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
21a60 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20   pKeyInfo is.   
21a70 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
21a80 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
21a90 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
21aa0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
21ab0 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74  case,.    ** ret
21ac0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
21ad0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f  RRUPT error.  */
21ae0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21af0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
21b00 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d  tKey==1 || pCur-
21b10 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
21b20 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ey==0 );.    if(
21b30 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
21b40 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61  ==0)!=pCur->apPa
21b50 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
21b60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21b70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21b80 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
21b90 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
21ba0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
21bb0 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  of the correct t
21bc0 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62  ype. This must b
21bd0 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20  e the.  ** case 
21be0 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74  as the call to t
21bf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  his function tha
21c00 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f  t loaded the roo
21c10 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a 20  t-page (either. 
21c20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72   ** this call or
21c30 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f   a previous invo
21c40 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61  cation) would ha
21c50 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
21c60 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20  uption .  ** if 
21c70 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77  the assumption w
21c80 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
21c90 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
21ca0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61  ible for the fla
21cb0 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f  gs .  ** byte to
21cc0 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
21cd0 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 63  ied while this c
21ce0 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67  ursor is holding
21cf0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a   a reference.  *
21d00 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20  * to the page.  
21d10 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  */.  pRoot = pCu
21d20 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
21d30 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
21d40 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
21d50 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oot );.  assert(
21d60 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26   pRoot->isInit &
21d70 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  & (pCur->pKeyInf
21d80 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)==pRoot->in
21d90 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d  tKey );..  pCur-
21da0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
21db0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
21dc0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
21dd0 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75  tLast = 0;.  pCu
21de0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
21df0 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
21e00 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
21e10 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
21e20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
21e30 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
21e40 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
21e50 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21e60 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
21e70 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
21e80 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->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 65 53 74 61 74 65 20 3d    pCur->eState =
21eb0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
21ec0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
21ed0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
21ee0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
21ef0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
21f00 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ((pRoot->nCell>0
21f10 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
21f20 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
21f30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
21f50 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
21f60 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
21f70 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
21f80 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
21f90 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
21fa0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
21fb0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
21fc0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
21fd0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
21fe0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
21ff0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
22000 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
22010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
22020 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
22030 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
22040 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
22050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22060 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
22070 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
22080 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22090 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
220a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
220b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
220c0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
220d0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
220e0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
220f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
22100 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
22110 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
22120 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
22130 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
22140 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
22150 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
22160 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22170 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
22180 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
22190 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
221a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
221b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
221c0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
221d0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
221e0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
221f0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
22200 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
22210 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
22220 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
22230 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
22240 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
22250 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
22260 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
22270 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
22280 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
22290 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
222a0 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
222b0 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
222c0 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
222d0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
222e0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
222f0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
22300 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
22310 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
22320 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
22330 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
22340 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
22350 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
22360 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
22370 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
22380 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
22390 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
223a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
223b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
223c0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
223d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
223e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
223f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
22400 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
22410 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
22420 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
22430 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
22440 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
22450 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
22460 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
22470 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
22480 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
22490 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
224a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
224b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
224c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
224d0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
224e0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
224f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
22500 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22510 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
22520 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
22530 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
22540 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
22550 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
22560 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22570 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
22580 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
22590 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
225a0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
225b0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
225c0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
225d0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
225e0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
225f0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
22600 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
22610 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
22620 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
22630 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22640 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
22650 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
22660 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
22670 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22680 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22690 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
226a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
226b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
226c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
226d0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
226e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
226f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
22700 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22710 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
22720 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22730 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22740 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
22750 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
22760 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  es = 1;.      rc
22770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
22790 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
227a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
227b0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
227c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
227d0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
227e0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
227f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22800 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
22810 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
22820 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
22830 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
22840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
22850 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
22860 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
22870 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
22880 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
22890 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
228a0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
228b0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
228c0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
228d0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
228e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
228f0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
22900 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
22910 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22920 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
22930 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22940 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
22950 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
22960 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
22970 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
22980 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
22990 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
229a0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
229b0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
229c0 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70  Cur->eState && p
229d0 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23  Cur->atLast ){.#
229e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
229f0 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
22a00 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
22a10 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
22a20 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
22a30 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
22a40 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
22a50 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
22a60 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
22a70 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
22a80 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
22a90 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
22aa0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
22ab0 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
22ac0 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
22ad0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22ae0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
22af0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
22b00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22b10 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
22b20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22b30 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22b40 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
22b50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
22b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22b70 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
22b80 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
22b90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22ba0 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
22bb0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
22bc0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
22bd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22be0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22bf0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
22c00 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
22c10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22c20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22c30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22c40 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
22c50 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
22c60 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
22c70 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
22c80 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
22c90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
22ca0 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  1:0;.    }.  }. 
22cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22cc0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
22cd0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
22ce0 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
22cf0 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
22d00 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
22d10 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
22d20 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
22d30 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
22d40 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
22d50 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
22d60 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
22d70 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
22d80 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
22d90 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
22da0 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
22db0 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
22dc0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
22dd0 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
22de0 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
22df0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
22e00 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
22e10 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
22e20 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
22e30 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
22e40 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
22e50 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
22e60 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
22e70 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
22e80 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
22e90 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
22ea0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
22eb0 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
22ec0 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
22ed0 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
22ee0 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
22ef0 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
22f00 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
22f10 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
22f20 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
22f30 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
22f40 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
22f50 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
22f60 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
22f70 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
22f80 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
22f90 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
22fa0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
22fb0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
22fc0 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
22fd0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
22fe0 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
22ff0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23010 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
23020 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
23030 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
23040 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
23050 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
23060 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
23070 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
23080 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
230a0 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
230b0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
230c0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
230d0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
230e0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
230f0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
23100 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23110 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
23120 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
23130 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
23140 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
23150 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
23160 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
23170 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
23180 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
23190 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
231a0 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
231b0 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
231c0 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
231d0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
231e0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
231f0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
23200 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
23210 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
23220 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
23230 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
23240 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
23250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
23260 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
23270 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
23280 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
23290 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
232a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
232b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
232c0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
232d0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
232e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
232f0 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
23300 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
23310 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
23320 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
23330 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
23340 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
23350 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
23360 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
23370 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
23380 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
23390 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
233a0 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
233b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
233c0 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d  R_VALID && pCur-
233d0 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26  >validNKey .   &
233e0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
233f0 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
23400 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
23410 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
23420 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
23430 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
23440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23450 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
23460 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e  atLast && pCur->
23470 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
23480 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
23490 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
234a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
234b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20    }.  }..  rc = 
234c0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
234d0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
234e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
234f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23500 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23510 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
23520 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23530 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
23540 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
23550 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23560 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
23570 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  l>0 || pCur->eSt
23580 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
23590 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75  LID );.  if( pCu
235a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
235b0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
235c0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
235d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
235e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
235f0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
23600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23610 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
23620 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
23630 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
23640 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
23650 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
23660 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20  , upr;.    Pgno 
23670 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
23680 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
23690 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
236a0 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20  iPage];.    int 
236b0 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  c;..    /* pPage
236c0 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
236d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
236e0 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
236f0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
23700 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
23710 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
23720 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
23730 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
23740 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
23750 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
23760 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
23770 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
23780 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
23790 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
237a0 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
237b0 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
237c0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
237d0 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
237e0 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
237f0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
23800 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
23810 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
23820 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
23830 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
23840 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
23850 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
23860 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
23870 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
23880 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
23890 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
238a0 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
238b0 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
238c0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
238d0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
238e0 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
238f0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
23900 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
23910 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d   (u16)upr;.    }
23920 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
23930 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23940 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70  age] = (u16)((up
23950 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+lwr)/2);.    }
23960 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
23970 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
23980 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23990 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78  iPage]; /* Index
239a0 20 6f 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   of current cell
239b0 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20   in pPage */.   
239c0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
239f0 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
23a00 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
23a10 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
23a20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
23a30 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
23a40 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20  l(pPage, idx) + 
23a50 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
23a60 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
23a70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
23a80 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
23a90 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66  lKey;.        if
23aa0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
23ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
23ac0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  2 dummy;.       
23ad0 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56     pCell += getV
23ae0 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64  arint32(pCell, d
23af0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  ummy);.        }
23b00 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
23b10 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
23b20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
23b30 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
23b40 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
23b50 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
23b60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
23b70 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
23b80 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
23b90 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
23ba0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
23bb0 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e  ert( nCellKey>in
23bc0 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
23bd0 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20    c = +1;.      
23be0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72    }.        pCur
23bf0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
23c00 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
23c10 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
23c20 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
23c30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
23c40 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
23c50 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
23c60 33 32 37 36 38 20 62 79 74 65 73 2e 20 54 68 69  32768 bytes. Thi
23c70 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
23c80 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
23c90 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
23ca0 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
23cb0 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
23cc0 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
23cd0 70 61 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20  page is at most 
23ce0 38 31 39 38 20 62 79 74 65 73 2c 20 77 68 69 63  8198 bytes, whic
23cf0 68 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  h may be stored 
23d00 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
23d10 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
23d20 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
23d30 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
23d40 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
23d50 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
23d60 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
23d70 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
23d80 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
23d90 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
23da0 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
23db0 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
23dc0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
23dd0 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
23de0 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
23df0 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
23e00 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
23e10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
23e20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30   nCell = pCell[0
23e30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ];.        if( !
23e40 28 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26  (nCell & 0x80) &
23e50 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  & nCell<=pPage->
23e60 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
23e70 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
23e80 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
23e90 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
23ea0 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
23eb0 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
23ec0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
23ed0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
23ee0 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
23ef0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
23f00 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
23f10 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
23f20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
23f30 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
23f40 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
23f50 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
23f60 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
23f70 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
23f80 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
23f90 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
23fa0 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
23fb0 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
23fc0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
23fd0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
23fe0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
23ff0 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
24000 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
24010 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
24020 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
24030 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
24040 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
24050 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
24060 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
24070 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
24080 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
24090 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
240a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
240b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
240c0 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
240d0 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
240e0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
240f0 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
24100 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
24110 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
24120 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
24130 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
24140 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
24150 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
24160 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
24170 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
24180 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
24190 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
241a0 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
241b0 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
241c0 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20  e called. */.   
241d0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
241e0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
241f0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
24200 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
24210 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
24220 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ize;.          b
24230 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
24240 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
24250 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
24260 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
24270 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
24280 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
24290 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
242a0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
242b0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ll );.          
242c0 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
242d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
242e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
242f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
24300 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
24310 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24320 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
24330 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
24340 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
24350 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
24360 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
24370 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
24380 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24390 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
243a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
243b0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
243c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
243d0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
243e0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
243f0 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c  are(nCell, pCell
24400 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
24410 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24420 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
24430 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24440 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
24450 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
24460 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
24470 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
24480 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
24490 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
244a0 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a   upr = lwr - 1;.
244b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
244c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
244d0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
244e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
244f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24500 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
24510 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
24520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24530 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
24540 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
24550 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  x+1;.      }else
24560 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20  {.        upr = 
24570 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
24580 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
24590 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
245a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
245b0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
245c0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
245d0 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a  )((lwr+upr)/2);.
245e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
245f0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
24600 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
24610 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
24620 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
24630 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
24640 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
24650 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
24660 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
24670 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
24680 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
24690 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
246a0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
246b0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
246c0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
246d0 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
246e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
246f0 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
24700 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
24710 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24720 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
24730 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
24740 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  l );.      *pRes
24750 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
24760 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24770 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
24780 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nish;.    }.    
24790 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
247a0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
247b0 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  lwr;.    pCur->i
247c0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
247d0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
247e0 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ey = 0;.    rc =
247f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
24800 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
24810 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
24820 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d  veto_finish;.  }
24830 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
24840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24850 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
24860 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
24870 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
24880 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
24890 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
248a0 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
248b0 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
248c0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
248d0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
248e0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
248f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
24900 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
24910 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
24920 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
24930 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
24940 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
24950 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
24960 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
24970 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
24980 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24990 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
249a0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
249b0 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
249c0 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
249d0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
249e0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
249f0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
24a00 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
24a10 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
24a20 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
24a30 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
24a40 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
24a50 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
24a60 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
24a70 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
24a80 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
24a90 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
24aa0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
24ab0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
24ac0 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
24ad0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
24ae0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
24af0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
24b00 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
24b10 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
24b20 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
24b30 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
24b40 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
24b50 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
24b60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24b70 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
24b80 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
24b90 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
24ba0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
24bb0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
24bc0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24bd0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24be0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
24bf0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
24c00 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
24c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
24c20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
24c30 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
24c40 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  );.  if( CURSOR_
24c50 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
24c60 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
24c70 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
24c80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24c90 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
24ca0 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ipNext>0 ){.    
24cb0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
24cc0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
24cd0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
24ce0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
24cf0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
24d00 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
24d10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24d20 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
24d30 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
24d40 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
24d50 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
24d60 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
24d70 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43  ( idx<=pPage->nC
24d80 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
24d90 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
24da0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
24db0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
24dc0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
24dd0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
24de0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
24df0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
24e00 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
24e10 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
24e20 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
24e30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
24e40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
24e50 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
24e60 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
24e70 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
24e80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
24e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
24ea0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
24eb0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
24ec0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
24ed0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
24ee0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
24ef0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
24f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
24f20 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
24f30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
24f40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24f50 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
24f60 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
24f70 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
24f80 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
24f90 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
24fa0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
24fb0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
24fc0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
24fd0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
24fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24ff0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25000 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
25010 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
25020 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
25030 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
25040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25050 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
25060 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
25070 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
25080 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
25090 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
250a0 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
250b0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
250c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
250d0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
250e0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
250f0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
25100 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
25110 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
25120 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
25130 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
25140 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
25150 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
25160 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
25170 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25180 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
25190 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
251a0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
251b0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
251c0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
251d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
251e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
251f0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
25200 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
25210 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25220 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
25230 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
25240 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
25250 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
25260 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
25270 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
25280 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
25290 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
252a0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
252b0 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
252c0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
252d0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
252e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
252f0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
25300 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20  kipNext = 0;..  
25310 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25320 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25330 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
25340 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
25350 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
25360 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
25370 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
25380 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
25390 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
253a0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
253b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
253c0 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
253d0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
253e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
253f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
25400 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
25410 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
25420 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25430 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
25440 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
25450 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
25460 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
25470 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
25480 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
25490 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
254a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
254b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
254c0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
254d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
254e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
254f0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
25500 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20  dNKey = 0;..    
25510 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25520 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
25530 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25540 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25550 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
25560 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
25570 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
25580 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
25590 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
255a0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
255b0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
255c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
255d0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
255e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
255f0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
25600 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
25610 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25620 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
25630 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
25640 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
25650 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
25660 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
25670 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
25680 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
25690 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
256a0 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
256b0 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
256c0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
256d0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
256e0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
256f0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
25700 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
25710 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
25720 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
25730 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
25740 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
25750 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
25760 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
25770 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
25780 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
25790 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
257a0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
257b0 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
257c0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
257d0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
257e0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
257f0 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
25800 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
25810 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
25820 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
25830 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
25840 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
25850 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
25860 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
25870 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
25880 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
25890 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
258a0 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
258b0 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
258c0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
258d0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
258e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
258f0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
25900 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
25910 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
25920 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
25930 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
25940 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
25950 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
25960 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
25970 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
25980 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
25990 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
259a0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
259b0 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
259c0 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
259d0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
259e0 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
259f0 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
25a00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
25a10 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
25a20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
25a30 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
25a40 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
25a50 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
25a60 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
25a70 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
25a80 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
25a90 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
25aa0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
25ab0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
25ac0 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
25ad0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
25ae0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
25af0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
25b00 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
25b10 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
25b20 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
25b30 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
25b40 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
25b50 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
25b60 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25b70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25b80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
25b90 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
25ba0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
25bb0 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
25bc0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
25bd0 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
25be0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
25bf0 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
25c00 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
25c10 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
25c20 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
25c30 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
25c40 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
25c50 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
25c60 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
25c70 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
25c80 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
25c90 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
25ca0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
25cb0 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
25cc0 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
25cd0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
25ce0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
25cf0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
25d00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
25d10 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
25d20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
25d30 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
25d40 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
25d50 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
25d60 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
25d70 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
25d80 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
25d90 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
25da0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
25db0 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
25dc0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
25dd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25de0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
25df0 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
25e00 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
25e10 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
25e20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
25e30 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
25e40 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
25e50 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
25e60 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
25e70 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
25e80 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
25e90 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
25ea0 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
25eb0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
25ec0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
25ed0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
25ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
25ef0 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
25f00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
25f10 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
25f20 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
25f30 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
25f40 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
25f50 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
25f60 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
25f70 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
25f80 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
25f90 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
25fa0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25fb0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
25fc0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
25fd0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
25fe0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
25ff0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
26000 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
26010 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
26020 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
26030 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
26040 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
26050 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
26060 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
26070 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
26080 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
26090 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
260a0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
260b0 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
260c0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
260d0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
260e0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
260f0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
26100 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
26110 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
26120 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
26130 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
26140 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
26150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
26160 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
26170 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
26180 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
26190 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
261a0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
261b0 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
261c0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
261d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
261e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
261f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26200 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
26210 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
26220 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
26230 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
26240 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
26250 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
26260 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
26270 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
26280 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
26290 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
262a0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
262b0 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
262c0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
262d0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
262e0 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
262f0 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
26300 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
26310 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
26320 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
26330 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
26340 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
26350 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
26360 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
26370 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
26380 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
26390 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
263a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
263b0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
263c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
263d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
263e0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
263f0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
26400 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
26410 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
26420 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
26430 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
26440 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
26450 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
26460 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
26470 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
26480 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
26490 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
264a0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
264b0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
264c0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
264d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
264e0 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
264f0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
26500 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
26510 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
26520 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
26530 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
26540 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26550 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
26560 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
26570 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
26580 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26590 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
265a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
265b0 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
265c0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
265d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
265e0 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
265f0 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
26600 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
26610 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
26620 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
26630 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
26640 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
26650 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
26660 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
26670 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
26680 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
26690 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
266a0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
266b0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
266c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
266d0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
266e0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
266f0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
26700 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
26710 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
26720 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
26730 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26740 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
26750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
26760 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
26770 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
26780 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
26790 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
267a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
267b0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
267c0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
267d0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
267e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
267f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26800 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
26810 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
26820 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
26830 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
26840 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
26850 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
26860 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
26870 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
26880 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
26890 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
268a0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
268b0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
268c0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
268d0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
268e0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
268f0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
26900 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
26910 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26920 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
26930 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
26940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
26950 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
26960 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
26970 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
26980 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26990 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
269a0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
269b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
269c0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
269d0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
269e0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
269f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26a10 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
26a20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
26a30 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
26a40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26a50 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26a60 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
26a70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
26a80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26aa0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
26ab0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
26ac0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
26ad0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
26ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26af0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
26b00 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
26b10 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
26b20 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
26b30 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
26b40 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
26b50 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
26b60 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
26b70 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
26b80 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
26b90 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
26ba0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
26bb0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
26bc0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
26bd0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
26be0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
26bf0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
26c00 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
26c10 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
26c20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
26c30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
26c40 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
26c50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26c60 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26c70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26c80 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
26c90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26ca0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
26cc0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
26cd0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
26ce0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
26cf0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
26d00 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
26d10 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
26d20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
26d30 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
26d40 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
26d50 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
26d60 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
26d70 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
26d80 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
26d90 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
26da0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
26db0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
26dc0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
26dd0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
26de0 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
26df0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
26e00 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
26e10 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
26e20 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
26e30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26e40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26e50 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
26e60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
26e70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
26e80 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26e90 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
26ea0 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
26eb0 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
26ec0 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
26ed0 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
26ee0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
26ef0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73  0;.          dis
26f00 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  t = get4byte(&aD
26f10 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
26f20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26f30 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20  dist<0 ) dist = 
26f40 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  -dist;.         
26f50 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
26f60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
26f70 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79   int d2 = get4by
26f80 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
26f90 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
26fa0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30          if( d2<0
26fb0 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20   ) d2 = -d2;.   
26fc0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
26fd0 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
26fe0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
26ff0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
27000 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
27010 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27020 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
27030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
27040 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
27050 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
27060 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
27070 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
27080 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
27090 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
270a0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
270b0 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
270c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
270d0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
270e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
270f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
27100 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
27110 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
27120 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
27130 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
27140 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
27150 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
27160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
27170 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
27180 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
27190 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
271a0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
271b0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
271c0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
271d0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
271e0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
271f0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
27220 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
27230 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
27240 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
27250 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
27260 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
27270 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
27280 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
27290 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
272a0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
272b0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
272c0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  1);.          as
272d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
272e0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
272f0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29  runk->pDbPage) )
27300 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
27310 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
27320 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
27330 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20   *pPgno);.      
27340 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
27350 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
27360 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
27370 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
27380 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27390 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
273a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
273b0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
273c0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
273d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
273e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
27400 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
27410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
27420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27430 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
27440 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
27450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
27460 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
27470 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
27480 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
27490 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
274a0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
274b0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
274c0 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
274d0 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63  e freelist, so c
274e0 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
274f0 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   at the.    ** e
27500 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
27510 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
27520 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
27530 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
27540 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
27550 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27560 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
27570 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
27580 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
27590 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
275a0 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
275b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
275c0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
275d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
275e0 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
275f0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
27600 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
27610 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
27620 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
27630 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
27640 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
27650 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
27660 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
27670 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
27680 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
27690 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
276a0 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
276b0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
276c0 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
276d0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
276e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
276f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
27700 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
27710 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
27720 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
27730 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
27740 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
27750 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
27760 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
27770 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
27780 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
27790 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
277a0 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
277b0 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 20   &pPg, 1);.     
277c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
277d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
277e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
277f0 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
27800 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
27810 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
27820 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
27830 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
27840 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
27850 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ++;.      if( pB
27860 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
27870 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
27880 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b   ){ pBt->nPage++
27890 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
278a0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38  .    put4byte(28
278b0 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61   + (u8*)pBt->pPa
278c0 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  ge1->aData, pBt-
278d0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50  >nPage);.    *pP
278e0 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  gno = pBt->nPage
278f0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  ;..    assert( *
27900 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
27910 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
27920 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
27930 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
27940 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a  no, ppPage, 1);.
27950 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
27960 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
27970 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27980 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
27990 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
279a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
279b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
279c0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
279d0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
279e0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
279f0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
27a00 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
27a10 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
27a20 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
27a30 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
27a40 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
27a50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
27a60 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
27a70 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
27a80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
27a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
27aa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
27ab0 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
27ac0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
27ad0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
27ae0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
27af0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27b00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27b10 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
27b20 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
27b30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
27b40 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
27b50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27b60 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
27b70 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
27b80 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
27b90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27ba0 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
27bb0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
27bc0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
27bd0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
27be0 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
27bf0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
27c00 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
27c10 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
27c20 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
27c30 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
27c40 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
27c50 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
27c60 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
27c70 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
27c80 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
27c90 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
27ca0 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
27cb0 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
27cc0 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
27cd0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
27ce0 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
27cf0 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
27d00 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
27d10 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
27d20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
27d30 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
27d40 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
27d50 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
27d60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
27d70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
27d80 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
27d90 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
27da0 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
27db0 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
27dc0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27de0 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
27df0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
27e00 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
27e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27e20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
27e30 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
27e40 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
27e50 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
27e60 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
27e70 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
27e80 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
27e90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
27ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27eb0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
27ec0 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
27ed0 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
27ee0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f00 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
27f10 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
27f40 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
27f50 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
27f60 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
27f70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
27f80 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
27f90 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
27fa0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
27fb0 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
27fc0 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
27fd0 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
27fe0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
27ff0 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
28000 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
28010 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
28020 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28030 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
28040 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
28050 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
28060 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
28070 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
28080 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
28090 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
280a0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
280b0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
280c0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
280d0 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
280e0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
280f0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
28100 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
28110 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
28120 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
28130 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
28140 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
28150 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
28160 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
28170 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
28180 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
28190 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
281a0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
281b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
281c0 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
281d0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
281e0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
281f0 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
28200 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
28210 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
28220 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
28230 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
28240 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
28250 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
28260 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
28270 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
28280 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
28290 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
282a0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
282b0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
282c0 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
282d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
282e0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
282f0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
28300 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
28310 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
28320 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
28330 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
28340 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
28350 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
28360 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
28370 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
28380 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
28390 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
283a0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
283b0 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
283c0 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
283d0 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
283e0 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
283f0 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
28400 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
28410 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
28420 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
28430 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
28440 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
28450 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
28460 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
28470 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
28480 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
28490 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
284a0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
284b0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
284c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
284d0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
284e0 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
284f0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
28500 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
28510 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
28520 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
28530 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
28540 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28560 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
28570 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
28580 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
28590 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
285a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
285b0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
285c0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
285d0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
285e0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
285f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28600 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
28610 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
28620 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
28630 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
28640 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
28650 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
28660 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
28670 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
28680 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
28690 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
286a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
286b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
286c0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
286d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
286e0 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
286f0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
28700 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
28710 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
28720 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
28730 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
28740 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
28750 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
28760 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
28770 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
28780 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
28790 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
287a0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
287b0 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
287c0 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
287d0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
287e0 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
287f0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
28800 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
28810 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
28820 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
28830 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
28840 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
28850 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
28860 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
28870 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
28880 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
28890 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
288a0 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
288b0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
288c0 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
288d0 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
288e0 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
288f0 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
28900 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
28910 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
28920 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
28930 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
28940 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
28950 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
28960 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
28970 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
28980 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
28990 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
289a0 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
289b0 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
289c0 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
289d0 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
289e0 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
289f0 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
28a00 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
28a10 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
28a20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
28a30 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
28a40 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
28a50 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
28a60 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
28a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28a80 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
28a90 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
28aa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28ab0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
28ac0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
28ad0 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
28ae0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
28af0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
28b00 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
28b10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
28b20 61 67 65 20 26 26 20 21 70 42 74 2d 3e 73 65 63  age && !pBt->sec
28b30 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ureDelete ){.   
28b40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
28b50 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
28b60 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
28b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28b80 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
28b90 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
28ba0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
28bb0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
28bc0 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
28bd0 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
28be0 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
28bf0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
28c00 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
28c10 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
28c20 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
28c30 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
28c40 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
28c50 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
28c60 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
28c70 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
28c80 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
28c90 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
28ca0 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
28cb0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
28cc0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
28cd0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
28ce0 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
28cf0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
28d00 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
28d10 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
28d20 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
28d30 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
28d40 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
28d50 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
28d60 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
28d70 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
28d80 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
28d90 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
28da0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
28db0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
28dc0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
28dd0 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
28de0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
28df0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
28e00 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
28e10 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
28e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28e30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
28e40 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
28e50 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
28e60 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
28e70 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
28e80 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
28e90 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
28ea0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
28eb0 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
28ec0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
28ed0 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
28ee0 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
28ef0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
28f00 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
28f10 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
28f20 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
28f30 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
28f40 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
28f50 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
28f60 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
28f70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
28f80 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
28f90 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
28fa0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
28fb0 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
28fc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
28fd0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
28fe0 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
28ff0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
29000 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
29010 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
29020 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
29030 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
29040 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
29050 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
29060 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
29070 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
29080 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
29090 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
290a0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
290b0 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
290c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
290d0 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f  t nOvfl;.  u16 o
290e0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
290f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29100 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
29110 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
29120 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
29130 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
29140 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
29150 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
29160 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
29170 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
29180 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
29190 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
291a0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
291b0 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
291c0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
291d0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
291e0 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  low]);.  assert(
291f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
29200 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
29210 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
29220 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
29230 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
29240 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
29250 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
29260 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
29270 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
29280 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
29290 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
292a0 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
292b0 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
292c0 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
292d0 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
292e0 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
292f0 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
29300 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
29310 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
29320 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
29330 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
29340 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
29350 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
29360 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
29370 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
29380 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
29390 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
293a0 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
293b0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
293c0 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
293d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
293e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
293f0 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
29400 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
29410 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
29420 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
29430 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
29440 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29450 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
29460 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
29470 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
29480 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
29490 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
294a0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
294b0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
294c0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
294d0 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
294e0 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
294f0 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
29500 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
29510 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
29520 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
29530 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
29540 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
29550 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
29560 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
29570 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
29580 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
29590 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
295a0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
295b0 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
295c0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
295d0 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
295e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
295f0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
29600 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
29610 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
29620 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
29630 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
29640 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
29650 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
29660 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
29670 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
29680 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
29690 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
296a0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
296b0 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
296c0 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
296d0 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
296e0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
296f0 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
29700 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
29710 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
29720 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
29730 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
29740 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
29750 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
29760 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29770 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
29780 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
29790 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
297a0 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
297b0 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
297c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
297d0 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
297e0 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
297f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
29800 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
29810 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
29820 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
29830 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
29840 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
29850 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
29860 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
29870 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
29880 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
29890 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
298a0 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
298b0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
298c0 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
298d0 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
298e0 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
298f0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
29900 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
29910 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
29920 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
29930 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
29940 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
29950 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
29960 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
29970 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
29980 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
29990 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
299a0 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
299b0 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
299c0 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
299d0 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
299e0 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
299f0 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
29a00 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
29a10 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
29a20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
29a30 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
29a40 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
29a50 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
29a60 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
29a70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
29a80 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
29a90 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
29aa0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
29ab0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
29ac0 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
29ad0 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
29ae0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
29af0 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
29b00 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
29b10 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
29b20 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
29b30 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
29b40 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b60 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
29b70 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
29b80 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
29b90 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
29ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
29bb0 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
29bc0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
29bd0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
29be0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
29bf0 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
29c00 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
29c10 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
29c20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
29c30 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
29c40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
29c50 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
29c60 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
29c70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
29c80 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
29c90 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
29ca0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
29cb0 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  er;.  CellInfo i
29cc0 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  nfo;..  assert( 
29cd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29ce0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
29cf0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
29d00 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
29d10 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
29d20 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
29d30 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
29d40 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
29d50 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
29d60 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
29d70 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
29d80 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
29d90 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
29da0 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
29db0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
29dc0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
29dd0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
29de0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
29df0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
29e00 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
29e10 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
29e20 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66  Header = 0;.  if
29e30 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
29e40 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
29e50 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   4;.  }.  if( pP
29e60 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
29e70 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
29e80 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
29e90 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b  nHeader], nData+
29ea0 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  nZero);.  }else{
29eb0 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65  .    nData = nZe
29ec0 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48  ro = 0;.  }.  nH
29ed0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
29ee0 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
29ef0 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
29f00 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
29f10 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
29f20 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
29f30 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61  ssert( info.nHea
29f40 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a  der==nHeader );.
29f50 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
29f60 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61  Key==nKey );.  a
29f70 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74  ssert( info.nDat
29f80 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e  a==(u32)(nData+n
29f90 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a  Zero) );.  .  /*
29fa0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79   Fill in the pay
29fb0 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f  load */.  nPaylo
29fc0 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65  ad = nData + nZe
29fd0 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ro;.  if( pPage-
29fe0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
29ff0 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
2a000 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
2a010 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
2a020 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20  }else{ .    if( 
2a030 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66  NEVER(nKey>0x7ff
2a040 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30  fffff || pKey==0
2a050 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
2a060 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2a070 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2a080 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e   nPayload += (in
2a090 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  t)nKey;.    pSrc
2a0a0 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
2a0b0 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  c = (int)nKey;. 
2a0c0 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69   }.  *pnSize = i
2a0d0 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61  nfo.nSize;.  spa
2a0e0 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c  ceLeft = info.nL
2a0f0 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64  ocal;.  pPayload
2a100 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
2a110 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26  r];.  pPrior = &
2a120 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
2a130 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  flow];..  while(
2a140 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
2a150 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
2a160 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
2a170 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2a180 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
2a190 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
2a1a0 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
2a1b0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
2a1c0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
2a1d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
2a1e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2a1f0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
2a200 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
2a210 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
2a220 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
2a230 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
2a240 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
2a250 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
2a260 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
2a270 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2a280 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2a290 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2a2a0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
2a2b0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
2a2c0 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
2a2d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a2e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2a2f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2a300 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
2a310 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
2a320 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
2a330 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
2a340 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
2a350 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
2a360 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
2a370 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
2a380 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
2a390 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
2a3a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2a3b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
2a3c0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
2a3d0 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
2a3e0 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
2a3f0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
2a400 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
2a410 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
2a420 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
2a430 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
2a440 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
2a450 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
2a460 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
2a470 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
2a480 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
2a490 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
2a4a0 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76   uninitialised v
2a4b0 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
2a4c0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
2a4d0 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
2a4e0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
2a4f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2a500 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2a510 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2a520 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
2a530 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
2a540 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
2a550 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
2a560 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
2a570 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
2a580 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
2a590 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
2a5a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2a5b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
2a5c0 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
2a5d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a5e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2a5f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2a600 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2a610 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
2a620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2a630 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2a640 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
2a650 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
2a660 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
2a670 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
2a680 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
2a690 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
2a6a0 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
2a6b0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2a6c0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
2a6d0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
2a6e0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2a6f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
2a700 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
2a710 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
2a720 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
2a730 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
2a740 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
2a750 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
2a760 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
2a770 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
2a780 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
2a790 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
2a7a0 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
2a7b0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
2a7c0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
2a7d0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
2a7e0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a7f0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2a800 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
2a810 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
2a820 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
2a830 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
2a840 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
2a850 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
2a860 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
2a870 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
2a880 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
2a890 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
2a8a0 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
2a8b0 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
2a8c0 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
2a8d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
2a8e0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
2a8f0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
2a900 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
2a910 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
2a920 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2a930 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2a940 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
2a950 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
2a960 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
2a970 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2a980 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2a990 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2a9a0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
2a9b0 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
2a9c0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
2a9d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a9e0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
2a9f0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
2aa00 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
2aa10 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
2aa20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
2aa30 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
2aa40 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
2aa50 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
2aa60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2aa70 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
2aa80 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
2aa90 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2aaa0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2aab0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2aac0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2aad0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2aae0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
2aaf0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
2ab00 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
2ab10 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
2ab20 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
2ab30 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
2ab40 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
2ab50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
2ab60 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
2ab70 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
2ab80 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
2ab90 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
2aba0 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
2abb0 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
2abc0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
2abd0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
2abe0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
2abf0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
2ac00 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
2ac10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
2ac20 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
2ac30 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
2ac40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2ac50 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
2ac60 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
2ac70 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2ac80 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
2ac90 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
2aca0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
2acb0 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
2acc0 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
2acd0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
2ace0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
2acf0 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
2ad00 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
2ad10 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
2ad20 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
2ad30 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2ad40 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
2ad50 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
2ad60 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
2ad70 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
2ad80 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
2ad90 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
2ada0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
2adb0 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
2adc0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74 20  nt *pRC){.  int 
2add0 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  i;          /* L
2ade0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2adf0 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
2ae00 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
2ae10 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
2ae20 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
2ae30 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
2ae40 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
2ae50 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
2ae60 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
2ae70 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
2ae80 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
2ae90 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
2aea0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
2aeb0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
2aec0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
2aed0 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
2aee0 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
2aef0 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
2af00 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
2af10 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
2af20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  n;..  assert( id
2af30 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
2af40 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
2af50 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
2af60 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
2af70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2af80 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2af90 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2afa0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
2afb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2afc0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2afd0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
2afe0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2aff0 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70  .  ptr = &data[p
2b000 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2b010 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20   + 2*idx];.  pc 
2b020 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
2b030 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
2b040 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
2b050 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
2b060 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2b070 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
2b080 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
2b090 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2b0a0 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 67 65 74  ;.  if( pc < get
2b0b0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2b0c0 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70  5]) || pc+sz > p
2b0d0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2b0e0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52  eSize ){.    *pR
2b0f0 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
2b100 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
2b110 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
2b120 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
2b130 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
2b140 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  rc ){.    *pRC =
2b150 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
2b160 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78  .  }.  for(i=idx
2b170 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  +1; i<pPage->nCe
2b180 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29  ll; i++, ptr+=2)
2b190 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70  {.    ptr[0] = p
2b1a0 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31  tr[2];.    ptr[1
2b1b0 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a  ] = ptr[3];.  }.
2b1c0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
2b1d0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2b1e0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
2b1f0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  ->nCell);.  pPag
2b200 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d  e->nFree += 2;.}
2b210 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2b220 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
2b230 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
2b240 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
2b250 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
2b260 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
2b270 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
2b280 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
2b290 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
2b2a0 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
2b2b0 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
2b2c0 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
2b2d0 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
2b2e0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2b2f0 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
2b300 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
2b310 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
2b320 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
2b330 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
2b340 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
2b350 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
2b360 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
2b370 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
2b380 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
2b390 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
2b3a0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
2b3b0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
2b3c0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
2b3d0 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
2b3e0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
2b3f0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
2b400 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2b410 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
2b420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
2b430 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2b440 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
2b450 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
2b460 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
2b470 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
2b480 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2b490 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
2b4a0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2b4b0 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
2b4c0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
2b4d0 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
2b4e0 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
2b4f0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2b500 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
2b510 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
2b520 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
2b530 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
2b540 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2b550 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
2b560 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
2b570 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
2b580 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
2b590 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
2b5a0 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
2b5b0 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
2b5c0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
2b5d0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2b5e0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
2b5f0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
2b600 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2b610 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
2b620 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
2b630 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
2b640 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
2b650 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
2b660 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
2b670 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
2b680 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
2b690 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
2b6a0 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
2b6b0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
2b6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2b6d0 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
2b6e0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
2b6f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
2b700 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
2b710 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
2b720 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
2b730 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2b740 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
2b750 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2b760 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
2b770 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2b780 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
2b790 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2b7a0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2b7b0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
2b7c0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
2b7d0 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
2b7e0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
2b7f0 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
2b800 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
2b810 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
2b820 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2b830 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2b840 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2b850 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
2b860 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
2b870 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
2b880 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2b890 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
2b8a0 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
2b8b0 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e   data[] */..  in
2b8c0 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c  t nSkip = (iChil
2b8d0 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69  d ? 4 : 0);..  i
2b8e0 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
2b8f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ;..  assert( i>=
2b900 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
2b910 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
2b920 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
2b930 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
2b940 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
2b950 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
2b960 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
2b970 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b980 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
2b990 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
2b9a0 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  ->aOvfl) );.  as
2b9b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b9c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2b9d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2b9e0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f   /* The cell sho
2b9f0 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
2ba00 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  sized correctly.
2ba10 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20    However, when 
2ba20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61  moving a.  ** ma
2ba30 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f  lformed cell fro
2ba40 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f  m a leaf page to
2ba50 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   an interior pag
2ba60 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73  e, if the cell s
2ba70 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20  ize.  ** wanted 
2ba80 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
2ba90 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65  4 but got rounde
2baa0 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65  d up to 4 on the
2bab0 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65   leaf, then size
2bac0 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c  .  ** might be l
2bad0 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66  ess than 8 (leaf
2bae0 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29  -size + pointer)
2baf0 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72   on the interior
2bb00 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20   node.  Hence.  
2bb10 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65  ** the term afte
2bb20 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20  r the || in the 
2bb30 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
2bb40 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
2bb50 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
2bb60 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c  (pPage, pCell) |
2bb70 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69  | (sz==8 && iChi
2bb80 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70  ld>0) );.  if( p
2bb90 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2bba0 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
2bbb0 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
2bbc0 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
2bbd0 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69  emcpy(pTemp+nSki
2bbe0 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  p, pCell+nSkip, 
2bbf0 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20  sz-nSkip);.     
2bc00 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
2bc10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
2bc20 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
2bc30 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
2bc40 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
2bc50 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
2bc60 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
2bc70 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
2bc80 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
2bc90 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
2bca0 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  aOvfl[0])) );.  
2bcb0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
2bcc0 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ].pCell = pCell;
2bcd0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
2bce0 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29  l[j].idx = (u16)
2bcf0 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
2bd00 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2bd10 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2bd20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2bd30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bd40 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
2bd50 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
2bd60 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rn;.    }.    as
2bd70 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2bd80 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2bd90 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2bda0 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
2bdb0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65  e->aData;.    ce
2bdc0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
2bdd0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
2bde0 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
2bdf0 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
2be00 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  ell;.    ins = c
2be10 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
2be20 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
2be30 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
2be40 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
2be50 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
2be60 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
2be70 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
2be80 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
2be90 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
2bea0 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f  ollowing two pro
2beb0 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69  perties.    ** i
2bec0 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63  f it returns suc
2bed0 63 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  cess */.    asse
2bee0 72 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32  rt( idx >= end+2
2bef0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2bf00 69 64 78 2b 73 7a 20 3c 3d 20 70 50 61 67 65 2d  idx+sz <= pPage-
2bf10 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2bf20 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
2bf30 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
2bf40 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
2bf50 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
2bf60 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
2bf70 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
2bf80 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2bf90 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
2bfa0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2bfb0 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68  (&data[idx], iCh
2bfc0 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2bfd0 66 6f 72 28 6a 3d 65 6e 64 2c 20 70 74 72 3d 26  for(j=end, ptr=&
2bfe0 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20  data[j]; j>ins; 
2bff0 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20  j-=2, ptr-=2){. 
2c000 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74       ptr[0] = pt
2c010 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72  r[-2];.      ptr
2c020 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20  [1] = ptr[-1];. 
2c030 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74     }.    put2byt
2c040 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64  e(&data[ins], id
2c050 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  x);.    put2byte
2c060 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
2c070 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67  rOffset+3], pPag
2c080 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  e->nCell);.#ifnd
2c090 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2c0a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2c0b0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
2c0c0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2c0d0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
2c0e0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
2c0f0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
2c100 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
2c110 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
2c120 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
2c130 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
2c140 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
2c150 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
2c160 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
2c170 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2c180 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23  l, pRC);.    }.#
2c190 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
2c1a0 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
2c1b0 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
2c1c0 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
2c1d0 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
2c1e0 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
2c1f0 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
2c200 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
2c210 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
2c220 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
2c230 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
2c240 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
2c250 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
2c260 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
2c270 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
2c280 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
2c290 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
2c2a0 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
2c2b0 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
2c2c0 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
2c2d0 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
2c2e0 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
2c2f0 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
2c300 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
2c310 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2c320 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2c330 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  */.  u8 *pCellpt
2c340 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  r;     /* Addres
2c350 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70  s of next cell p
2c360 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
2c370 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a  cellbody;     /*
2c380 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
2c390 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20   cell body */.  
2c3a0 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
2c3b0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2c3d0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66  ointer to data f
2c3e0 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  or pPage */.  co
2c3f0 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
2c400 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
2c410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2c420 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
2c430 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
2c440 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20  t int nUsable = 
2c450 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2c460 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
2c470 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a  e size of page *
2c480 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
2c490 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
2c4a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2c4b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2c4c0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2c4d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2c4e0 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65   nCell>=0 && nCe
2c4f0 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
2c500 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
2c510 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2c520 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
2c530 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2c540 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2c550 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2c560 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2c570 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
2c580 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
2c590 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
2c5a0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2c5b0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
2c5c0 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
2c5d0 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61  ta[hdr+5])==nUsa
2c5e0 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70  ble );..  pCellp
2c5f0 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
2c600 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e  ->cellOffset + n
2c610 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
2c620 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
2c630 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
2c640 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2c650 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
2c660 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61     cellbody -= a
2c670 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Size[i];.    put
2c680 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
2c690 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
2c6a0 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
2c6b0 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
2c6c0 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d  , aSize[i]);.  }
2c6d0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2c6e0 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29  a[hdr+3], nCell)
2c6f0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2c700 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62  ta[hdr+5], cellb
2c710 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2c720 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32  Free -= (nCell*2
2c730 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c   + nUsable - cel
2c740 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
2c750 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43  >nCell = (u16)nC
2c760 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
2c770 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
2c780 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
2c790 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
2c7a0 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
2c7b0 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
2c7c0 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
2c7d0 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
2c7e0 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
2c7f0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2c800 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
2c810 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
2c820 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
2c830 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
2c840 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
2c850 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2c860 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
2c870 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
2c880 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
2c890 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
2c8a0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
2c8b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
2c8c0 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
2c8d0 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
2c8e0 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
2c8f0 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
2c900 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
2c910 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
2c920 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
2c930 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
2c940 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
2c950 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
2c960 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
2c970 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
2c980 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
2c990 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
2c9a0 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
2c9b0 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
2c9c0 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
2c9d0 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
2c9e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c9f0 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2ca00 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
2ca10 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
2ca20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
2ca30 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
2ca40 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
2ca50 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66  balance */...#if
2ca60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ca70 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
2ca80 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
2ca90 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
2caa0 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
2cab0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
2cac0 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
2cad0 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
2cae0 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
2caf0 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
2cb00 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
2cb10 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
2cb20 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
2cb30 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2cb40 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
2cb50 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
2cb60 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
2cb70 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63  trying to balanc
2cb80 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
2cb90 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
2cba0 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
2cbb0 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
2cbc0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
2cbd0 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
2cbe0 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
2cbf0 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
2cc00 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
2cc10 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
2cc20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
2cc30 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
2cc40 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
2cc50 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
2cc60 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
2cc70 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
2cc80 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
2cc90 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
2cca0 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
2ccb0 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
2ccc0 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
2ccd0 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
2cce0 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
2ccf0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
2cd00 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
2cd10 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
2cd20 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
2cd30 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
2cd40 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
2cd50 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
2cd60 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
2cd70 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
2cd80 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
2cd90 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73  pSpace buffer is
2cda0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
2cdb0 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20   temporary copy 
2cdc0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a  of the divider.*
2cdd0 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c  * cell that will
2cde0 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
2cdf0 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20  o pParent. Such 
2ce00 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
2ce10 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70  of a 4.** byte p
2ce20 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f  age number follo
2ce30 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c  wed by a variabl
2ce40 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
2ce50 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f  . In other.** wo
2ce60 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20  rds, at most 13 
2ce70 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65  bytes. Hence the
2ce80 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d   pSpace buffer m
2ce90 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61  ust be at.** lea
2cea0 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73  st 13 bytes in s
2ceb0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
2cec0 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
2ced0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
2cee0 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  t, MemPage *pPag
2cef0 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a  e, u8 *pSpace){.
2cf00 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73    BtShared *cons
2cf10 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70  t pBt = pPage->p
2cf20 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65  Bt;    /* B-Tree
2cf30 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d   Database */.  M
2cf40 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20  emPage *pNew;   
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf60 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
2cf70 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
2cf80 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfa0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2cfb0 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  Code */.  Pgno p
2cfc0 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20  gnoNew;         
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cfe0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
2cff0 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65   pNew */..  asse
2d000 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2d010 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2d020 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2d030 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2d040 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d050 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2d060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2d070 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
2d080 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  1 );..  if( pPag
2d090 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65  e->nCell<=0 ) re
2d0a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2d0b0 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
2d0c0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2d0d0 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77  age. This page w
2d0e0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
2d0f0 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
2d100 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b  .  ** pPage. Mak
2d110 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2d120 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74  e writable, so t
2d130 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  hat the new divi
2d140 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61  der cell.  ** ma
2d150 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49  y be inserted. I
2d160 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65  f both these ope
2d170 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63  rations are succ
2d180 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e  essful, proceed.
2d190 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
2d1a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2d1b0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
2d1c0 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69  New, 0, 0);..  i
2d1d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d1e0 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75   ){..    u8 *pOu
2d1f0 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a  t = &pSpace[4];.
2d200 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
2d210 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
2d220 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73  pCell;.    u16 s
2d230 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
2d240 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2d250 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70  );.    u8 *pStop
2d260 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ;..    assert( s
2d270 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2d280 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
2d290 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73  Page) );.    ass
2d2a0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
2d2b0 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45  a[0]==(PTF_INTKE
2d2c0 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
2d2d0 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20  TF_LEAF) );.    
2d2e0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50  zeroPage(pNew, P
2d2f0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2d300 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
2d310 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
2d320 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
2d330 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20  ll, &szCell);.. 
2d340 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2d350 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
2d360 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
2d370 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2d380 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
2d390 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
2d3a0 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
2d3b0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
2d3c0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2d3d0 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
2d3e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
2d3f0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
2d400 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
2d410 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65  ns fails, the re
2d420 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74  turn code is set
2d430 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  , but the conten
2d440 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
2d450 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65   parent page are
2d460 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74   still manipulat
2d470 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62  ed by thh code b
2d480 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61  elow..    ** Tha
2d490 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73  t is Ok, at this
2d4a0 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e   point the paren
2d4b0 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e  t page is guaran
2d4c0 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  teed to.    ** b
2d4d0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
2d4e0 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  y. Returning an 
2d4f0 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20  error code will 
2d500 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72  cause a.    ** r
2d510 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67  ollback, undoing
2d520 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
2d530 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  e to the parent 
2d540 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2d550 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2d560 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
2d570 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
2d580 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
2d590 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
2d5a0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
2d5b0 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e  szCell>pNew->min
2d5c0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
2d5d0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2d5e0 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26  r(pNew, pCell, &
2d5f0 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
2d600 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.  .    /* Cre
2d610 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65  ate a divider ce
2d620 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  ll to insert int
2d630 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64  o pParent. The d
2d640 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20  ivider cell.    
2d650 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ** consists of a
2d660 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4-byte page num
2d670 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75  ber (the page nu
2d680 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61  mber of pPage) a
2d690 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69  nd.    ** a vari
2d6a0 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20  able length key 
2d6b0 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73  value (which mus
2d6c0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61  t be the same va
2d6d0 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a  lue as the.    *
2d6e0 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e  * largest key on
2d6f0 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a   pPage)..    **.
2d700 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74      ** To find t
2d710 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76  he largest key v
2d720 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66  alue on pPage, f
2d730 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69  irst find the ri
2d740 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a  ght-most .    **
2d750 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20   cell on pPage. 
2d760 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69  The first two fi
2d770 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c  elds of this cel
2d780 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a  l are the .    *
2d790 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20  * record-length 
2d7a0 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
2d7b0 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f  th integer at mo
2d7c0 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69  st 32-bits in si
2d7d0 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  ze).    ** and t
2d7e0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20  he key value (a 
2d7f0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2d800 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76  integer, may hav
2d810 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20  e any value)..  
2d820 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f    ** The first o
2d830 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29  f the while(...)
2d840 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69   loops below ski
2d850 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f  ps over the reco
2d860 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  rd-length.    **
2d870 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f   field. The seco
2d880 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  nd while(...) lo
2d890 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65  op copies the ke
2d8a0 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  y value from the
2d8b0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2d8c0 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70  pPage into the p
2d8d0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2d8e0 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d    */.    pCell =
2d8f0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2d900 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
2d910 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
2d920 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
2d930 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26  le( (*(pCell++)&
2d940 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
2d950 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f  Stop );.    pSto
2d960 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
2d970 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f     while( ((*(pO
2d980 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b  ut++) = *(pCell+
2d990 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65  +))&0x80) && pCe
2d9a0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20  ll<pStop );..   
2d9b0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
2d9c0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
2d9d0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  into pParent. */
2d9e0 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
2d9f0 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74  pParent, pParent
2da00 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c  ->nCell, pSpace,
2da10 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61   (int)(pOut-pSpa
2da20 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce),.           
2da30 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67      0, pPage->pg
2da40 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f  no, &rc);..    /
2da50 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d  * Set the right-
2da60 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
2da70 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e   pParent to poin
2da80 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
2da90 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  e. */.    put4by
2daa0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
2dab0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2dac0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
2dad0 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  w);.  .    /* Re
2dae0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
2daf0 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
2db00 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65  age. */.    rele
2db10 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
2db20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2db30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2db40 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
2db50 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a  LANCE */..#if 0.
2db60 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2db70 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
2db80 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67  tribute anything
2db90 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2dba0 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20  n of SQLite..** 
2dbb0 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  it is sometimes 
2dbc0 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72  activated tempor
2dbd0 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75  arily while debu
2dbe0 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f  gging code respo
2dbf0 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73  nsible .** for s
2dc00 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d  etting pointer-m
2dc10 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  ap entries..*/.s
2dc20 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
2dc30 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61  CheckPages(MemPa
2dc40 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74  ge **apPage, int
2dc50 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69   nPage){.  int i
2dc60 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  , j;.  for(i=0; 
2dc70 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  i<nPage; i++){. 
2dc80 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75     Pgno n;.    u
2dc90 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  8 e;.    MemPage
2dca0 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65   *pPage = apPage
2dcb0 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65  [i];.    BtShare
2dcc0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2dcd0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
2dce0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2dcf0 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ;..    for(j=0; 
2dd00 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  j<pPage->nCell; 
2dd10 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c  j++){.      Cell
2dd20 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
2dd30 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20   u8 *z;.     .  
2dd40 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c      z = findCell
2dd50 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20  (pPage, j);.    
2dd60 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2dd70 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69  Ptr(pPage, z, &i
2dd80 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2dd90 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
2dda0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f  {.        Pgno o
2ddb0 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
2ddc0 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  z[info.iOverflow
2ddd0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
2dde0 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c  apGet(pBt, ovfl,
2ddf0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2de00 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2de10 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2de20 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
2de30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2de40 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2de50 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  f ){.        Pgn
2de60 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
2de70 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  te(z);.        p
2de80 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
2de90 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
2dea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2deb0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2dec0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
2ded0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2dee0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2def0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
2df00 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
2df10 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2df20 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2df30 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70  set+8]);.      p
2df40 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
2df50 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
2df60 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2df70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2df80 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
2df90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2dfa0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
2dfb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2dfc0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2dfd0 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
2dfe0 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  s of the b-tree 
2dff0 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20  node stored .** 
2e000 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  on page pFrom to
2e010 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61   page pTo. If pa
2e020 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74  ge pFrom was not
2e030 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
2e040 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  en.** the pointe
2e050 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
2e060 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  r each child pag
2e070 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f  e are updated so
2e080 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72   that the.** par
2e090 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20  ent page stored 
2e0a0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
2e0b0 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20  ap is page pTo. 
2e0c0 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
2e0d0 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20  ed.** any cells 
2e0e0 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  with overflow pa
2e0f0 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65  ge pointers, the
2e100 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
2e110 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  ing pointer.** m
2e120 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ap entries are a
2e130 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74  lso updated so t
2e140 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  hat the parent p
2e150 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e  age is page pTo.
2e160 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
2e170 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  is currently car
2e180 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c  rying any overfl
2e190 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65  ow cells (entrie
2e1a0 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50  s in the.** MemP
2e1b0 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61  age.aOvfl[] arra
2e1c0 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
2e1d0 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
2e1e0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
2e1f0 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
2e200 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
2e210 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e  ed using btreeIn
2e220 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
2e230 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
2e240 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2e250 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
2e260 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
2e270 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
2e280 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
2e290 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
2e2a0 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
2e2b0 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
2e2c0 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
2e2d0 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
2e2e0 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
2e2f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2e300 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  d copyNodeConten
2e310 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
2e320 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20  , MemPage *pTo, 
2e330 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
2e340 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
2e350 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  OK ){.    BtShar
2e360 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
2e370 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20   pFrom->pBt;.   
2e380 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
2e390 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
2e3a0 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
2e3b0 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
2e3c0 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  a;.    int const
2e3d0 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
2e3e0 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
2e3f0 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
2e400 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
2e410 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
2e420 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
2e430 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20   int iData;.  . 
2e440 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46   .    assert( pF
2e450 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
2e460 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2e470 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
2e480 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
2e490 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
2e4a0 46 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74  FromHdr+5])<=pBt
2e4b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2e4c0 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74    .    /* Copy t
2e4d0 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63  he b-tree node c
2e4e0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65  ontent from page
2e4f0 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
2e500 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61  To. */.    iData
2e510 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72   = get2byte(&aFr
2e520 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b  om[iFromHdr+5]);
2e530 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  .    memcpy(&aTo
2e540 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b  [iData], &aFrom[
2e550 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61  iData], pBt->usa
2e560 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a  bleSize-iData);.
2e570 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b      memcpy(&aTo[
2e580 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b  iToHdr], &aFrom[
2e590 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d  iFromHdr], pFrom
2e5a0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
2e5b0 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a  *pFrom->nCell);.
2e5c0 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74    .    /* Reinit
2e5d0 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20  ialize page pTo 
2e5e0 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  so that the cont
2e5f0 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ents of the MemP
2e600 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  age structure.  
2e610 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e    ** match the n
2e620 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69  ew data. The ini
2e630 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70  tialization of p
2e640 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20  To can actually 
2e650 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a  fail under.    *
2e660 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65  * fairly obscure
2e670 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20   circumstances, 
2e680 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
2e690 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74  s a copy of init
2e6a0 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20  ialized .    ** 
2e6b0 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20  page pFrom..    
2e6c0 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e  */.    pTo->isIn
2e6d0 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  it = 0;.    rc =
2e6e0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
2e6f0 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  To);.    if( rc!
2e700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e710 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2e720 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2e730 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
2e740 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2e750 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2e760 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
2e770 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a  ter-map entries.
2e780 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62      ** for any b
2e790 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f  -tree or overflo
2e7a0 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f  w pages that pTo
2e7b0 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68   now contains th
2e7c0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20  e pointers to.. 
2e7d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
2e7e0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2e7f0 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68      *pRC = setCh
2e800 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b  ildPtrmaps(pTo);
2e810 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
2e820 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2e830 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63   redistributes c
2e840 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72  ells on the iPar
2e850 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20  entIdx'th child 
2e860 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68  of pParent.** (h
2e870 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61  ereafter "the pa
2e880 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32  ge") and up to 2
2e890 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61   siblings so tha
2e8a0 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  t all pages have
2e8b0 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61   about the.** sa
2e8c0 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65  me amount of fre
2e8d0 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79  e space. Usually
2e8e0 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e   a single siblin
2e8f0 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  g on either side
2e900 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
2e910 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20  are used in the 
2e920 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67  balancing, thoug
2e930 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20  h both siblings 
2e940 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20  might come from 
2e950 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74  one.** side if t
2e960 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66  he page is the f
2e970 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69  irst or last chi
2e980 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74  ld of its parent
2e990 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a  . If the page .*
2e9a0 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e  * has fewer than
2e9b0 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d   2 siblings (som
2e9c0 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e  ething which can
2e9d0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2e9e0 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  the page.** is a
2e9f0 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20   root page or a 
2ea00 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20  child of a root 
2ea10 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61  page) then all a
2ea20 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67  vailable sibling
2ea30 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65  s.** participate
2ea40 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
2ea50 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  g..**.** The num
2ea60 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ber of siblings 
2ea70 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68  of the page migh
2ea80 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f  t be increased o
2ea90 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a  r decreased by .
2eaa0 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e  ** one or two in
2eab0 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65   an effort to ke
2eac0 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20  ep pages nearly 
2ead0 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65  full but not ove
2eae0 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e  r full. .**.** N
2eaf0 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
2eb00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2eb10 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68  lled, some of th
2eb20 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  e cells on the p
2eb30 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74  age.** might not
2eb40 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f   actually be sto
2eb50 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61  red in MemPage.a
2eb60 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e  Data[]. This can
2eb70 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68   happen.** if th
2eb80 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  e page is overfu
2eb90 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ll. This routine
2eba0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c   ensures that al
2ebb0 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65  l cells allocate
2ebc0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  d.** to the page
2ebd0 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67   and its sibling
2ebe0 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61  s fit into MemPa
2ebf0 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72  ge.aData[] befor
2ec00 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2ec10 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65  ** In the course
2ec20 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   of balancing th
2ec30 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
2ec40 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d  iblings, cells m
2ec50 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65  ay be.** inserte
2ec60 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65  d into or remove
2ec70 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  d from the paren
2ec80 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29  t page (pParent)
2ec90 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61  . Doing so.** ma
2eca0 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65  y cause the pare
2ecb0 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d  nt page to becom
2ecc0 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
2ecd0 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73  derfull. If this
2ece0 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20  .** happens, it 
2ecf0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
2ed00 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
2ed10 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ler to invoke th
2ed20 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c  e correct.** bal
2ed30 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74  ancing routine t
2ed40 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c  o fix this probl
2ed50 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61  em (see the bala
2ed60 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20  nce() routine). 
2ed70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  .**.** If this r
2ed80 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72  outine fails for
2ed90 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20   any reason, it 
2eda0 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20  might leave the 
2edb0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61  database.** in a
2edc0 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65   corrupted state
2edd0 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75  . So if this rou
2ede0 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
2edf0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
2ee00 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
2ee10 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69  k..**.** The thi
2ee20 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  rd argument to t
2ee30 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f  his function, aO
2ee40 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70  vflSpace, is a p
2ee50 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62  ointer to a.** b
2ee60 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68  uffer big enough
2ee70 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67   to hold one pag
2ee80 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65  e. If while inse
2ee90 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f  rting cells into
2eea0 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70   the parent.** p
2eeb0 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74 68  age (pParent) th
2eec0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65  e parent page be
2eed0 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20  comes overfull, 
2eee0 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a  this buffer is.*
2eef0 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
2ef00 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65  the parent's ove
2ef10 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63  rflow cells. Bec
2ef20 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  ause this functi
2ef30 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20  on inserts.** a 
2ef40 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20  maximum of four 
2ef50 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
2ef60 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
2ef70 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69  ge, and the maxi
2ef80 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61  mum.** size of a
2ef90 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74   cell stored wit
2efa0 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  hin an internal 
2efb0 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c  node is always l
2efc0 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20  ess than 1/4.** 
2efd0 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
2efe0 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  , the aOvflSpace
2eff0 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61  [] buffer is gua
2f000 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61  ranteed to be la
2f010 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f  rge.** enough fo
2f020 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63  r all overflow c
2f030 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ells..**.** If a
2f040 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74  OvflSpace is set
2f050 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74   to a null point
2f060 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
2f070 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
2f080 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73  LITE_NOMEM..*/.s
2f090 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2f0a0 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d  e_nonroot(.  Mem
2f0b0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f0d0 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73  Parent page of s
2f0e0 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61  iblings being ba
2f0f0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
2f100 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20  iParentIdx,     
2f110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f120 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67  ndex of "the pag
2f130 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  e" in pParent */
2f140 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63  .  u8 *aOvflSpac
2f150 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2f160 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20     /* page-size 
2f170 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
2f180 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a  or parent ovfl *
2f190 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20  /.  int isRoot  
2f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
2f1c0 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74  Parent is a root
2f1d0 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74  -page */.){.  Bt
2f1e0 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
2f1f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2f200 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
2f210 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
2f220 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2f230 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f240 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
2f250 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
2f260 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
2f270 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
2f280 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
2f290 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
2f2a0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  */.  int nNew = 
2f2b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2f2c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2f2d0 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
2f2e0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f300 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2f310 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
2f320 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
2f330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f340 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2f350 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  rs */.  int nxDi
2f360 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
2f370 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
2f380 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
2f390 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
2f3a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2f3b0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2f3c0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
2f3d0 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66  de */.  u16 leaf
2f3e0 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
2f3f0 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
2f400 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
2f410 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
2f420 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
2f430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f440 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
2f450 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
2f460 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
2f470 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
2f480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2f490 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
2f4a0 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
2f4b0 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
2f4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f4d0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
2f4e0 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
2f4f0 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
2f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f510 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
2f520 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
2f530 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
2f540 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20   iSpace1 = 0;   
2f550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2f560 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
2f570 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20  f aSpace1[] */. 
2f580 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20   int iOvflSpace 
2f590 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
2f5a0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
2f5b0 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65  te of aOvflSpace
2f5c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
2f5d0 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
2f5e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2f5f0 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
2f600 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
2f610 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
2f620 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
2f630 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
2f640 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
2f650 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
2f660 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
2f670 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
2f680 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
2f690 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2f6a0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2f6b0 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
2f6c0 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
2f6d0 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
2f6e0 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74   */.  u8 *pRight
2f6f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f700 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69     /* Location i
2f710 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68  n parent of righ
2f720 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65  t-sibling pointe
2f730 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  r */.  u8 *apDiv
2f740 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20  [NB-1];         
2f750 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
2f760 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
2f770 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
2f780 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2f790 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
2f7a0 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
2f7b0 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
2f7c0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
2f7d0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
2f7e0 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
2f7f0 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
2f800 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
2f810 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
2f820 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2f830 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
2f840 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
2f850 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
2f860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f870 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
2f880 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
2f890 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  l[] */.  u8 *aSp
2f8a0 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
2f8b0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
2f8c0 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
2f8d0 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20  iders cells */. 
2f8e0 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
2f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f900 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f   Temp var to sto
2f910 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  re a page number
2f920 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20   in */..  pBt = 
2f930 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20  pParent->pBt;.  
2f940 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2f950 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2f960 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2f970 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2f980 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2f990 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2f9a0 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28  ..#if 0.  TRACE(
2f9b0 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
2f9c0 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
2f9d0 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
2f9e0 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
2f9f0 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  gno));.#endif.. 
2fa00 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
2fa10 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61  t pParent may ha
2fa20 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  ve at most one o
2fa30 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e  verflow cell. An
2fa40 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f  d if.  ** this o
2fa50 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
2fa60 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74  present, it must
2fa70 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74   be the cell wit
2fa80 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50  h .  ** index iP
2fa90 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73  arentIdx. This s
2faa0 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62  cenario comes ab
2fab0 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  out when this fu
2fac0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63  nction.  ** is c
2fad0 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c  alled (indirectl
2fae0 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  y) from sqlite3B
2faf0 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20  treeDelete()..  
2fb00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
2fb10 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
2fb20 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e  =0 || pParent->n
2fb30 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
2fb40 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
2fb50 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
2fb60 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c  | pParent->aOvfl
2fb70 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74  [0].idx==iParent
2fb80 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61  Idx );..  if( !a
2fb90 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20  OvflSpace ){.   
2fba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2fbb0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
2fbc0 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67  Find the sibling
2fbd0 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63   pages to balanc
2fbe0 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74  e. Also locate t
2fbf0 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  he cells in pPar
2fc00 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64  ent .  ** that d
2fc10 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e  ivide the siblin
2fc20 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69  gs. An attempt i
2fc30 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e  s made to find N
2fc40 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20  N siblings on . 
2fc50 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20   ** either side 
2fc60 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73  of pPage. More s
2fc70 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65  iblings are take
2fc80 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c  n from one side,
2fc90 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20   however, .  ** 
2fca0 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77  if there are few
2fcb0 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69  er than NN sibli
2fcc0 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ngs on the other
2fcd0 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e   side. If pParen
2fce0 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72  t.  ** has NB or
2fcf0 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20   fewer children 
2fd00 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  then all childre
2fd10 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65  n of pParent are
2fd20 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20   taken.  .  **. 
2fd30 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
2fd40 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76  so drops the div
2fd50 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
2fd60 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2fd70 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20   This.  ** way, 
2fd80 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
2fd90 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
2fda0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64  es not have to d
2fdb0 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a  eal with any.  *
2fdc0 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  * overflow cells
2fdd0 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
2fde0 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e  age, since if an
2fdf0 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20 77  y existed they w
2fe00 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c  ill.  ** have al
2fe10 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76  ready been remov
2fe20 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70  ed..  */.  i = p
2fe30 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2fe40 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  w + pParent->nCe
2fe50 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b  ll;.  if( i<2 ){
2fe60 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a  .    nxDiv = 0;.
2fe70 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a      nOld = i+1;.
2fe80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c    }else{.    nOl
2fe90 64 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69  d = 3;.    if( i
2fea0 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20  ParentIdx==0 ){ 
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fec0 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30  .      nxDiv = 0
2fed0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2fee0 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b  iParentIdx==i ){
2fef0 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69  .      nxDiv = i
2ff00 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -2;.    }else{. 
2ff10 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61       nxDiv = iPa
2ff20 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d  rentIdx-1;.    }
2ff30 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a  .    i = 2;.  }.
2ff40 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70    if( (i+nxDiv-p
2ff50 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2ff60 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  w)==pParent->nCe
2ff70 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74  ll ){.    pRight
2ff80 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61   = &pParent->aDa
2ff90 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2ffa0 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73  ffset+8];.  }els
2ffb0 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  e{.    pRight = 
2ffc0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
2ffd0 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
2ffe0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  t->nOverflow);. 
2fff0 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34   }.  pgno = get4
30000 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20  byte(pRight);.  
30010 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
30020 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
30030 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26  age(pBt, pgno, &
30040 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69  apOld[i]);.    i
30050 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d  f( rc ){.      m
30060 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20  emset(apOld, 0, 
30070 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d  (i+1)*sizeof(Mem
30080 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67  Page*));.      g
30090 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
300a0 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  nup;.    }.    n
300b0 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
300c0 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
300d0 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
300e0 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29  w;.    if( (i--)
300f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
30100 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70    if( i+nxDiv==p
30110 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d  Parent->aOvfl[0]
30120 2e 69 64 78 20 26 26 20 70 50 61 72 65 6e 74 2d  .idx && pParent-
30130 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
30140 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70      apDiv[i] = p
30150 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d  Parent->aOvfl[0]
30160 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67  .pCell;.      pg
30170 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
30180 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
30190 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
301a0 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
301b0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
301c0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
301d0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ow = 0;.    }els
301e0 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  e{.      apDiv[i
301f0 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ] = findCell(pPa
30200 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
30210 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
30220 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  );.      pgno = 
30230 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
30240 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b  ]);.      szNew[
30250 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
30260 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
30270 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  i]);..      /* D
30280 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f  rop the cell fro
30290 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
302a0 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c  e. apDiv[i] stil
302b0 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20  l points to.    
302c0 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69    ** the cell wi
302d0 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c  thin the parent,
302e0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
302f0 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64  has been dropped
30300 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
30310 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20  is safe because 
30320 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20  dropping a cell 
30330 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20  only overwrites 
30340 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
30350 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  ** four bytes of
30360 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75   it, and this fu
30370 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
30380 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20  need the first. 
30390 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
303a0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
303b0 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70  r cell. So the p
303c0 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74  ointer is safe t
303d0 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c  o use.      ** l
303e0 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20  ater on.  .     
303f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
30400 65 73 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f  ess SQLite is co
30410 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65  mpiled in secure
30420 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e  -delete mode. In
30430 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20   this case,.    
30440 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c    ** the dropCel
30450 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  l() routine will
30460 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 65   overwrite the e
30470 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20  ntire cell with 
30480 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a  zeroes..      **
30490 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
304a0 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20  emporarily copy 
304b0 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  the cell into th
304c0 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20  e aOvflSpace[]. 
304d0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20       ** buffer. 
304e0 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65  It will be copie
304f0 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73  d out again as s
30500 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61 63  oon as the aSpac
30510 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20  e[] buffer.     
30520 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   ** is allocated
30530 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
30540 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
30550 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
30560 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50   iOff = SQLITE_P
30570 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b  TR_TO_INT(apDiv[
30580 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52  i]) - SQLITE_PTR
30590 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d  _TO_INT(pParent-
305a0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
305b0 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77   if( (iOff+szNew
305c0 5b 69 5d 29 3e 70 42 74 2d 3e 75 73 61 62 6c 65  [i])>pBt->usable
305d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
305e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
305f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30600 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
30610 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
30620 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
30630 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
30640 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
30650 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30660 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
30670 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66  &aOvflSpace[iOff
30680 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e  ], apDiv[i], szN
30690 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ew[i]);.        
306a0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f    apDiv[i] = &aO
306b0 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
306c0 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
306d0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
306e0 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43     }.      dropC
306f0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
30700 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
30710 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69  verflow, szNew[i
30720 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  ], &rc);.    }. 
30730 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d   }..  /* Make nM
30740 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70  axCells a multip
30750 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72  le of 4 in order
30760 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62   to preserve 8-b
30770 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65  yte.  ** alignme
30780 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c  nt */.  nMaxCell
30790 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b  s = (nMaxCells +
307a0 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20   3)&~3;..  /*.  
307b0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
307c0 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72  e for memory str
307d0 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b  uctures.  */.  k
307e0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
307f0 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
30800 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a  (MemPage));.  sz
30810 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
30820 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
30830 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
30840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30850 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
30860 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
30870 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
30880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30890 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
308a0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20   pBt->pageSize  
308b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
308c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
308d0 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20  aSpace1 */.     
308e0 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20  + k*nOld;       
308f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30910 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70   Page copies (ap
30920 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c  Copy) */.  apCel
30930 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
30940 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
30950 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
30960 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
30970 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
30980 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
30990 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
309a0 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
309b0 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
309c0 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d  ls];.  aSpace1 =
309d0 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d   (u8*)&szCell[nM
309e0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65  axCells];.  asse
309f0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
30a00 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31  LIGNMENT(aSpace1
30a10 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
30a20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
30a30 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
30a40 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
30a50 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
30a60 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
30a70 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
30a80 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
30a90 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
30aa0 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
30ab0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
30ac0 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20   from aSpace1[] 
30ad0 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
30ae0 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
30af0 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
30b00 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
30b10 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
30b20 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
30b30 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
30b40 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
30b50 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
30b60 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
30b70 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
30b80 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
30b90 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
30ba0 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
30bb0 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
30bc0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
30bd0 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
30be0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
30bf0 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
30c00 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
30c10 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
30c20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
30c30 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
30c40 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
30c50 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
30c60 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
30c70 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
30c80 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
30c90 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
30ca0 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
30cb0 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
30cc0 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
30cd0 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
30ce0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
30cf0 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
30d00 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
30d10 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65    */.  leafCorre
30d20 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d  ction = apOld[0]
30d30 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
30d40 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  Data = apOld[0]-
30d50 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
30d60 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
30d70 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ){.    int limit
30d80 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65  ;.    .    /* Be
30d90 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
30da0 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61  ing else, take a
30db0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74   copy of the i't
30dc0 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69  h original sibli
30dd0 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  ng.    ** The re
30de0 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
30df0 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
30e00 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
30e10 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20  s rather.    ** 
30e20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
30e30 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
30e40 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
30e50 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
30e60 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f      ** process o
30e70 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
30e80 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ten.  */.    Mem
30e90 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
30ea0 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
30eb0 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d  e*)&aSpace1[pBt-
30ec0 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d  >pageSize + k*i]
30ed0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
30ee0 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a  d, apOld[i], siz
30ef0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
30f00 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d     pOld->aData =
30f10 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d   (void*)&pOld[1]
30f20 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
30f30 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  d->aData, apOld[
30f40 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
30f50 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
30f60 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
30f70 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
30f80 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
30f90 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
30fa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
30fb0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
30fc0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
30fd0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
30fe0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
30ff0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
31000 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
31010 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
31020 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
31030 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
31040 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
31050 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
31060 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
31070 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
31080 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
31090 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
310a0 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
310b0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
310c0 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
310d0 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
310e0 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
310f0 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
31100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
31110 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
31120 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4 );.      asser
31130 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d  t( iSpace1<=pBt-
31140 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
31150 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
31160 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a   apDiv[i], sz);.
31170 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
31180 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
31190 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
311a0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
311b0 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c  rrection==0 || l
311c0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
311d0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
311e0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c  [nCell] = szCell
311f0 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f  [nCell] - leafCo
31200 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
31210 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
31220 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
31230 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
31240 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
31250 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64  assert( pOld->hd
31260 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  rOffset==0 );.  
31270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
31280 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
31290 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
312a0 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
312b0 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ft.        ** po
312c0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
312d0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
312e0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
312f0 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
31300 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
31310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31320 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
31330 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
31340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
31350 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
31360 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
31370 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
31380 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
31390 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
313a0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
313b0 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
313c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
313d0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
313e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
313f0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
31400 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
31410 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
31420 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
31430 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
31440 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
31450 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
31460 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
31470 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
31480 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
31490 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
314a0 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
314b0 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
314c0 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
314d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
314e0 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
314f0 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
31500 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
31510 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
31520 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
31530 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
31540 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
31550 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
31560 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
31570 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
31580 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
31590 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
315a0 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
315b0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
315c0 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
315d0 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
315e0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
315f0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
31600 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
31610 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
31620 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
31630 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
31640 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
31650 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
31660 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
31670 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
31680 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
31690 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
316a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
316b0 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
316c0 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
316d0 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
316e0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
316f0 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
31700 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
31710 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
31720 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
31730 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
31740 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
31750 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
31760 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
31770 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
31780 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
31790 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
317a0 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
317b0 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
317c0 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b     if( k>NB+1 ){
317d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
317e0 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20  RUPT_BKPT; goto 
317f0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
31800 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
31810 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
31820 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
31830 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
31840 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  /*.  ** The p
31850 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20  acking computed 
31860 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
31870 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20  block is biased 
31880 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69  toward the sibli
31890 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ngs.  ** on the 
318a0 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20  left side.  The 
318b0 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72  left siblings ar
318c0 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20  e always nearly 
318d0 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a  full, while the.
318e0 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20    ** right-most 
318f0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
31900 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20   nearly empty.  
31910 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  This block of co
31920 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a  de attempts.  **
31930 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70   to adjust the p
31940 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e  acking of siblin
31950 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  gs to get a bett
31960 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a  er balance..  **
31970 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  .  ** This adjus
31980 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  tment is more th
31990 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  an an optimizati
319a0 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67  on.  The packing
319b0 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a   above might.  *
319c0 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62  * be so out of b
319d0 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20  alance as to be 
319e0 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78  illegal.  For ex
319f0 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74  ample, the right
31a00 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69  -most.  ** sibli
31a10 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70  ng might be comp
31a20 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54  letely empty.  T
31a30 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
31a40 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a  s not optional..
31a50 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31    */.  for(i=k-1
31a60 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
31a70 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73   int szRight = s
31a80 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a  zNew[i];  /* Siz
31a90 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
31aa0 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
31ab0 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a   int szLeft = sz
31ac0 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a  New[i-1]; /* Siz
31ad0 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
31ae0 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
31af0 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20  int r;          
31b00 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
31b10 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
31b20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20  in left sibling 
31b30 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20  */.    int d;   
31b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
31b50 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
31b60 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  l to the left of
31b70 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a   right sibling *
31b80 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  /..    r = cntNe
31b90 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
31ba0 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
31bb0 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
31bc0 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( d<nMaxCells );
31bd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e  .    assert( r<n
31be0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
31bf0 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d  while( szRight==
31c00 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43  0 || szRight+szC
31c10 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
31c20 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29  -(szCell[r]+2) )
31c30 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
31c40 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
31c50 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
31c60 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
31c70 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
31c80 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
31c90 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
31ca0 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
31cb0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
31cc0 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
31cd0 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
31ce0 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
31cf0 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
31d00 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
31d10 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
31d20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
31d30 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20  r pPage is.  ** 
31d40 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
31d50 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
31d60 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
31d70 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
31d80 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
31d90 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
31da0 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
31db0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
31dc0 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
31dd0 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
31de0 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
31df0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
31e00 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  ) );..  TRACE(("
31e10 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
31e20 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61   %d %d  ",.    a
31e30 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a  pOld[0]->pgno, .
31e40 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70      nOld>=2 ? ap
31e50 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[1]->pgno : 0
31e60 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
31e70 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apOld[2]->pgno :
31e80 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20   0.  ));..  /*. 
31e90 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
31ea0 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
31eb0 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
31ec0 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
31ed0 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e    if( apOld[0]->
31ee0 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72  pgno<=1 ){.    r
31ef0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
31f00 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
31f10 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
31f20 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61  p;.  }.  pageFla
31f30 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61  gs = apOld[0]->a
31f40 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
31f50 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
31f60 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
31f70 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
31f80 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
31f90 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
31fa0 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
31fb0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
31fc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31fd0 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
31fe0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
31ff0 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
32000 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
32010 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
32020 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
32030 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
32040 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
32050 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
32060 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20  w, &pgno, pgno, 
32070 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
32080 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
32090 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
320a0 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
320b0 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20        nNew++;.. 
320c0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
320d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
320e0 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
320f0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
32100 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
32110 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
32120 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
32130 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
32140 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
32150 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
32160 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32170 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32180 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
32190 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
321a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
321b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
321c0 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
321d0 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
321e0 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
321f0 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
32200 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
32210 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
32220 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  ], &rc);.    if(
32230 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
32240 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
32250 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
32260 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
32270 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
32280 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
32290 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
322a0 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
322b0 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
322c0 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
322d0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
322e0 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
322f0 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
32300 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
32310 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
32320 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
32330 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
32340 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
32350 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
32360 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
32370 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
32380 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
32390 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
323a0 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
323b0 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
323c0 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
323d0 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
323e0 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
323f0 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
32400 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
32410 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
32420 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
32430 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
32440 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
32450 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
32460 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
32470 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
32480 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
32490 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
324a0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
324b0 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
324c0 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61      int minV = a
324d0 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
324e0 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
324f0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
32500 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
32510 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70   if( apNew[j]->p
32520 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  gno<(unsigned)mi
32530 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
32540 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
32550 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d  minV = apNew[j]-
32560 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  >pgno;.      }. 
32570 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
32580 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  I>i ){.      int
32590 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   t;.      MemPag
325a0 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d  e *pT;.      t =
325b0 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b   apNew[i]->pgno;
325c0 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
325d0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  w[i];.      apNe
325e0 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
325f0 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
32600 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
32610 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
32620 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
32630 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
32640 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
32650 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apNew[0]->pgno, 
32660 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
32670 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d  ew>=2 ? apNew[1]
32680 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
32690 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
326a0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
326b0 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f  ? apNew[2]->pgno
326c0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
326d0 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
326e0 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65    nNew>=4 ? apNe
326f0 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[3]->pgno : 0, 
32700 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
32710 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
32720 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e  >=5 ? apNew[4]->
32730 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
32740 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
32750 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ));..  assert( s
32760 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32770 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
32780 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75  pDbPage) );.  pu
32790 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61  t4byte(pRight, a
327a0 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67  pNew[nNew-1]->pg
327b0 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  no);..  /*.  ** 
327c0 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
327d0 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
327e0 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
327f0 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
32800 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
32810 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
32820 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
32830 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
32840 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
32850 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
32860 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
32870 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
32880 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
32890 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
328a0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
328b0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a  axCells );.    z
328c0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
328d0 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
328e0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
328f0 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
32900 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
32910 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
32920 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
32930 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
32940 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
32950 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
32960 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
32970 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  );..    j = cntN
32980 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
32990 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
329a0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
329b0 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
329c0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
329d0 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
329e0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
329f0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
32a00 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
32a10 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d   assert( i<nNew-
32a20 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  1 || j==nCell );
32a30 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c  .    if( j<nCell
32a40 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
32a50 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
32a60 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
32a70 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
32a80 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
32a90 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
32aa0 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
32ab0 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
32ac0 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
32ad0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
32ae0 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66  &aOvflSpace[iOvf
32af0 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69  lSpace];.      i
32b00 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
32b10 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
32b20 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
32b30 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
32b40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
32b50 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
32b60 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
32b70 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
32b80 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
32b90 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
32ba0 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
32bb0 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
32bc0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
32bd0 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
32be0 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
32bf0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
32c00 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
32c10 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
32c20 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
32c30 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
32c40 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
32c50 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
32c60 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
32c70 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
32c80 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
32c90 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
32ca0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
32cb0 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
32cc0 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
32cd0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
32ce0 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34  ;.        sz = 4
32cf0 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43   + putVarint(&pC
32d00 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65  ell[4], info.nKe
32d10 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  y);.        pTem
32d20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
32d30 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
32d40 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
32d50 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
32d60 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
32d70 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
32d80 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
32d90 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
32da0 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
32db0 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
32dc0 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
32dd0 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
32de0 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
32df0 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
32e00 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
32e10 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
32e20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72  ** (see btreePar
32e30 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
32e40 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
32e50 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
32e60 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
32e70 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
32e80 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
32e90 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
32ea0 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
32eb0 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
32ec0 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
32ed0 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
32ee0 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
32ef0 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
32f00 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
32f10 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
32f20 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
32f30 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
32f40 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
32f50 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
32f60 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
32f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
32f80 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
32f90 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
32fa0 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
32fb0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32fc0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
32fd0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
32fe0 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
32ff0 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
33000 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
33010 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
33020 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
33030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33040 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b  OvflSpace += sz;
33050 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
33060 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
33070 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  /4 );.      asse
33080 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d  rt( iOvflSpace<=
33090 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
330a0 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c  .      insertCel
330b0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
330c0 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
330d0 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  mp, pNew->pgno, 
330e0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
330f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
33100 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
33110 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65  anup;.      asse
33120 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
33130 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
33140 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
33150 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  ..      j++;.   
33160 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
33170 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
33180 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
33190 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
331a0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
331b0 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
331c0 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
331d0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a  ==0 ){.    u8 *z
331e0 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b  Child = &apCopy[
331f0 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
33200 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ];.    memcpy(&a
33210 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
33220 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20  ata[8], zChild, 
33230 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  4);.  }..  if( i
33240 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74  sRoot && pParent
33250 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50  ->nCell==0 && pP
33260 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
33270 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  <=apNew[0]->nFre
33280 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  e ){.    /* The 
33290 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
332a0 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74   b-tree now cont
332b0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54  ains no cells. T
332c0 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a  he only sibling.
332d0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74      ** page is t
332e0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
332f0 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f  f the parent. Co
33300 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
33310 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68  of the.    ** ch
33320 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68  ild page into th
33330 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61  e parent, decrea
33340 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c  sing the overall
33350 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20   height of the. 
33360 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72     ** b-tree str
33370 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54  ucture by one. T
33380 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65 64  his is described
33390 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65   as the "balance
333a0 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20  -shallower".    
333b0 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d  ** sub-algorithm
333c0 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e   in some documen
333d0 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20  tation..    **. 
333e0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
333f0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
33400 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 61  database, the ca
33410 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f  ll to copyNodeCo
33420 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20  ntent() .    ** 
33430 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72  sets all pointer
33440 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72  -map entries cor
33450 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61  responding to da
33460 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67  tabase image pag
33470 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77  es .    ** for w
33480 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72  hich the pointer
33490 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69   is stored withi
334a0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  n the content be
334b0 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20  ing copied..    
334c0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65  **.    ** The se
334d0 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f  cond assert belo
334e0 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  w verifies that 
334f0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 69  the child page i
33500 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20  s defragmented. 
33510 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62     ** (it must b
33520 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75 73  e, as it was jus
33530 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20  t reconstructed 
33540 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61  using assemblePa
33550 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20  ge()). This.    
33560 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ** is important 
33570 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  if the parent pa
33580 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
33590 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
335a0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69  atabase.    ** i
335b0 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73  mage.  */.    as
335c0 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b  sert( nNew==1 );
335d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 4e  .    assert( apN
335e0 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20  ew[0]->nFree == 
335f0 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62 79  .        (get2by
33600 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44  te(&apNew[0]->aD
33610 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d  ata[5])-apNew[0]
33620 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e  ->cellOffset-apN
33630 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20  ew[0]->nCell*2) 
33640 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79  .    );.    copy
33650 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65  NodeContent(apNe
33660 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26  w[0], pParent, &
33670 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67  rc);.    freePag
33680 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29  e(apNew[0], &rc)
33690 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53  ;.  }else if( IS
336a0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
336b0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69    /* Fix the poi
336c0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
336d0 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c   for all the cel
336e0 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69  ls that were shi
336f0 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20  fted around. .  
33700 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73    ** There are s
33710 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
33720 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65   types of pointe
33730 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68  r-map entries th
33740 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a  at need to.    *
33750 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
33760 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
33770 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68   Some of these h
33780 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72  ave been set alr
33790 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a  eady, but.    **
337a0 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20   many have not. 
337b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
337c0 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20   a summary:.    
337d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54  **.    **   1) T
337e0 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  he entries assoc
337f0 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73  iated with new s
33800 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61  ibling pages tha
33810 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a  t were not.    *
33820 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20  *      siblings 
33830 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
33840 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54  on was called. T
33850 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64  hese have alread
33860 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65  y.    **      be
33870 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74  en set. We don't
33880 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61   need to worry a
33890 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67  bout old sibling
338a0 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20  s that were.    
338b0 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f  **      moved to
338c0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d   the free-list -
338d0 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20   the freePage() 
338e0 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63  code has taken c
338f0 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  are.    **      
33900 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a  of those..    **
33910 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65  .    **   2) The
33920 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
33930 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
33940 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f  with the first o
33950 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20  verflow.    **  
33960 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20      page in any 
33970 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20  overflow chains 
33980 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69  used by new divi
33990 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65  der cells. These
339a0 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61   .    **      ha
339b0 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20  ve also already 
339c0 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20  been taken care 
339d0 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  of by the insert
339e0 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20  Cell() code..   
339f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20   **.    **   3) 
33a00 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
33a10 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ages are not lea
33a20 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ves, then the ch
33a30 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20  ild pages of.   
33a40 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73   **      cells s
33a50 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62  tored on the sib
33a60 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e  ling pages may n
33a70 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
33a80 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
33a90 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62     4) If the sib
33aa0 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
33ab0 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b  ot internal intk
33ac0 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61  ey nodes, then a
33ad0 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  ny.    **      o
33ae0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73  verflow pages us
33af0 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c  ed by these cell
33b00 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
33b10 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20   updated.    ** 
33b20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69       (internal i
33b30 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65  ntkey nodes neve
33b40 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  r contain pointe
33b50 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  rs to overflow p
33b60 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ages)..    **.  
33b70 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65    **   5) If the
33b80 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
33b90 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
33ba0 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
33bb0 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  map.    **      
33bc0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
33bd0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65  right-child page
33be0 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e  s of each siblin
33bf0 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  g may need.    *
33c00 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64  *      to be upd
33c10 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
33c20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20   ** Cases 1 and 
33c30 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68  2 are dealt with
33c40 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20   above by other 
33c50 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20  code. The next. 
33c60 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c     ** block deal
33c70 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61  s with cases 3 a
33c80 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65  nd 4 and the one
33c90 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73   after that, cas
33ca0 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  e 5. Since.    *
33cb0 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e  * setting a poin
33cc0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73  ter map entry is
33cd0 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78   a relatively ex
33ce0 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
33cf0 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63  n, this.    ** c
33d00 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f  ode only sets po
33d10 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
33d20 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f  s for child or o
33d30 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
33d40 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61  at have.    ** a
33d50 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65  ctually moved be
33d60 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f  tween pages.  */
33d70 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
33d80 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20  ew = apNew[0];. 
33d90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
33da0 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20   = apCopy[0];.  
33db0 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20    int nOverflow 
33dc0 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
33dd0 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74  w;.    int iNext
33de0 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  Old = pOld->nCel
33df0 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  l + nOverflow;. 
33e00 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77     int iOverflow
33e10 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20   = (nOverflow ? 
33e20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
33e30 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20  dx : -1);.    j 
33e40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e60 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64   /* Current 'old
33e70 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
33e80 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20  /.    k = 0;    
33e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
33eb0 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e  ent 'new' siblin
33ec0 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f  g page */.    fo
33ed0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
33ee0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
33ef0 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20  isDivider = 0;. 
33f00 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69       while( i==i
33f10 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20  NextOld ){.     
33f20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20     /* Cell i is 
33f30 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61  the cell immedia
33f40 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
33f50 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20  he last cell on 
33f60 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  old.        ** s
33f70 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49  ibling page j. I
33f80 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
33f90 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65  re not leaf page
33fa0 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20  s of an.        
33fb0 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  ** intkey b-tree
33fc0 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61  , then cell i wa
33fd0 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
33fe0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c  . */.        pOl
33ff0 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b  d = apCopy[++j];
34000 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c  .        iNextOl
34010 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  d = i + !leafDat
34020 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  a + pOld->nCell 
34030 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  + pOld->nOverflo
34040 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  w;.        if( p
34050 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  Old->nOverflow )
34060 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65  {.          nOve
34070 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f  rflow = pOld->nO
34080 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
34090 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69     iOverflow = i
340a0 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
340b0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
340c0 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
340d0 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d       isDivider =
340e0 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20   !leafData;  .  
340f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
34100 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ert(nOverflow>0 
34110 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29  || iOverflow<i )
34120 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ;.      assert(n
34130 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f  Overflow<2 || pO
34140 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
34150 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  ==pOld->aOvfl[1]
34160 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61  .idx-1);.      a
34170 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
34180 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  3 || pOld->aOvfl
34190 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61  [1].idx==pOld->a
341a0 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a  Ovfl[2].idx-1);.
341b0 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76        if( i==iOv
341c0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
341d0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b    isDivider = 1;
341e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d  .        if( (--
341f0 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a  nOverflow)>0 ){.
34200 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
34210 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  low++;.        }
34220 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
34230 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d  if( i==cntNew[k]
34240 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
34250 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c  ell i is the cel
34260 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  l immediately fo
34270 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
34280 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20   cell on new.   
34290 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20       ** sibling 
342a0 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73  page k. If the s
342b0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
342c0 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e  leaf pages of an
342d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b  .        ** intk
342e0 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ey b-tree, then 
342f0 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69  cell i is a divi
34300 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  der cell.  */.  
34310 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
34320 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20  ew[++k];.       
34330 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29   if( !leafData )
34340 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
34350 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
34360 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20   j<nOld );.     
34370 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20   assert( k<nNew 
34380 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
34390 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69  the cell was ori
343a0 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20  ginally divider 
343b0 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74  cell (and is not
343c0 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a   now) or.      *
343d0 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  * an overflow ce
343e0 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65  ll, or if the ce
343f0 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ll was located o
34400 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69  n a different si
34410 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  bling.      ** p
34420 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  age before the b
34430 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74  alancing, then t
34440 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
34450 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
34460 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  d.      ** with 
34470 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  any child or ove
34480 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64  rflow pages need
34490 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20   to be updated. 
344a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
344b0 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d  Divider || pOld-
344c0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
344d0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
344e0 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
344f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74   ){.          pt
34500 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
34510 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29  4byte(apCell[i])
34520 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
34530 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  pNew->pgno, &rc)
34540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34550 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69      if( szCell[i
34560 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  ]>pNew->minLocal
34570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74   ){.          pt
34580 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
34590 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  New, apCell[i], 
345a0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  &rc);.        }.
345b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
345c0 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72     if( !leafCorr
345d0 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ection ){.      
345e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
345f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
34600 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74  32 key = get4byt
34610 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61  e(&apNew[i]->aDa
34620 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
34630 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b  ptrmapPut(pBt, k
34640 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ey, PTRMAP_BTREE
34650 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  , apNew[i]->pgno
34660 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  , &rc);.      }.
34670 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20      }..#if 0.   
34680 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68   /* The ptrmapCh
34690 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61  eckPages() conta
346a0 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61  ins assert() sta
346b0 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72  tements that ver
346c0 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ify that.    ** 
346d0 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  all pointer map 
346e0 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f  pages are set co
346f0 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73  rrectly. This is
34700 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a   helpful while .
34710 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67      ** debugging
34720 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
34730 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75  y disabled becau
34740 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  se a corrupt dat
34750 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a  abase may.    **
34760 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74   cause an assert
34770 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  () statement to 
34780 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74  fail.  */.    pt
34790 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61  rmapCheckPages(a
347a0 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  pNew, nNew);.   
347b0 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
347c0 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a  s(&pParent, 1);.
347d0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73  #endif.  }..  as
347e0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
347f0 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45  sInit );.  TRACE
34800 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
34810 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77  shed: old=%d new
34820 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c  =%d cells=%d\n",
34830 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c  .          nOld,
34840 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
34850 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
34860 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
34870 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
34880 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
34890 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
348a0 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
348b0 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
348c0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
348d0 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
348e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
348f0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
34900 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
34910 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  i]);.  }..  retu
34920 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
34930 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
34940 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
34950 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
34960 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
34970 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  e is.** overfull
34980 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   (has one or mor
34990 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
349a0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63  )..**.** A new c
349b0 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c  hild page is all
349c0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63  ocated and the c
349d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
349e0 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70  urrent root.** p
349f0 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  age, including o
34a00 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61  verflow cells, a
34a10 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  re copied into t
34a20 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f  he child. The ro
34a30 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68  ot.** page is th
34a40 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74  en overwritten t
34a50 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70  o make it an emp
34a60 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65  ty page with the
34a70 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a   right-child .**
34a80 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e   pointer pointin
34a90 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  g to the new pag
34aa0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  e..**.** Before 
34ab0 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70  returning, all p
34ac0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
34ad0 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
34ae0 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68   to pages .** th
34af0 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  at the new child
34b00 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69  -page now contai
34b10 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ns pointers to a
34b20 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a  re updated. The.
34b30 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70  ** entry corresp
34b40 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  onding to the ne
34b50 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f  w right-child po
34b60 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  inter of the roo
34b70 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73  t.** page is als
34b80 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  o updated..**.**
34b90 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
34ba0 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
34bb0 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66  to contain a ref
34bc0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68  erence to the ch
34bd0 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64  ild .** page and
34be0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
34bf0 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
34c00 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  case the caller 
34c10 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74  is required.** t
34c20 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
34c30 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64  ge() on *ppChild
34c40 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49   exactly once. I
34c50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
34c60 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  s,.** an error c
34c70 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
34c80 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20  and *ppChild is 
34c90 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61  set to 0..*/.sta
34ca0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
34cb0 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a  deeper(MemPage *
34cc0 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a  pRoot, MemPage *
34cd0 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74  *ppChild){.  int
34ce0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
34cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
34d00 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
34d10 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
34d20 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68  /.  MemPage *pCh
34d30 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ild = 0;        
34d40 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
34d50 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
34d60 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
34d70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
34d80 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
34d90 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
34da0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
34db0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
34dc0 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f  pRoot->pBt;    /
34dd0 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a  * The BTree */..
34de0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
34df0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a  >nOverflow>0 );.
34e00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34e10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
34e20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
34e30 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68  * Make pRoot, th
34e40 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
34e50 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61  he b-tree, writa
34e60 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20  ble. Allocate a 
34e70 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74  new .  ** page t
34e80 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
34e90 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68  the new right-ch
34ea0 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f  ild of pPage. Co
34eb0 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  py the contents.
34ec0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65    ** of the node
34ed0 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74   stored on pRoot
34ee0 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68   into the new ch
34ef0 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ild page..  */. 
34f00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
34f10 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
34f20 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
34f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34f40 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
34f50 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 26  eBtreePage(pBt,&
34f60 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c  pChild,&pgnoChil
34f70 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29  d,pRoot->pgno,0)
34f80 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f  ;.    copyNodeCo
34f90 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68  ntent(pRoot, pCh
34fa0 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  ild, &rc);.    i
34fb0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
34fc0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
34fd0 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c  ut(pBt, pgnoChil
34fe0 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  d, PTRMAP_BTREE,
34ff0 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72   pRoot->pgno, &r
35000 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
35010 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
35020 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20  pChild = 0;.    
35030 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
35040 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ld);.    return 
35050 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
35060 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
35070 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
35080 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
35090 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
350a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
350b0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
350c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  );.  assert( pCh
350d0 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f  ild->nCell==pRoo
350e0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54  t->nCell );..  T
350f0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
35100 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74  copy root %d int
35110 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e  o %d\n", pRoot->
35120 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67  pgno, pChild->pg
35130 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79  no));..  /* Copy
35140 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
35150 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74  lls from pRoot t
35160 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65  o pChild */.  me
35170 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76  mcpy(pChild->aOv
35180 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  fl, pRoot->aOvfl
35190 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  , pRoot->nOverfl
351a0 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d  ow*sizeof(pRoot-
351b0 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70  >aOvfl[0]));.  p
351c0 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Child->nOverflow
351d0 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66   = pRoot->nOverf
351e0 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  low;..  /* Zero 
351f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
35200 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74  pRoot. Then inst
35210 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68  all pChild as th
35220 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a  e right-child. *
35230 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  /.  zeroPage(pRo
35240 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ot, pChild->aDat
35250 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
35260 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
35270 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
35280 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
35290 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20   pgnoChild);..  
352a0 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c  *ppChild = pChil
352b0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
352c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
352d0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43  The page that pC
352e0 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ur currently poi
352f0 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20  nts to has just 
35300 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e  been modified in
35310 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68  .** some way. Th
35320 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75  is function figu
35330 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20  res out if this 
35340 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61  modification mea
35350 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e  ns the.** tree n
35360 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
35370 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63  ced, and if so c
35380 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72  alls the appropr
35390 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a  iate balancing .
353a0 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61  ** routine. Bala
353b0 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  ncing routines a
353c0 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61  re:.**.**   bala
353d0 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20  nce_quick().**  
353e0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
353f0 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e  ).**   balance_n
35400 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74  onroot().*/.stat
35410 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42  ic int balance(B
35420 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
35430 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35440 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  E_OK;.  const in
35450 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70  t nMin = pCur->p
35460 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a  Bt->usableSize *
35470 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61   2 / 3;.  u8 aBa
35480 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
35490 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65  13];.  u8 *pFree
354a0 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c   = 0;..  TESTONL
354b0 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  Y( int balance_q
354c0 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20  uick_called = 0 
354d0 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  );.  TESTONLY( i
354e0 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
354f0 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a  r_called = 0 );.
35500 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20  .  do {.    int 
35510 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
35520 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  age;.    MemPage
35530 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
35540 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a  apPage[iPage];..
35550 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30      if( iPage==0
35560 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
35570 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
35580 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
35590 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
355a0 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72  e b-tree is over
355b0 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61  full. In this ca
355c0 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20  se call the.    
355d0 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64      ** balance_d
355e0 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  eeper() function
355f0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
35600 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72   child for the r
35610 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
35620 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65   ** and copy the
35630 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
35640 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  s of the root-pa
35650 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20  ge to it. The.  
35660 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74        ** next it
35670 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
35680 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
35690 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61  nce the child pa
356a0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a  ge..        */ .
356b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
356c0 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f  (balance_deeper_
356d0 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
356e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
356f0 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67  ance_deeper(pPag
35700 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  e, &pCur->apPage
35710 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
35720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ){.          pCu
35740 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20  r->iPage = 1;.  
35750 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
35760 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[0] = 0;.    
35770 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
35780 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  x[1] = 0;.      
35790 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
357a0 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76  ->apPage[1]->nOv
357b0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20  erflow );.      
357c0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
357d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
357e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
357f0 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76  e if( pPage->nOv
35800 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61  erflow==0 && pPa
35810 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20  ge->nFree<=nMin 
35820 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
35830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35840 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74   MemPage * const
35850 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d   pParent = pCur-
35860 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d  >apPage[iPage-1]
35870 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73  ;.      int cons
35880 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61  t iIdx = pCur->a
35890 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a  iIdx[iPage-1];..
358a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
358b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
358c0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
358d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
358e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64  LITE_OK ){.#ifnd
358f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
35900 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20  UICKBALANCE.    
35910 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
35920 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20  asData.         
35930 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
35940 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  low==1.         
35950 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  && pPage->aOvfl[
35960 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e  0].idx==pPage->n
35970 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26  Cell.         &&
35980 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d   pParent->pgno!=
35990 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  1.         && pP
359a0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49  arent->nCell==iI
359b0 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  dx.        ){.  
359c0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20          /* Call 
359d0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
359e0 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
359f0 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65  sibling of pPage
35a00 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   on which.      
35a10 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20      ** to store 
35a20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
35a30 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  l. balance_quick
35a40 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77  () inserts a new
35a50 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20   cell.          
35a60 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c  ** into pParent,
35a70 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65   which may cause
35a80 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f   pParent overflo
35a90 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20  w. If this.     
35aa0 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c       ** happens,
35ab0 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61   the next intera
35ac0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
35ad0 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65  oop will balance
35ae0 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20   pParent .      
35af0 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65      ** use eithe
35b00 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  r balance_nonroo
35b10 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64  t() or balance_d
35b20 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74  eeper(). Until t
35b30 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
35b40 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76   happens, the ov
35b50 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73  erflow cell is s
35b60 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61  tored in the aBa
35b70 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
35b80 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  ].          ** b
35b90 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20  uffer. .        
35ba0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
35bb0 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66  * The purpose of
35bc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
35bd0 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68  ssert() is to ch
35be0 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a  eck that only a.
35bf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e            ** sin
35c00 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  gle call to bala
35c10 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d  nce_quick() is m
35c20 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c  ade for each cal
35c30 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
35c40 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
35c50 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f   If this were no
35c60 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75  t verified, a su
35c70 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69  btle bug involvi
35c80 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20  ng reuse.       
35c90 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61     ** of the aBa
35ca0 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b  lanceQuickSpace[
35cb0 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e  ] might sneak in
35cc0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
35cd0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
35ce0 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f   (balance_quick_
35cf0 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a  called++)==0 );.
35d00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
35d10 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61  alance_quick(pPa
35d20 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61  rent, pPage, aBa
35d30 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29  lanceQuickSpace)
35d40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
35d50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
35d60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
35d70 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c   this case, call
35d80 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
35d90 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75  () to redistribu
35da0 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20  te cells.       
35db0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50     ** between pP
35dc0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20  age and up to 2 
35dd0 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70  of its sibling p
35de0 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c  ages. This invol
35df0 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ves.          **
35e00 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
35e10 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65  ontents of pPare
35e20 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
35e30 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20  use pParent to. 
35e40 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f           ** beco
35e50 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
35e60 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65  nderfull. The ne
35e70 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
35e80 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20  the do-loop.    
35e90 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61        ** will ba
35ea0 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
35eb0 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74   page to correct
35ec0 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20   this..         
35ed0 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a   ** .          *
35ee0 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20  * If the parent 
35ef0 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
35f00 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66  rfull, the overf
35f10 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c  low cell or cell
35f20 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
35f30 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
35f40 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61   pSpace buffer a
35f50 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61  llocated immedia
35f60 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20  tely below. .   
35f70 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73         ** A subs
35f80 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e  equent iteration
35f90 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
35fa0 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74  will deal with t
35fb0 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20  his by.         
35fc0 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61   ** calling bala
35fd0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62  nce_nonroot() (b
35fe0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
35ff0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69  may be called fi
36000 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  rst,.          *
36010 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74  * but it doesn't
36020 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66   deal with overf
36030 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74  low cells - just
36040 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61   moves them to a
36050 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69  .          ** di
36060 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f  fferent page). O
36070 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75  nce this subsequ
36080 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ent call to bala
36090 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20  nce_nonroot() . 
360a0 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
360b0 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73  completed, it is
360c0 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65   safe to release
360d0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
360e0 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20  er used by.     
360f0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76       ** the prev
36100 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68  ious call, as th
36110 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
36120 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62  data will have b
36130 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  een .          *
36140 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20  * copied either 
36150 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  into the body of
36160 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
36170 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   or into the new
36180 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53  .          ** pS
36190 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73  pace buffer pass
361a0 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72  ed to the latter
361b0 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
361c0 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20  _nonroot()..    
361d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
361e0 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
361f0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
36200 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67  c(pCur->pBt->pag
36210 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
36220 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
36230 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20  onroot(pParent, 
36240 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50  iIdx, pSpace, iP
36250 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20  age==1);.       
36260 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
36270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
36280 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e  f pFree is not N
36290 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74  ULL, it points t
362a0 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
362b0 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20  fer used .      
362c0 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72        ** by a pr
362d0 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62  evious call to b
362e0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
362f0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61  . Its contents a
36300 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  re.            *
36310 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74  * now stored eit
36320 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61  her on real data
36330 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69  base pages or wi
36340 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  thin the .      
36350 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70        ** new pSp
36360 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69  ace buffer, so i
36370 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20  t may be safely 
36380 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20  freed here. */. 
36390 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
363a0 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
363b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  );.          }..
363c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
363d0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77   pSpace buffer w
363e0 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74  ill be freed aft
363f0 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  er the next call
36400 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
36410 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
36420 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f  (), or just befo
36430 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
36440 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65   returns, whiche
36450 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ver.          **
36460 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f   comes first. */
36470 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65  .          pFree
36480 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20   = pSpace;.     
36490 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
364a0 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
364b0 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20  flow = 0;..     
364c0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65   /* The next ite
364d0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
364e0 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74  -loop balances t
364f0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
36500 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
36510 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
36520 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d     pCur->iPage--
36530 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
36540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36550 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20  );..  if( pFree 
36560 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
36570 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  geFree(pFree);. 
36580 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
36590 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  }.../*.** Insert
365a0 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
365b0 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54  to the BTree.  T
365c0 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20  he key is given 
365d0 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a  by (pKey,nKey).*
365e0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69  * and the data i
365f0 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74  s given by (pDat
36600 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63  a,nData).  The c
36610 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e  ursor is used on
36620 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20  ly to.** define 
36630 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72  what table the r
36640 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20  ecord should be 
36650 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20  inserted into.  
36660 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
36670 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
36680 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74  t a random locat
36690 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  ion..**.** For a
366a0 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20  n INTKEY table, 
366b0 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61  only the nKey va
366c0 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69  lue of the key i
366d0 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
366e0 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
366f0 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62  r a ZERODATA tab
36700 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e  le, the pData an
36710 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68  d nData are both
36720 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
36730 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
36740 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
36750 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
36760 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20  successful call 
36770 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61  to.** MovetoUnpa
36780 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63  cked() to seek c
36790 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70  ursor pCur to (p
367a0 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61  Key, nKey) has a
367b0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
367c0 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65  erformed. seekRe
367d0 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72  sult is the sear
367e0 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e  ch result return
367f0 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a  ed (a negative.*
36800 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72  * number if pCur
36810 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e   points at an en
36820 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c  try that is smal
36830 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20  ler than (pKey, 
36840 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70  nKey), or.** a p
36850 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
36860 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
36870 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20  an etry that is 
36880 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20  larger than .** 
36890 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a  (pKey, nKey)). .
368a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65  **.** If the see
368b0 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
368c0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
368d0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 67  hen the caller g
368e0 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 2a  uarantees that.*
368f0 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  * cursor pCur is
36900 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
36910 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79 20 6f   existing copy o
36920 66 20 61 20 72 6f 77 20 74 68 61 74 20 69 73 20  f a row that is 
36930 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69  to be.** overwri
36940 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tten.  If the se
36950 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74  ekResult paramet
36960 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75  er is 0, then cu
36970 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0a 2a 2a  rsor pCur may.**
36980 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 65 6e   point to any en
36990 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74  try or to no ent
369a0 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20 73 6f  ry at all and so
369b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
369c0 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68  as to seek.** th
369d0 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65 20  e cursor before 
369e0 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e 20  the new key can 
369f0 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
36a00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
36a10 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
36a20 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
36a30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
36a40 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
36a50 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
36a60 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
36a70 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
36a80 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
36a90 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
36aa0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
36ab0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
36ac0 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
36ad0 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
36ae0 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
36af0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
36b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36b10 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
36b20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
36b30 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
36b40 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20  nt appendBias,  
36b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36b60 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
36b70 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
36b80 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52  d */.  int seekR
36b90 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
36ba0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
36bb0 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f 55  of prior MovetoU
36bc0 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20 2a  npacked() call *
36bd0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
36be0 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b 52   int loc = seekR
36bf0 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
36c00 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20 64 65  /* -1: before de
36c10 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e 20 20  sired location  
36c20 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20 20 69  +1: after */.  i
36c30 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a 20 20  nt szNew = 0;.  
36c40 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
36c50 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
36c60 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
36c70 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
36c80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
36c90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
36ca0 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
36cb0 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
36cc0 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ll = 0;..  if( p
36cd0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
36ce0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
36cf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
36d00 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
36d10 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OK );.    return
36d20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
36d30 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
36d40 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
36d50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
36d60 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
36d70 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
36d80 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
36d90 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65 61  ITE && !pBt->rea
36da0 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
36db0 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
36dc0 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43  eTableLock(p, pC
36dd0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
36de0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  ur->pKeyInfo!=0,
36df0 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73   2) );..  /* Ass
36e00 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
36e10 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ler has been con
36e20 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69 73  sistent. If this
36e30 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65 6e   cursor was open
36e40 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69 6e  ed.  ** expectin
36e50 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  g an index b-tre
36e60 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
36e70 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  er should be ins
36e80 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a  erting blob.  **
36e90 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61 73   keys with no as
36ea0 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20 49  sociated data. I
36eb0 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  f the cursor was
36ec0 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69 6e   opened expectin
36ed0 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65 79  g an.  ** intkey
36ee0 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c 6c   table, the call
36ef0 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  er should be ins
36f00 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20 6b  erting integer k
36f10 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a 20  eys with a.  ** 
36f20 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61 74  blob of associat
36f30 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 61  ed data.  */.  a
36f40 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30 29  ssert( (pKey==0)
36f50 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
36f60 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
36f70 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 73  f this is an ins
36f80 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ert into a table
36f90 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69 64   b-tree, invalid
36fa0 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
36fb0 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f   .  ** cursors o
36fc0 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 62  pen on the row b
36fd0 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28 61  eing replaced (a
36fe0 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20  ssuming this is 
36ff0 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f  a replace.  ** o
37000 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69 74  peration - if it
37010 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c   is not, the fol
37020 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f  lowing is a no-o
37030 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  p).  */.  if( pC
37040 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
37050 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
37060 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
37070 28 70 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20  (p, nKey, 0);.  
37080 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
37090 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
370a0 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
370b0 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
370c0 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  le..  **.  ** In
370d0 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
370e0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 4d 6f   call to btreeMo
370f0 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69 73 20  veto() below is 
37100 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a  a no-op. For.  *
37110 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  * example, when 
37120 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61 20 69  inserting data i
37130 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68  nto a table with
37140 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20   auto-generated 
37150 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79  integer.  ** key
37160 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61 79 65  s, the VDBE laye
37170 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  r invokes sqlite
37180 33 42 74 72 65 65 4c 61 73 74 28 29 20 74 6f 20  3BtreeLast() to 
37190 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 0a  figure out the .
371a0 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b 65 79    ** integer key
371b0 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68 65 6e   to use. It then
371c0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
371d0 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79  tion to actually
371e0 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20 20 2a   insert the .  *
371f0 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  * data into the 
37200 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e 20 49  intkey B-Tree. I
37210 6e 20 74 68 69 73 20 63 61 73 65 20 62 74 72 65  n this case btre
37220 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f 67 6e  eMoveto() recogn
37230 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 74  izes.  ** that t
37240 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
37250 65 61 64 79 20 77 68 65 72 65 20 69 74 20 6e 65  eady where it ne
37260 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20 72 65  eds to be and re
37270 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a 20 20  turns without.  
37280 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ** doing any wor
37290 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 77 61  k. To avoid thwa
372a0 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70 74 69  rting these opti
372b0 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69 73  mizations, it is
372c0 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20   important.  ** 
372d0 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74 68 65  not to clear the
372e0 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a 20 20   cursor here..  
372f0 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  */.  rc = saveAl
37300 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
37310 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
37320 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ur);.  if( rc ) 
37330 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
37340 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72 63 20   !loc ){.    rc 
37350 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
37360 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ur, pKey, nKey, 
37370 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63  appendBias, &loc
37380 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
37390 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
373a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
373b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
373c0 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e 65 53  LID || (pCur->eS
373d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
373e0 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29 3b 0a  ALID && loc) );.
373f0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
37400 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
37410 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
37420 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c  pPage->intKey ||
37430 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
37440 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
37450 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74  f || !pPage->int
37460 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  Key );..  TRACE(
37470 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d  ("INSERT: table=
37480 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61  %d nkey=%lld nda
37490 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73  ta=%d page=%d %s
374a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
374b0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
374c0 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67  Key, nData, pPag
374d0 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  e->pgno,.       
374e0 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65     loc==0 ? "ove
374f0 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65  rwrite" : "new e
37500 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72  ntry"));.  asser
37510 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
37520 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65   );.  allocateTe
37530 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
37540 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70  newCell = pBt->p
37550 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20  TmpSpace;.  if( 
37560 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  newCell==0 ) ret
37570 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
37580 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43  ;.  rc = fillInC
37590 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65  ell(pPage, newCe
375a0 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ll, pKey, nKey, 
375b0 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a  pData, nData, nZ
375c0 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20  ero, &szNew);.  
375d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
375e0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65  d_insert;.  asse
375f0 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53  rt( szNew==cellS
37600 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65  izePtr(pPage, ne
37610 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  wCell) );.  asse
37620 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45  rt( szNew<=MX_CE
37630 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
37640 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69    idx = pCur->ai
37650 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
37660 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29  ;.  if( loc==0 )
37670 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b  {.    u16 szOld;
37680 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
37690 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
376a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
376b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
376c0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
376d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
376e0 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
376f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43  ;.    }.    oldC
37700 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
37710 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
37720 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
37730 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
37740 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c  (newCell, oldCel
37750 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 4);.    }.   
37760 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a   szOld = cellSiz
37770 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43  ePtr(pPage, oldC
37780 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ell);.    rc = c
37790 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
377a0 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 64 72  oldCell);.    dr
377b0 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, id
377c0 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a  x, szOld, &rc);.
377d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
377e0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
377f0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
37800 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
37810 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
37820 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
37830 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72      idx = ++pCur
37840 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
37850 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age];.  }else{. 
37860 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
37870 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
37880 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
37890 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20  , idx, newCell, 
378a0 73 7a 4e 65 77 2c 20 30 2c 20 30 2c 20 26 72 63  szNew, 0, 0, &rc
378b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
378c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
378d0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
378e0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
378f0 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  >0 );..  /* If n
37900 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
37910 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68 61  red and pPage ha
37920 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  s an overflow ce
37930 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ll, call balance
37940 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69  () .  ** to redi
37950 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65 6c  stribute the cel
37960 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  ls within the tr
37970 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63  ee. Since balanc
37980 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a  e() may move.  *
37990 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65  * the cursor, ze
379a0 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  ro the BtCursor.
379b0 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42  info.nSize and B
379c0 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65  tCursor.validNKe
379d0 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  y.  ** variables
379e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76  ..  **.  ** Prev
379f0 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
37a00 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d   SQLite called m
37a10 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d  oveToRoot() to m
37a20 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20  ove the cursor. 
37a30 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20   ** back to the 
37a40 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c  root page as bal
37a50 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20 69  ance() used to i
37a60 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f  nvalidate the co
37a70 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42  ntents.  ** of B
37a80 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d  tCursor.apPage[]
37a90 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69   and BtCursor.ai
37aa0 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f  Idx[]. Instead o
37ab0 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20  f doing that,.  
37ac0 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  ** set the curso
37ad0 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61  r state to "inva
37ae0 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73  lid". This makes
37af0 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f   common insert o
37b00 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73  perations.  ** s
37b10 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a  lightly faster..
37b20 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20    **.  ** There 
37b30 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74 20  is a subtle but 
37b40 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69  important optimi
37b50 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e  zation here too.
37b60 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a   When inserting.
37b70 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65    ** multiple re
37b80 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e  cords into an in
37b90 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e  tkey b-tree usin
37ba0 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f  g a single curso
37bb0 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68  r (as can.  ** h
37bc0 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63  appen while proc
37bd0 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52  essing an "INSER
37be0 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43  T INTO ... SELEC
37bf0 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69  T" statement), i
37c00 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74  t.  ** is advant
37c10 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20  ageous to leave 
37c20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
37c30 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
37c40 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68  entry in.  ** th
37c50 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73  e b-tree if poss
37c60 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72  ible. If the cur
37c70 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
37c80 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
37c90 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  .  ** entry in t
37ca0 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  he table, and th
37cb0 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72  e next row inser
37cc0 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67  ted has an integ
37cd0 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67  er key.  ** larg
37ce0 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
37cf0 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79  est existing key
37d00 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
37d10 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20   to insert the. 
37d20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20   ** row without 
37d30 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73  seeking the curs
37d40 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20  or. This can be 
37d50 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63  a big performanc
37d60 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20  e boost..  */.  
37d70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
37d80 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
37d90 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
37da0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37db0 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
37dc0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d  flow ){.    rc =
37dd0 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a   balance(pCur);.
37de0 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b  .    /* Must mak
37df0 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77  e sure nOverflow
37e00 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72   is reset to zer
37e10 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61  o even if the ba
37e20 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66  lance().    ** f
37e30 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64  ails. Internal d
37e40 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
37e50 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65  rruption will re
37e60 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20  sult otherwise. 
37e70 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65  .    ** Also, se
37e80 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  t the cursor sta
37e90 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54  te to invalid. T
37ea0 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43 75  his stops saveCu
37eb0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20  rsorPosition(). 
37ec0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
37ed0 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63 75  g to save the cu
37ee0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
37ef0 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a  f the cursor.  *
37f00 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  /.    pCur->apPa
37f10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
37f20 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
37f30 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
37f40 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
37f50 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  D;.  }.  assert(
37f60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
37f70 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
37f80 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64  rflow==0 );..end
37f90 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
37fa0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
37fb0 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
37fc0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
37fd0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
37fe0 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
37ff0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
38000 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c  at a arbitrary l
38010 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ocation..*/.int 
38020 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
38030 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  te(BtCursor *pCu
38040 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  r){.  Btree *p =
38050 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
38060 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
38070 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
38080 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b        .  int rc;
38090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
380a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
380b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
380c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
380d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
380e0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
380f0 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72  o delete cell fr
38100 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  om */.  unsigned
38110 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20   char *pCell;   
38120 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38130 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20  Pointer to cell 
38140 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
38150 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20  nt iCellIdx;    
38160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38170 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
38180 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
38190 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70  /.  int iCellDep
381a0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
381b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74           /* Dept
381c0 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69  h of node contai
381d0 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a  ning pCell */ ..
381e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
381f0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
38200 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
38210 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
38220 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
38230 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
38240 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
38250 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
38260 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lag );.  assert(
38270 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
38280 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72  ableLock(p, pCur
38290 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
382a0 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32  ->pKeyInfo!=0, 2
382b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
382c0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
382d0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
382e0 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ot) );..  if( NE
382f0 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b  VER(pCur->aiIdx[
38300 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43  pCur->iPage]>=pC
38310 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
38320 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20  >iPage]->nCell) 
38330 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75  .   || NEVER(pCu
38340 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
38350 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20  R_VALID).  ){.  
38360 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
38370 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74  ERROR;  /* Somet
38380 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77  hing has gone aw
38390 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ry. */.  }..  /*
383a0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65   If this is a de
383b0 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74  lete operation t
383c0 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66  o remove a row f
383d0 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72  rom a table b-tr
383e0 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64  ee,.  ** invalid
383f0 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
38400 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
38410 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64   the row being d
38420 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66  eleted.  */.  if
38430 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  ( pCur->pKeyInfo
38440 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c  ==0 ){.    inval
38450 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateI