/ Hex Artifact Content
Login

Artifact 39f1375c02ea2d201bd09efcc09dcbb7ebce241280fa17bb7aa4ef7cc718061c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20  LE_STMTVTAB.int 
0380: 73 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49  sqlite3StmtVtabI
0390: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23  nit(sqlite3*);.#
03a0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
03b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a  ITE_ENABLE_FTS5.
03c0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
03d0: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23  nit(sqlite3*);.#
03e0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
03f0: 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49  QLITE_AMALGAMATI
0400: 4f 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  ON./* IMPLEMENTA
0410: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36  TION-OF: R-46656
0420: 2d 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74  -45156 The sqlit
0430: 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72  e3_version[] str
0440: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  ing constant.** 
0450: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78  contains the tex
0460: 74 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53  t of SQLITE_VERS
0470: 49 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63  ION macro. .*/.c
0480: 6f 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65  onst char sqlite
0490: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51  3_version[] = SQ
04a0: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65  LITE_VERSION;.#e
04b0: 6e 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  ndif../* IMPLEME
04c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33  NTATION-OF: R-53
04d0: 35 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71  536-42575 The sq
04e0: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
04f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0500: 72 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  rns.** a pointer
0510: 20 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73   to the to the s
0520: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d  qlite3_version[]
0530: 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74   string constant
0540: 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  . .*/.const char
0550: 20 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72   *sqlite3_libver
0560: 73 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75  sion(void){ retu
0570: 72 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rn sqlite3_versi
0580: 6f 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d  on; }../* IMPLEM
0590: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36  ENTATION-OF: R-6
05a0: 33 31 32 34 2d 33 39 33 30 30 20 54 68 65 20 73  3124-39300 The s
05b0: 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
05c0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
05d0: 6e 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  ns a.** pointer 
05e0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73  to a string cons
05f0: 74 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65  tant whose value
0600: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
0610: 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f  the.** SQLITE_SO
0620: 55 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f  URCE_ID C prepro
0630: 63 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 0a 2a  cessor macro. .*
0640: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
0650: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 76  lite3_sourceid(v
0660: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c  oid){ return SQL
0670: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 3b 20 7d  ITE_SOURCE_ID; }
0680: 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  ../* IMPLEMENTAT
0690: 49 4f 4e 2d 4f 46 3a 20 52 2d 33 35 32 31 30 2d  ION-OF: R-35210-
06a0: 36 33 35 30 38 20 54 68 65 20 73 71 6c 69 74 65  63508 The sqlite
06b0: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
06c0: 62 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  ber() function.*
06d0: 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74  * returns an int
06e0: 65 67 65 72 20 65 71 75 61 6c 20 74 6f 20 53 51  eger equal to SQ
06f0: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
0700: 42 45 52 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  BER..*/.int sqli
0710: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
0720: 75 6d 62 65 72 28 76 6f 69 64 29 7b 20 72 65 74  umber(void){ ret
0730: 75 72 6e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  urn SQLITE_VERSI
0740: 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a  ON_NUMBER; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 32 30 37 39 30 2d 31 34 30 32  OF: R-20790-1402
0770: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 74 68  5 The sqlite3_th
0780: 72 65 61 64 73 61 66 65 28 29 20 66 75 6e 63 74  readsafe() funct
0790: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a  ion returns.** z
07a0: 65 72 6f 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  ero if and only 
07b0: 69 66 20 53 51 4c 69 74 65 20 77 61 73 20 63 6f  if SQLite was co
07c0: 6d 70 69 6c 65 64 20 77 69 74 68 20 6d 75 74 65  mpiled with mute
07d0: 78 69 6e 67 20 63 6f 64 65 20 6f 6d 69 74 74 65  xing code omitte
07e0: 64 20 64 75 65 20 74 6f 0a 2a 2a 20 74 68 65 20  d due to.** the 
07f0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
0800: 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
0810: 70 74 69 6f 6e 20 62 65 69 6e 67 20 73 65 74 20  ption being set 
0820: 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
0830: 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28  ite3_threadsafe(
0840: 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51  void){ return SQ
0850: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b  LITE_THREADSAFE;
0860: 20 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63   }../*.** When c
0870: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 74 65 73  ompiling the tes
0880: 74 20 66 69 78 74 75 72 65 20 6f 72 20 77 69 74  t fixture or wit
0890: 68 20 64 65 62 75 67 67 69 6e 67 20 65 6e 61 62  h debugging enab
08a0: 6c 65 64 20 28 6f 6e 20 57 69 6e 33 32 29 2c 0a  led (on Win32),.
08b0: 2a 2a 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ** this variable
08c0: 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 6e 6f   being set to no
08d0: 6e 2d 7a 65 72 6f 20 77 69 6c 6c 20 63 61 75 73  n-zero will caus
08e0: 65 20 4f 53 54 52 41 43 45 20 6d 61 63 72 6f 73  e OSTRACE macros
08f0: 20 74 6f 20 65 6d 69 74 0a 2a 2a 20 65 78 74 72   to emit.** extr
0900: 61 20 64 69 61 67 6e 6f 73 74 69 63 20 69 6e 66  a diagnostic inf
0910: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  ormation..*/.#if
0920: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
0930: 4f 53 5f 54 52 41 43 45 0a 23 20 69 66 6e 64 65  OS_TRACE.# ifnde
0940: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  f SQLITE_DEBUG_O
0950: 53 5f 54 52 41 43 45 0a 23 20 20 20 64 65 66 69  S_TRACE.#   defi
0960: 6e 65 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f  ne SQLITE_DEBUG_
0970: 4f 53 5f 54 52 41 43 45 20 30 0a 23 20 65 6e 64  OS_TRACE 0.# end
0980: 69 66 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  if.  int sqlite3
0990: 4f 53 54 72 61 63 65 20 3d 20 53 51 4c 49 54 45  OSTrace = SQLITE
09a0: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 3b  _DEBUG_OS_TRACE;
09b0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
09c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
09d0: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
09e0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
09f0: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  g function point
0a20: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  er is not NULL a
0a30: 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45 5f  nd if.** SQLITE_
0a40: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 69  ENABLE_IOTRACE i
0a50: 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
0a60: 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69 62  messages describ
0a70: 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69 76  ing.** I/O activ
0a80: 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75 73  e are written us
0a90: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
0aa0: 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61 67  n.  These messag
0ab0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 64  es.** are intend
0ac0: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
0ad0: 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e 0a   activity only..
0ae0: 2a 2f 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f  */.SQLITE_API vo
0af0: 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  id (SQLITE_CDECL
0b00: 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65   *sqlite3IoTrace
0b10: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e  )(const char*, .
0b20: 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ..) = 0;.#endif.
0b30: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
0b40: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
0b50: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
0b60: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
0b70: 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
0b80: 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  of a directory, 
0b90: 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74  then that direct
0ba0: 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ory will be used
0bb0: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
0bc0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
0bd0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0be0: 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
0bf0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0c00: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0c10: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d  har *sqlite3_tem
0c20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
0c30: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
0c40: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
0c50: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
0c60: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  to a string whic
0c70: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  h is the.** name
0c80: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c   of a directory,
0c90: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63   then that direc
0ca0: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65  tory will be use
0cb0: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 61 6c  d to store.** al
0cc0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
0cd0: 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20   specified with 
0ce0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
0cf0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ame..**.** See a
0d00: 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20  lso the "PRAGMA 
0d10: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
0d20: 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e  tory" SQL comman
0d30: 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  d..*/.char *sqli
0d40: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
0d50: 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ry = 0;../*.** I
0d60: 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69 74 65  nitialize SQLite
0d70: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
0d80: 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
0d90: 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69 61 6c  alled to initial
0da0: 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ize the memory a
0db0: 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46  llocation,.** VF
0dc0: 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62  S, and mutex sub
0dd0: 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20 74 6f  systems prior to
0de0: 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72 69 6f   doing any serio
0df0: 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20  us work with.** 
0e00: 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61 73 20  SQLite.  But as 
0e10: 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f 20 6e  long as you do n
0e20: 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ot compile with 
0e30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
0e40: 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75  INIT.** this rou
0e50: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
0e60: 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  led automaticall
0e70: 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69 6e 65  y by key routine
0e80: 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c  s such as.** sql
0e90: 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a  ite3_open().  .*
0ea0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0eb0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63  e is a no-op exc
0ec0: 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72 79 20  ept on its very 
0ed0: 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72 20 74  first call for t
0ee0: 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f  he process,.** o
0ef0: 72 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  r for the first 
0f00: 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63 61 6c  call after a cal
0f10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 68 75  l to sqlite3_shu
0f20: 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tdown..**.** The
0f30: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 74 6f   first thread to
0f40: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
0f50: 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e 69 74  ne runs the init
0f60: 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a  ialization to.**
0f70: 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66   completion.  If
0f80: 20 73 75 62 73 65 71 75 65 6e 74 20 74 68 72 65   subsequent thre
0f90: 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  ads call this ro
0fa0: 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74 68 65  utine before the
0fb0: 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65 61 64   first.** thread
0fc0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 74 68   has finished th
0fd0: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
0fe0: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 74   process, then t
0ff0: 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  he subsequent.**
1000: 20 74 68 72 65 61 64 73 20 6d 75 73 74 20 62 6c   threads must bl
1010: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ock until the fi
1020: 72 73 74 20 74 68 72 65 61 64 20 66 69 6e 69 73  rst thread finis
1030: 68 65 73 20 77 69 74 68 20 74 68 65 20 69 6e 69  hes with the ini
1040: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a  tialization..**.
1050: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 68 72  ** The first thr
1060: 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c 20 74  ead might call t
1070: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75  his routine recu
1080: 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75 72 73  rsively.  Recurs
1090: 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ive.** calls to 
10a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
10b0: 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f  uld not block, o
10c0: 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68 65 72  f course.  Other
10d0: 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74  wise the.** init
10e0: 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65  ialization proce
10f0: 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 63  ss would never c
1100: 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c  omplete..**.** L
1110: 65 74 20 58 20 62 65 20 74 68 65 20 66 69 72 73  et X be the firs
1120: 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e 74 65  t thread to ente
1130: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  r this routine. 
1140: 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65 20 6f   Let Y be some o
1150: 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20  ther.** thread. 
1160: 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68 65 20   Then while the 
1170: 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61 74 69  initial invocati
1180: 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  on of this routi
1190: 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e  ne by X is.** in
11a0: 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69 73 20  complete, it is 
11b0: 72 65 71 75 69 72 65 64 20 74 68 61 74 3a 0a 2a  required that:.*
11c0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73  *.**    *  Calls
11d0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
11e0: 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f   from Y must blo
11f0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f 75 74  ck until the out
1200: 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20  er-most.**      
1210: 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c   call by X compl
1220: 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  etes..**.**    *
1230: 20 20 52 65 63 75 72 73 69 76 65 20 63 61 6c 6c    Recursive call
1240: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
1250: 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20 58 20  e from thread X 
1260: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
1270: 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68  ly.**       with
1280: 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  out blocking..*/
1290: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 69  .int sqlite3_ini
12a0: 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20  tialize(void){. 
12b0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
12c0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
12d0: 73 74 65 72 3b 20 29 20 20 20 20 20 20 20 2f 2a  ster; )       /*
12e0: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
12f0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20   mutex */.  int 
1300: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1330: 6c 74 20 63 6f 64 65 20 2a 2f 0a 23 69 66 64 65  lt code */.#ifde
1340: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1350: 4e 49 54 0a 20 20 69 6e 74 20 62 52 75 6e 45 78  NIT.  int bRunEx
1360: 74 72 61 49 6e 69 74 20 3d 20 30 3b 20 20 20 20  traInit = 0;    
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 69 74     /* Extra init
1390: 69 61 6c 69 7a 61 74 69 6f 6e 20 6e 65 65 64 65  ialization neede
13a0: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  d */.#endif..#if
13b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13c0: 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  WSD.  rc = sqlit
13d0: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
13e0: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
13f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1400: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1410: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1420: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1430: 73 73 65 72 74 28 29 20 66 61 69 6c 73 20 6f 6e  ssert() fails on
1440: 20 73 6f 6d 65 20 6f 62 73 63 75 72 65 20 70 72   some obscure pr
1450: 6f 63 65 73 73 6f 72 2f 63 6f 6d 70 69 6c 65 72  ocessor/compiler
1460: 0a 20 20 2a 2a 20 63 6f 6d 62 69 6e 61 74 69 6f  .  ** combinatio
1470: 6e 2c 20 74 68 65 20 77 6f 72 6b 2d 61 72 6f 75  n, the work-arou
1480: 6e 64 20 69 73 20 74 6f 20 73 65 74 20 74 68 65  nd is to set the
1490: 20 63 6f 72 72 65 63 74 20 70 6f 69 6e 74 65 72   correct pointer
14a0: 0a 20 20 2a 2a 20 73 69 7a 65 20 61 74 20 63 6f  .  ** size at co
14b0: 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
14c0: 20 2d 44 53 51 4c 49 54 45 5f 50 54 52 53 49 5a   -DSQLITE_PTRSIZ
14d0: 45 3d 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  E=n compile-time
14e0: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73   option */.  ass
14f0: 65 72 74 28 20 53 51 4c 49 54 45 5f 50 54 52 53  ert( SQLITE_PTRS
1500: 49 5a 45 3d 3d 73 69 7a 65 6f 66 28 63 68 61 72  IZE==sizeof(char
1510: 2a 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  *) );..  /* If S
1520: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
1530: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74   completely init
1540: 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74 68  ialized, then th
1550: 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20  is call.  ** to 
1560: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1570: 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65 20 61  ze() should be a
1580: 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68 65   no-op.  But the
1590: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
15a0: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d    ** must be com
15b0: 70 6c 65 74 65 2e 20 20 53 6f 20 69 73 49 6e 69  plete.  So isIni
15c0: 74 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 73 65  t must not be se
15d0: 74 20 75 6e 74 69 6c 20 74 68 65 20 76 65 72 79  t until the very
15e0: 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69   end.  ** of thi
15f0: 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  s routine..  */.
1600: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1610: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1620: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1630: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  _OK;..  /* Make 
1640: 73 75 72 65 20 74 68 65 20 6d 75 74 65 78 20 73  sure the mutex s
1650: 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74  ubsystem is init
1660: 69 61 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e 61  ialized.  If una
1670: 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69  ble to .  ** ini
1680: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65  tialize the mute
1690: 78 20 73 75 62 73 79 73 74 65 6d 2c 20 72 65 74  x subsystem, ret
16a0: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 20 74  urn early with t
16b0: 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49  he error..  ** I
16c0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 69 73 20  f the system is 
16d0: 73 6f 20 73 69 63 6b 20 74 68 61 74 20 77 65 20  so sick that we 
16e0: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c  are unable to al
16f0: 6c 6f 63 61 74 65 20 61 20 6d 75 74 65 78 2c 0a  locate a mutex,.
1700: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f    ** there is no
1710: 74 20 6d 75 63 68 20 53 51 4c 69 74 65 20 69 73  t much SQLite is
1720: 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 61 62 6c   going to be abl
1730: 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20  e to do..  **.  
1740: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 73 75 62  ** The mutex sub
1750: 73 79 73 74 65 6d 20 6d 75 73 74 20 74 61 6b 65  system must take
1760: 20 63 61 72 65 20 6f 66 20 73 65 72 69 61 6c 69   care of seriali
1770: 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a  zing its own.  *
1780: 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  * initialization
1790: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
17a0: 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29  lite3MutexInit()
17b0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
17c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e  urn rc;..  /* In
17d0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c  itialize the mal
17e0: 6c 6f 63 28 29 20 73 79 73 74 65 6d 20 61 6e 64  loc() system and
17f0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
1800: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1810: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61  .  ** This opera
1820: 74 69 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65  tion is protecte
1830: 64 20 62 79 20 74 68 65 20 53 54 41 54 49 43 5f  d by the STATIC_
1840: 4d 41 53 54 45 52 20 6d 75 74 65 78 2e 20 20 4e  MASTER mutex.  N
1850: 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75  ote that.  ** Mu
1860: 74 65 78 41 6c 6c 6f 63 28 29 20 69 73 20 63 61  texAlloc() is ca
1870: 6c 6c 65 64 20 66 6f 72 20 61 20 73 74 61 74 69  lled for a stati
1880: 63 20 6d 75 74 65 78 20 70 72 69 6f 72 20 74 6f  c mutex prior to
1890: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
18a0: 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75  e.  ** malloc su
18b0: 62 73 79 73 74 65 6d 20 2d 20 74 68 69 73 20 69  bsystem - this i
18c0: 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
18d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  allocation of a 
18e0: 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65  static.  ** mute
18f0: 78 20 6d 75 73 74 20 6e 6f 74 20 72 65 71 75 69  x must not requi
1900: 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  re support from 
1910: 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79  the malloc subsy
1920: 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54  stem..  */.  MUT
1930: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
1940: 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
1950: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1960: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
1970: 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
1980: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
1990: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c  er);.  sqlite3Gl
19a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74  obalConfig.isMut
19b0: 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66  exInit = 1;.  if
19c0: 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ( !sqlite3Global
19d0: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
19e0: 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nit ){.    rc = 
19f0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69  sqlite3MallocIni
1a00: 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  t();.  }.  if( r
1a10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1a30: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
1a40: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  Init = 1;.    if
1a50: 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ( !sqlite3Global
1a60: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a70: 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
1a80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a90: 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20  InitMutex =.    
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75         sqlite3Mu
1ab0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1ac0: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
1ad0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1ae0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1af0: 62 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73  bCoreMutex && !s
1b00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b10: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1b30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b50: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1b60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1b70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b80: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b  g.nRefInitMutex+
1b90: 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
1ba0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
1bb0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ster);..  /* If 
1bc0: 72 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  rc is not SQLITE
1bd0: 5f 4f 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e  _OK at this poin
1be0: 74 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20 74  t, then either t
1bf0: 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73  he malloc.  ** s
1c00: 75 62 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e  ubsystem could n
1c10: 6f 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ot be initialize
1c20: 64 20 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20  d or the system 
1c30: 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61  failed to alloca
1c40: 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69  te.  ** the pIni
1c50: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65  tMutex mutex. Re
1c60: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e  turn an error in
1c70: 20 65 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a   either case.  *
1c80: 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
1c90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1ca0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
1cb0: 2a 20 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66  * Do the rest of
1cc0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1cd0: 69 6f 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65  ion under the re
1ce0: 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f  cursive mutex so
1cf0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69  .  ** that we wi
1d00: 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61  ll be able to ha
1d10: 6e 64 6c 65 20 72 65 63 75 72 73 69 76 65 20 63  ndle recursive c
1d20: 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  alls into.  ** s
1d30: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1d40: 65 28 29 2e 20 20 54 68 65 20 72 65 63 75 72 73  e().  The recurs
1d50: 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c  ive calls normal
1d60: 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a  ly come through.
1d70: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f    ** sqlite3_os_
1d80: 69 6e 69 74 28 29 20 77 68 65 6e 20 69 74 20 69  init() when it i
1d90: 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76  nvokes sqlite3_v
1da0: 66 73 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62  fs_register(), b
1db0: 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65  ut other.  ** re
1dc0: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69  cursive calls mi
1dd0: 67 68 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73  ght also be poss
1de0: 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ible..  **.  ** 
1df0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
1e00: 46 3a 20 52 2d 30 30 31 34 30 2d 33 37 34 34 35  F: R-00140-37445
1e10: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
1e20: 63 61 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65 73  cally serializes
1e30: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74   calls.  ** to t
1e40: 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c  he xInit method,
1e50: 20 73 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65   so the xInit me
1e60: 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62 65  thod need not be
1e70: 20 74 68 72 65 61 64 73 61 66 65 2e 0a 20 20 2a   threadsafe..  *
1e80: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
1e90: 77 69 6e 67 20 6d 75 74 65 78 20 69 73 20 77 68  wing mutex is wh
1ea0: 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 61 63  at serializes ac
1eb0: 63 65 73 73 20 74 6f 20 74 68 65 20 61 70 70 64  cess to the appd
1ec0: 65 66 20 70 63 61 63 68 65 20 78 49 6e 69 74 0a  ef pcache xInit.
1ed0: 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54    ** methods.  T
1ee0: 68 65 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  he sqlite3_pcach
1ef0: 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74 28  e_methods.xInit(
1f00: 29 20 61 6c 6c 20 69 73 20 65 6d 62 65 64 64 65  ) all is embedde
1f10: 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61  d in the.  ** ca
1f20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61  ll to sqlite3Pca
1f30: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e  cheInitialize().
1f40: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1f50: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
1f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f70: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69  pInitMutex);.  i
1f80: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1f90: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
1fa0: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
1fb0: 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65  lConfig.inProgre
1fc0: 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ss==0 ){.    sql
1fd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1fe0: 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b  .inProgress = 1;
1ff0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2000: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20  NABLE_SQLLOG.   
2010: 20 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20   {.      extern 
2020: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 69  void sqlite3_ini
2030: 74 5f 73 71 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a  t_sqllog(void);.
2040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
2050: 69 74 5f 73 71 6c 6c 6f 67 28 29 3b 0a 20 20 20  it_sqllog();.   
2060: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65   }.#endif.    me
2070: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 42 75 69  mset(&sqlite3Bui
2080: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2c 20 30  ltinFunctions, 0
2090: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
20a0: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
20b0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  ));.    sqlite3R
20c0: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
20d0: 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69  nctions();.    i
20e0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
20f0: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
2100: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
2110: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
2120: 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  heInitialize();.
2130: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2140: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2150: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2160: 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68  alConfig.isPCach
2170: 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  eInit = 1;.     
2180: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49   rc = sqlite3OsI
2190: 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nit();.    }.   
21a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
21c0: 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53  te3PCacheBufferS
21d0: 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f  etup( sqlite3Glo
21e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c  balConfig.pPage,
21f0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
2200: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2210: 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47  szPage, sqlite3G
2220: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
2230: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
2240: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2250: 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66  Init = 1;.#ifdef
2260: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e   SQLITE_EXTRA_IN
2270: 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74  IT.      bRunExt
2280: 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64  raInit = 1;.#end
2290: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  if.    }.    sql
22a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
22b0: 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  .inProgress = 0;
22c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
22d0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
22e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
22f0: 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  InitMutex);..  /
2300: 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20  * Go back under 
2310: 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78  the static mutex
2320: 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68   and clean up th
2330: 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a  e recursive.  **
2340: 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e   mutex to preven
2350: 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61  t a resource lea
2360: 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  k..  */.  sqlite
2370: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
2380: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
2390: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
23a0: 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20  efInitMutex--;. 
23b0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
23c0: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
23d0: 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20  tMutex<=0 ){.   
23e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2400: 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b  fInitMutex==0 );
2410: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
2420: 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47  ex_free(sqlite3G
2430: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2440: 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c  tMutex);.    sql
2450: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2460: 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b  .pInitMutex = 0;
2470: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
2480: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
2490: 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  er);..  /* The f
24a0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74  ollowing is just
24b0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20   a sanity check 
24c0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c  to make sure SQL
24d0: 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65  ite has.  ** bee
24e0: 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65  n compiled corre
24f0: 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70  ctly.  It is imp
2500: 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  ortant to run th
2510: 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a  is code, but.  *
2520: 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
2530: 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66  to run it too of
2540: 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20  ten and soak up 
2550: 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e  CPU cycles for n
2560: 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20  o.  ** reason.  
2570: 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63  So we run it onc
2580: 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c  e during initial
2590: 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ization..  */.#i
25a0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66  fndef NDEBUG.#if
25b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25c0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
25d0: 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f    /* This sectio
25e0: 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79  n of code's only
25f0: 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61   "output" is via
2600: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
2610: 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20  ents. */.  if ( 
2620: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2630: 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28  .    u64 x = (((
2640: 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20  u64)1)<<63)-1;. 
2650: 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20     double y;.   
2660: 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78   assert(sizeof(x
2670: 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72  )==8);.    asser
2680: 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a  t(sizeof(x)==siz
2690: 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d  eof(y));.    mem
26a0: 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a  cpy(&y, &x, 8);.
26b0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
26c0: 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20  te3IsNaN(y) );. 
26d0: 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66   }.#endif.#endif
26e0: 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20  ..  /* Do extra 
26f0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73  initialization s
2700: 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62  teps requested b
2710: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54  y the SQLITE_EXT
2720: 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d  RA_INIT.  ** com
2730: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
2740: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
2750: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
2760: 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49    if( bRunExtraI
2770: 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53  nit ){.    int S
2780: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2790: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  (const char*);. 
27a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
27b0: 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20  XTRA_INIT(0);.  
27c0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
27d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27e0: 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73  Undo the effects
27f0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   of sqlite3_init
2800: 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20  ialize().  Must 
2810: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68  not be called wh
2820: 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  ile.** there are
2830: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74   outstanding dat
2840: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2850: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2860: 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68  cations or.** wh
2870: 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20  ile any part of 
2880: 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77  SQLite is otherw
2890: 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e  ise in use in an
28a0: 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a  y thread.  This.
28b0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  ** routine is no
28c0: 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42  t threadsafe.  B
28d0: 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  ut it is safe to
28e0: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
28f0: 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20  tine.** on when 
2900: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
2910: 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66  y shut down.  If
2920: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2930: 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20  dy shut down.** 
2940: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2950: 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68  e is invoked, th
2960: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2970: 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
2980: 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
2990: 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69  te3_shutdown(voi
29a0: 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d){.#ifdef SQLIT
29b0: 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e 74  E_OMIT_WSD.  int
29c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73   rc = sqlite3_ws
29d0: 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29  d_init(4096, 24)
29e0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
29f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
2a00: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
2a10: 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  if..  if( sqlite
2a20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2a30: 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53  Init ){.#ifdef S
2a40: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2a50: 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51  DOWN.    void SQ
2a60: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2a70: 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53  OWN(void);.    S
2a80: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2a90: 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20  DOWN();.#endif. 
2aa0: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e     sqlite3_os_en
2ab0: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2ac0: 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65  _reset_auto_exte
2ad0: 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c  nsion();.    sql
2ae0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2af0: 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  .isInit = 0;.  }
2b00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2b10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
2b20: 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  cheInit ){.    s
2b30: 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74  qlite3PcacheShut
2b40: 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  down();.    sqli
2b50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b60: 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30  isPCacheInit = 0
2b70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2b80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b90: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a  isMallocInit ){.
2ba0: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f      sqlite3Mallo
2bb0: 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  cEnd();.    sqli
2bc0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2bd0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30  isMallocInit = 0
2be0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2bf0: 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f  E_OMIT_SHUTDOWN_
2c00: 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20  DIRECTORIES.    
2c10: 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73  /* The heap subs
2c20: 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65  ystem has now be
2c30: 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20  en shutdown and 
2c40: 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65  these values are
2c50: 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a   supposed.    **
2c60: 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70   to be NULL or p
2c70: 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74  oint to memory t
2c80: 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64  hat was obtained
2c90: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2ca0: 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77  lloc(),.    ** w
2cb0: 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20  hich would rely 
2cc0: 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62  on that heap sub
2cd0: 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72  system; therefor
2ce0: 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
2cf0: 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  se.    ** values
2d00: 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f   cannot refer to
2d10: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61   heap memory tha
2d20: 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c  t was just inval
2d30: 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a  idated when the.
2d40: 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73      ** heap subs
2d50: 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f  ystem was shutdo
2d60: 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c  wn.  This is onl
2d70: 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75  y done if the cu
2d80: 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20  rrent call to.  
2d90: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
2da0: 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74  on resulted in t
2db0: 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65  he heap subsyste
2dc0: 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  m actually being
2dd0: 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a   shutdown..    *
2de0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61  /.    sqlite3_da
2df0: 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30  ta_directory = 0
2e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65  ;.    sqlite3_te
2e10: 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30  mp_directory = 0
2e20: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
2e30: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2e40: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
2e50: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
2e60: 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20  3MutexEnd();.   
2e70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2e80: 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74  nfig.isMutexInit
2e90: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
2ea0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2eb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49  ../*.** This API
2ec0: 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74   allows applicat
2ed0: 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74  ions to modify t
2ee0: 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67  he global config
2ef0: 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  uration of.** th
2f00: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
2f10: 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a   at run-time..**
2f20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f30: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2f40: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
2f50: 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
2f60: 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  ding.** database
2f70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20   connections or 
2f80: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2f90: 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ns.  This routin
2fa0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65  e is not.** thre
2fb0: 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65  adsafe.  Failure
2fc0: 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77   to heed these w
2fd0: 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64  arnings can lead
2fe0: 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c   to unpredictabl
2ff0: 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a  e.** behavior..*
3000: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
3010: 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  nfig(int op, ...
3020: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
3030: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
3040: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c  TE_OK;..  /* sql
3050: 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68  ite3_config() sh
3060: 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  all return SQLIT
3070: 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69  E_MISUSE if it i
3080: 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a  s invoked while.
3090: 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20    ** the SQLite 
30a0: 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73  library is in us
30b0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  e. */.  if( sqli
30c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
30d0: 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20  isInit ) return 
30e0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
30f0: 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28  PT;..  va_start(
3100: 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
3110: 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  h( op ){..    /*
3120: 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61   Mutex configura
3130: 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65  tion options are
3140: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
3150: 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a  in a threadsafe.
3160: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a      ** compile..
3170: 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e      */.#if defin
3180: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
3190: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
31a0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f 2a  THREADSAFE>0  /*
31b0: 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34 36   IMP: R-54466-46
31c0: 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  756 */.    case 
31d0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49  SQLITE_CONFIG_SI
31e0: 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20  NGLETHREAD: {.  
31f0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3200: 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30 39  OF: R-02748-1909
3210: 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65  6 This option se
3220: 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67  ts the threading
3230: 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a   mode to.      *
3240: 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64 2e  * Single-thread.
3250: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3260: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
3270: 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  oreMutex = 0;  /
3280: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3290: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
32a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32b0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
32c0: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
32d0: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
32e0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
32f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3300: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3310: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3320: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3330: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3340: 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20 2a   R-20520-54086 *
3350: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
3360: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
3370: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
3380: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3390: 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69 73  14374-42468 This
33a0: 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65   option sets the
33b0: 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20   threading mode 
33c0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c 74  to.      ** Mult
33d0: 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20  i-thread. */.   
33e0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
33f0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
3400: 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c  x = 1;  /* Enabl
3410: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
3420: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3430: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3440: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3450: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3460: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
3470: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3480: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
3490: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
34a0: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
34b0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
34c0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39 33   /* IMP: R-59593
34d0: 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63 61  -21810 */.    ca
34e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
34f0: 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20  _SERIALIZED: {. 
3500: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3510: 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31 38  -OF: R-41220-518
3520: 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  00 This option s
3530: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3540: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3550: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20 2a  ** Serialized. *
3560: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3570: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
3580: 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20  eMutex = 1;  /* 
3590: 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20  Enable mutex on 
35a0: 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  core */.      sq
35b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
35c0: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31  g.bFullMutex = 1
35d0: 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74  ;  /* Enable mut
35e0: 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  ex on connection
35f0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
3600: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
3610: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3620: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3630: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3640: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 36  FE>0 /* IMP: R-6
3650: 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20 20  3666-48755 */.  
3660: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3670: 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20  NFIG_MUTEX: {.  
3680: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
3690: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75  n alternative mu
36a0: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
36b0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
36c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
36d0: 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28  mutex = *va_arg(
36e0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
36f0: 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  x_methods*);.   
3700: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3710: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
3720: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
3730: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
3740: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3750: 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37 35  IMP: R-14450-375
3760: 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  97 */.    case S
3770: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3780: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
3790: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
37a0: 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70  urrent mutex imp
37b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
37c0: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
37d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
37e0: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
37f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3800: 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61  utex;.      brea
3810: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3820: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3830: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20  _CONFIG_MALLOC: 
3840: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3850: 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34 2d  NCE-OF: R-55594-
3860: 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54 45  21030 The SQLITE
3870: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f  _CONFIG_MALLOC o
3880: 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20  ption takes a.  
3890: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72      ** single ar
38a0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
38b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
38c0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a  instance of the.
38d0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
38e0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72  _mem_methods str
38f0: 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67 75  ucture. The argu
3900: 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20 61  ment specifies a
3910: 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20 20  lternative.     
3920: 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65   ** low-level me
3930: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3940: 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20 75  routines to be u
3950: 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
3960: 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20  the memory.     
3970: 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72   ** allocation r
3980: 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69 6e  outines built in
3990: 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20 20  to SQLite. */.  
39a0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
39b0: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f  lConfig.m = *va_
39c0: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
39d0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  mem_methods*);. 
39e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
39f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3a00: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c  E_CONFIG_GETMALL
3a10: 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  OC: {.      /* E
3a20: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
3a30: 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53 51  213-46414 The SQ
3a40: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
3a50: 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b  ALLOC option tak
3a60: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
3a70: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
3a80: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
3a90: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
3aa0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
3ab0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3ac0: 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20 54  ods structure. T
3ad0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  he sqlite3_mem_m
3ae0: 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72 65  ethods structure
3af0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c   is.      ** fil
3b00: 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  led with the cur
3b10: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 6d  rently defined m
3b20: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3b30: 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20 20   routines. */.  
3b40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
3b50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d  lobalConfig.m.xM
3b60: 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74  alloc==0 ) sqlit
3b70: 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28  e3MemSetDefault(
3b80: 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67  );.      *va_arg
3b90: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
3ba0: 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c  _methods*) = sql
3bb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3bc0: 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  .m;.      break;
3bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3be0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
3bf0: 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20  MSTATUS: {.     
3c00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3c10: 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20 54   R-61275-35157 T
3c20: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
3c30: 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69 6f  _MEMSTATUS optio
3c40: 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a  n takes.      **
3c50: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
3c60: 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69 6e   of type int, in
3c70: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 62  terpreted as a b
3c80: 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65 6e  oolean, which en
3c90: 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  ables.      ** o
3ca0: 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63  r disables the c
3cb0: 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65 6d  ollection of mem
3cc0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  ory allocation s
3cd0: 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20 20  tatistics. */.  
3ce0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3cf0: 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74  lConfig.bMemstat
3d00: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3d10: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3d20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3d30: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 4d  SQLITE_CONFIG_SM
3d40: 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  ALL_MALLOC: {.  
3d50: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3d60: 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d 61  lConfig.bSmallMa
3d70: 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61 70  lloc = va_arg(ap
3d80: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
3d90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3da0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3db0: 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20  G_PAGECACHE: {. 
3dc0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3dd0: 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36 36  -OF: R-18761-366
3de0: 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68 72  01 There are thr
3df0: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
3e00: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
3e10: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
3e20: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 38  : A pointer to 8
3e30: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3e40: 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20  mory (pMem),.   
3e50: 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f     ** the size o
3e60: 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63 68  f each page cach
3e70: 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64  e line (sz), and
3e80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
3e90: 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20 20  ache lines.     
3ea0: 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20   ** (N). */.    
3eb0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3ec0: 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61  onfig.pPage = va
3ed0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
3ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67  obalConfig.szPag
3f00: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3f10: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3f20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3f30: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
3f40: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
3f50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3f60: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3f70: 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a 20  G_PCACHE_HDRSZ: 
3f80: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3f90: 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d  NCE-OF: R-39100-
3fa0: 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54 45  27317 The SQLITE
3fb0: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48  _CONFIG_PCACHE_H
3fc0: 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65  DRSZ option take
3fd0: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e  s.      ** a sin
3fe0: 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77 68  gle parameter wh
3ff0: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
4000: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61   to an integer a
4010: 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a 20  nd writes into. 
4020: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e 74       ** that int
4030: 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20  eger the number 
4040: 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20 70  of extra bytes p
4050: 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65 64  er page required
4060: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a 20   for each page. 
4070: 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54       ** in SQLIT
4080: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
4090: 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  HE. */.      *va
40a0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d  _arg(ap, int*) =
40b0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
40c0: 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74 72  te3HeaderSizeBtr
40d0: 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20  ee() +.         
40e0: 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69   sqlite3HeaderSi
40f0: 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20 20  zePcache() +.   
4100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65         sqlite3He
4110: 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31 28  aderSizePcache1(
4120: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4130: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
4140: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
4150: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
4160: 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
4170: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4180: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4190: 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b  FIG_GETPCACHE: {
41a0: 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e  .      /* now an
41b0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
41c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
41d0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
41e0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
41f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
4200: 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f  ACHE2: {.      /
4210: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4220: 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68 65  -63325-48378 The
4230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4240: 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74 61  CACHE2 option ta
4250: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
4260: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
4270: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4280: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
4290: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a  pcache_methods2.
42a0: 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e        ** object.
42b0: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70 65   This object spe
42c0: 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65 72  cifies the inter
42d0: 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f 6d  face to a custom
42e0: 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20 20   page cache.    
42f0: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74    ** implementat
4300: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ion. */.      sq
4310: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4320: 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f  g.pcache2 = *va_
4330: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
4340: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a  pcache_methods2*
4350: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4360: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4370: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
4380: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
4390: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
43a0: 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20 54   R-22035-46182 T
43b0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
43c0: 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74 69  _GETPCACHE2 opti
43d0: 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20  on takes a.     
43e0: 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d   ** single argum
43f0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70  ent which is a p
4400: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
4410: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
4420: 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62  ods2.      ** ob
4430: 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f 70  ject. SQLite cop
4440: 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ies of the curre
4450: 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69 6d  nt page cache im
4460: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
4470: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  o.      ** that 
4480: 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20  object. */.     
4490: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
44a0: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
44b0: 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  .xInit==0 ){.   
44c0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
44d0: 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  heSetDefault();.
44e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76        }.      *v
44f0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
4500: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4510: 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  2*) = sqlite3Glo
4520: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
4530: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
4540: 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e      }../* EVIDEN
4550: 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31  CE-OF: R-06626-1
4560: 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45 5f  2911 The SQLITE_
4570: 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74 69  CONFIG_HEAP opti
4580: 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76  on is only.** av
4590: 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69 74  ailable if SQLit
45a0: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  e is compiled wi
45b0: 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  th either SQLITE
45c0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20  _ENABLE_MEMSYS3 
45d0: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41  or.** SQLITE_ENA
45e0: 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20  BLE_MEMSYS5 and 
45f0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
4600: 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64 20  RROR if invoked 
4610: 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69  otherwise. */.#i
4620: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4630: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29  _ENABLE_MEMSYS3)
4640: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
4650: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
4660: 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  5).    case SQLI
4670: 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20  TE_CONFIG_HEAP: 
4680: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
4690: 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d  NCE-OF: R-19854-
46a0: 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65 20  42126 There are 
46b0: 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20  three arguments 
46c0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  to.      ** SQLI
46d0: 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20  TE_CONFIG_HEAP: 
46e0: 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  An 8-byte aligne
46f0: 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
4700: 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20   memory, the.   
4710: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
4720: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65 6d  bytes in the mem
4730: 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64 20  ory buffer, and 
4740: 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
4750: 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20  cation size..   
4760: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
4770: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4780: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
4790: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
47a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
47b0: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
47c0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
47d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
47e0: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
47f0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4800: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
4810: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4820: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
4830: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4840: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
4850: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4860: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
4870: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
4880: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
4890: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
48a0: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
48b0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
48c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
48d0: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
48e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
48f0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
4900: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
4910: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
4920: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32  DENCE-OF: R-4992
4930: 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20 66  0-60189 If the f
4940: 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74 68  irst pointer (th
4950: 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72  e memory pointer
4960: 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  ).        ** is 
4970: 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74  NULL, then SQLit
4980: 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73 69  e reverts to usi
4990: 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20 6d  ng its default m
49a0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a  emory allocator.
49b0: 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20          ** (the 
49c0: 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20  system malloc() 
49d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c  implementation),
49e0: 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72 69   undoing any pri
49f0: 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  or invocation of
4a00: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  .        ** SQLI
4a10: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
4a20: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
4a30: 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67 20       ** Setting 
4a40: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4a50: 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72  fig.m to all zer
4a60: 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d 61  os will cause ma
4a70: 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20 20  lloc to.        
4a80: 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74 73  ** revert to its
4a90: 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65   default impleme
4aa0: 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c  ntation when sql
4ab0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
4ac0: 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20 20  ) is run.       
4ad0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   */.        mems
4ae0: 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61  et(&sqlite3Globa
4af0: 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69  lConfig.m, 0, si
4b00: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
4b10: 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20  alConfig.m));.  
4b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b30: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
4b40: 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31 38  F: R-61006-08918
4b50: 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 70   If the memory p
4b60: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ointer is not NU
4b70: 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  LL then the.    
4b80: 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69      ** alternati
4b90: 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ve memory alloca
4ba0: 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20 74  tor is engaged t
4bb0: 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20  o handle all of 
4bc0: 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20 20  SQLites.        
4bd0: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
4be0: 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23  tion needs. */.#
4bf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4c00: 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20  BLE_MEMSYS3.    
4c10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4c20: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c  lConfig.m = *sql
4c30: 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73  ite3MemGetMemsys
4c40: 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  3();.#endif.#ifd
4c50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4c60: 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20  _MEMSYS5.       
4c70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4c80: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4c90: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29  3MemGetMemsys5()
4ca0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
4cb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4cc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
4cd0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
4ce0: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
4cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4d00: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
4d10: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
4d20: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
4d30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4d40: 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  ig.nLookaside = 
4d50: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4d60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d70: 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20    }.    .    /* 
4d80: 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  Record a pointer
4d90: 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66   to the logger f
4da0: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20  unction and its 
4db0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
4dc0: 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75      ** The defau
4dd0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67  lt is NULL.  Log
4de0: 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  ging is disabled
4df0: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
4e00: 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20   pointer is.    
4e10: 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  ** NULL..    */.
4e20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4e30: 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20  CONFIG_LOG: {.  
4e40: 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
4e50: 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
4e60: 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
4e70: 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
4e80: 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
4e90: 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
4ea0: 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
4eb0: 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
4ec0: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
4ed0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a  a_arg(ap, void(*
4ee0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
4ef0: 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
4f00: 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
4f10: 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f  f void(*LOGFUNC_
4f20: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  t)(void*,int,con
4f30: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
4f40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4f50: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
4f60: 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74  rg(ap, LOGFUNC_t
4f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4f80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f  GlobalConfig.pLo
4f90: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
4fa0: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
4fb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4fc0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4fd0: 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37 20  : R-55548-33817 
4fe0: 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  The compile-time
4ff0: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52 49   setting for URI
5000: 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a   filenames.    *
5010: 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
5020: 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 75   at start-time u
5030: 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  sing the.    ** 
5040: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
5050: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
5060: 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  ,1) or.    ** sq
5070: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
5080: 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30  ITE_CONFIG_URI,0
5090: 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ) configuration 
50a0: 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  calls..    */.  
50b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
50c0: 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20  NFIG_URI: {.    
50d0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
50e0: 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35 20  : R-25451-61125 
50f0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
5100: 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b  G_URI option tak
5110: 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20  es a single.    
5120: 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66    ** argument of
5130: 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f   type int. If no
5140: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52 49  n-zero, then URI
5150: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f   handling is glo
5160: 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65  bally.      ** e
5170: 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20 70  nabled. If the p
5180: 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f  arameter is zero
5190: 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c  , then URI handl
51a0: 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a  ing is globally.
51b0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
51c0: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  d. */.      sqli
51d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
51e0: 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72  bOpenUri = va_ar
51f0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
5200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5210: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5220: 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f  CONFIG_COVERING_
5230: 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20  INDEX_SCAN: {.  
5240: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5250: 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37 37  OF: R-36592-0277
5260: 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  2 The SQLITE_CON
5270: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
5280: 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a  EX_SCAN.      **
5290: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20   option takes a 
52a0: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61  single integer a
52b0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
52c0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
52d0: 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65  a.      ** boole
52e0: 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  an in order to e
52f0: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
5300: 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76 65   the use of cove
5310: 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f 72  ring indices for
5320: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74  .      ** full t
5330: 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74 68  able scans in th
5340: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
5350: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
5360: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5370: 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72 67  bUseCis = va_arg
5380: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
5390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
53a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
53b0: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63  BLE_SQLLOG.    c
53c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
53d0: 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20  G_SQLLOG: {.    
53e0: 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a    typedef void(*
53f0: 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  SQLLOGFUNC_t)(vo
5400: 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  id*, sqlite3*, c
5410: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
5420: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5430: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
5440: 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  log = va_arg(ap,
5450: 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a   SQLLOGFUNC_t);.
5460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5470: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
5480: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
5490: 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20  , void *);.     
54a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
54b0: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
54c0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
54d0: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
54e0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
54f0: 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53 51  R-58063-38258 SQ
5500: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
5510: 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f 20  _SIZE takes two 
5520: 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  64-bit.      ** 
5530: 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65 33  integer (sqlite3
5540: 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20 74  _int64) values t
5550: 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66 61  hat are the defa
5560: 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69  ult mmap size li
5570: 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  mit.      ** (th
5580: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
5590: 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61  g for PRAGMA mma
55a0: 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65 20  p_size) and the 
55b0: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a  maximum allowed.
55c0: 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69        ** mmap si
55d0: 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20  ze limit. */.   
55e0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
55f0: 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67   szMmap = va_arg
5600: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  (ap, sqlite3_int
5610: 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  64);.      sqlit
5620: 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20  e3_int64 mxMmap 
5630: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
5640: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20  ite3_int64);.   
5650: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5660: 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39 30  F: R-53367-43190
5670: 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75 6d   If either argum
5680: 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74 69  ent to this opti
5690: 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e  on is.      ** n
56a0: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
56b0: 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 63  at argument is c
56c0: 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63 6f  hanged to its co
56d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61 75  mpile-time defau
56e0: 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  lt..      **.   
56f0: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
5700: 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33 31  F: R-34993-45031
5710: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
5720: 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20 77  owed mmap size w
5730: 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
5740: 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61 74  silently truncat
5750: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ed if necessary 
5760: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
5770: 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a 20  not exceed the. 
5780: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d       ** compile-
5790: 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  time maximum mma
57a0: 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74 68  p size set by th
57b0: 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  e SQLITE_MAX_MMA
57c0: 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20  P_SIZE.      ** 
57d0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
57e0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
57f0: 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30      if( mxMmap<0
5800: 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54   || mxMmap>SQLIT
5810: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20  E_MAX_MMAP_SIZE 
5820: 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d 61  ){.        mxMma
5830: 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  p = SQLITE_MAX_M
5840: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
5850: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  }.      if( szMm
5860: 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20  ap<0 ) szMmap = 
5870: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
5880: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
5890: 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61  if( szMmap>mxMma
58a0: 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d  p) szMmap = mxMm
58b0: 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ap;.      sqlite
58c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
58d0: 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20  Mmap = mxMmap;. 
58e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
58f0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20  alConfig.szMmap 
5900: 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20  = szMmap;.      
5910: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
5920: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  f SQLITE_OS_WIN 
5930: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5940: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20  E_WIN32_MALLOC) 
5950: 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d  /* IMP: R-04780-
5960: 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61 73  55815 */.    cas
5970: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5980: 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a 20  WIN32_HEAPSIZE: 
5990: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
59a0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d  NCE-OF: R-34926-
59b0: 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e  03360 SQLITE_CON
59c0: 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49  FIG_WIN32_HEAPSI
59d0: 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62 69  ZE takes a 32-bi
59e0: 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69 67  t.      ** unsig
59f0: 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ned integer valu
5a00: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
5a10: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
5a20: 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65 64  e of the created
5a30: 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e 20  .      ** heap. 
5a40: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5a50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
5a60: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
5a70: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
5a80: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
5a90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5aa0: 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b  _CONFIG_PMASZ: {
5ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61  obalConfig.szPma
5ad0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
5ae0: 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
5af0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5b00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5b10: 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e 4c  _CONFIG_STMTJRNL
5b20: 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  _SPILL: {.      
5b30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5b40: 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20 3d  fig.nStmtSpill =
5b50: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5b60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5b70: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
5b80: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t: {.      rc = 
5b90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5ba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5bb0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
5bc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
5be0: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75  the lookaside bu
5bf0: 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61  ffers for a data
5c00: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
5c10: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
5c20: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
5c30: 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69    .** If lookasi
5c40: 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  de is already ac
5c50: 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  tive, return SQL
5c60: 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20  ITE_BUSY..**.** 
5c70: 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72  The sz parameter
5c80: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
5c90: 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20  f bytes in each 
5ca0: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a  lookaside slot..
5cb0: 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d  ** The cnt param
5cc0: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
5cd0: 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66  er of slots.  If
5ce0: 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20   pStart is NULL 
5cf0: 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72  the.** space for
5d00: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
5d10: 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65  emory is obtaine
5d20: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
5d30: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70  alloc()..** If p
5d40: 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  Start is not NUL
5d50: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a  L then it is sz*
5d60: 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  cnt bytes of mem
5d70: 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a  ory to use for.*
5d80: 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  * the lookaside 
5d90: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
5da0: 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61  c int setupLooka
5db0: 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  side(sqlite3 *db
5dc0: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
5dd0: 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  t sz, int cnt){.
5de0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5df0: 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20  MIT_LOOKASIDE.  
5e00: 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20  void *pStart;.  
5e10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f  .  if( sqlite3Lo
5e20: 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30  okasideUsed(db,0
5e30: 29 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  )>0 ){.    retur
5e40: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
5e50: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
5e60: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
5e70: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
5e80: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
5e90: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
5ea0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
5eb0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
5ec0: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
5ed0: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
5ee0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
5ef0: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
5f00: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
5f10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
5f20: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
5f30: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
5f40: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
5f50: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
5f60: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
5f70: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
5f80: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
5f90: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
5fa0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
5fb0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
5fc0: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
5fd0: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
5fe0: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
5ff0: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
6000: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
6010: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
6020: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
6030: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
6040: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
6050: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
6060: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
6070: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
6080: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
6090: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
60a0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
60b0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
60c0: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
60d0: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
60e0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
60f0: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
6100: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6110: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
6120: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6130: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
6140: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
6150: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
6160: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
6170: 64 65 2e 70 49 6e 69 74 20 3d 20 30 3b 0a 20 20  de.pInit = 0;.  
6180: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
6190: 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c  ree = 0;.  db->l
61a0: 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28 75  ookaside.sz = (u
61b0: 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53 74  16)sz;.  if( pSt
61c0: 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  art ){.    int i
61d0: 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53  ;.    LookasideS
61e0: 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  lot *p;.    asse
61f0: 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73 69  rt( sz > (int)si
6200: 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  zeof(LookasideSl
6210: 6f 74 2a 29 20 29 3b 0a 20 20 20 20 64 62 2d 3e  ot*) );.    db->
6220: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20  lookaside.nSlot 
6230: 3d 20 63 6e 74 3b 0a 20 20 20 20 70 20 3d 20 28  = cnt;.    p = (
6240: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70  LookasideSlot*)p
6250: 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69  Start;.    for(i
6260: 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  =cnt-1; i>=0; i-
6270: 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  -){.      p->pNe
6280: 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  xt = db->lookasi
6290: 64 65 2e 70 49 6e 69 74 3b 0a 20 20 20 20 20 20  de.pInit;.      
62a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49  db->lookaside.pI
62b0: 6e 69 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  nit = p;.      p
62c0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
62d0: 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d  t*)&((u8*)p)[sz]
62e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
62f0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d  lookaside.pEnd =
6300: 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   p;.    db->look
6310: 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d  aside.bDisable =
6320: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   0;.    db->look
6330: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
6340: 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a  = pBuf==0 ?1:0;.
6350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
6360: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
6370: 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e  t = db;.    db->
6380: 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d  lookaside.pEnd =
6390: 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   db;.    db->loo
63a0: 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20  kaside.bDisable 
63b0: 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 1;.    db->loo
63c0: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
63d0: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 0;.    db->lo
63e0: 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d 20  okaside.nSlot = 
63f0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  0;.  }.#endif /*
6400: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f   SQLITE_OMIT_LOO
6410: 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74 75  KASIDE */.  retu
6420: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6430: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6440: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
6450: 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
6460: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
6470: 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  /.sqlite3_mutex 
6480: 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65  *sqlite3_db_mute
6490: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  x(sqlite3 *db){.
64a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
64b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
64c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
64d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
64e0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
64f0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
6500: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6510: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
6520: 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a  n db->mutex;.}..
6530: 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73  /*.** Free up as
6540: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
6550: 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20  we can from the 
6560: 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a  given database.*
6570: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
6580: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
6590: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73  release_memory(s
65a0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
65b0: 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51  nt i;..#ifdef SQ
65c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
65d0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
65e0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
65f0: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
6600: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
6610: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
6620: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6630: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
6640: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
6650: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
6660: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
6670: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
6680: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
6690: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
66a0: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
66b0: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
66c0: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
66d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
66e0: 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65  agerShrink(pPage
66f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
6700: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
6710: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
6720: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6730: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
6740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6750: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
6760: 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20 69  ny dirty pages i
6770: 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  n the pager-cach
6780: 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63 68  e for any attach
6790: 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ed database.** t
67a0: 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
67b0: 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66  qlite3_db_cachef
67c0: 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64 62  lush(sqlite3 *db
67d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
67e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
67f0: 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75 73  ;.  int bSeenBus
6800: 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  y = 0;..#ifdef S
6810: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6820: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6830: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6840: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6850: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6860: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6870: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6880: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
6890: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
68a0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
68b0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
68c0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
68d0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
68e0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
68f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
6900: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
6910: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
6920: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
6930: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
6940: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
6950: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6960: 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28 70  ite3PagerFlush(p
6970: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
6980: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
6990: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65  Y ){.        bSe
69a0: 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20  enBusy = 1;.    
69b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
69c0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
69d0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
69e0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
69f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
6a00: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
6a10: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 72  x);.  return ((r
6a20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
6a30: 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51 4c  bSeenBusy) ? SQL
6a40: 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b 0a  ITE_BUSY : rc);.
6a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
6a60: 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20  ration settings 
6a70: 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61  for an individua
6a80: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
6a90: 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ction.*/.int sql
6aa0: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73  ite3_db_config(s
6ab0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
6ac0: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
6ad0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
6ae0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
6af0: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
6b00: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
6b10: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d  QLITE_DBCONFIG_M
6b20: 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20 20  AINDBNAME: {.   
6b30: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36 38     /* IMP: R-068
6b40: 32 34 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20 20  24-28531 */.    
6b50: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32 35    /* IMP: R-3625
6b60: 37 2d 35 32 31 32 35 20 2a 2f 0a 20 20 20 20 20  7-52125 */.     
6b70: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53   db->aDb[0].zDbS
6b80: 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Name = va_arg(ap
6b90: 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 72  ,char*);.      r
6ba0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6bb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6bc0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
6bd0: 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  E_DBCONFIG_LOOKA
6be0: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SIDE: {.      vo
6bf0: 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72  id *pBuf = va_ar
6c00: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a  g(ap, void*); /*
6c10: 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30   IMP: R-26835-10
6c20: 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  964 */.      int
6c30: 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
6c40: 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20   int);       /* 
6c50: 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39  IMP: R-47871-259
6c60: 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  94 */.      int 
6c70: 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  cnt = va_arg(ap,
6c80: 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49   int);      /* I
6c90: 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38  MP: R-04460-5338
6ca0: 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  6 */.      rc = 
6cb0: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
6cc0: 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74  b, pBuf, sz, cnt
6cd0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6ce0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6cf0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  t: {.      stati
6d00: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
6d10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b  .        int op;
6d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
6d30: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  ode */.        u
6d40: 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d  32 mask;    /* M
6d50: 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69  ask of the bit i
6d60: 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20  n sqlite3.flags 
6d70: 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a  to set/clear */.
6d80: 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b        } aFlagOp[
6d90: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
6da0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6db0: 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20  ENABLE_FKEY,    
6dc0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 6f         SQLITE_Fo
6dd0: 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a  reignKeys    },.
6de0: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
6df0: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
6e00: 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20 20 20  _TRIGGER,       
6e10: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72   SQLITE_EnableTr
6e20: 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20  igger  },.      
6e30: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
6e40: 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  FIG_ENABLE_FTS3_
6e50: 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54  TOKENIZER, SQLIT
6e60: 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20  E_Fts3Tokenizer 
6e70: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
6e80: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
6e90: 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
6ea0: 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64  ION, SQLITE_Load
6eb0: 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20  Extension  },.  
6ec0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
6ed0: 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f  BCONFIG_NO_CKPT_
6ee0: 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 53  ON_CLOSE,      S
6ef0: 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c  QLITE_NoCkptOnCl
6f00: 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  ose  },.        
6f10: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
6f20: 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20 20  G_ENABLE_QPSG,  
6f30: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6f40: 45 6e 61 62 6c 65 51 50 53 47 20 20 20 20 20 7d  EnableQPSG     }
6f50: 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ,.      };.     
6f60: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
6f70: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6f80: 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50  TE_ERROR; /* IMP
6f90: 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20  : R-42790-23372 
6fa0: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  */.      for(i=0
6fb0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46  ; i<ArraySize(aF
6fc0: 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  lagOp); i++){.  
6fd0: 20 20 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f        if( aFlagO
6fe0: 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20  p[i].op==op ){. 
6ff0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f           int ono
7000: 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ff = va_arg(ap, 
7010: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
7020: 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61  int *pRes = va_a
7030: 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
7040: 20 20 20 20 20 20 20 20 75 33 32 20 6f 6c 64 46          u32 oldF
7050: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
7060: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7070: 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20  onoff>0 ){.     
7080: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
7090: 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d   |= aFlagOp[i].m
70a0: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
70b0: 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d  else if( onoff==
70c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
70d0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61   db->flags &= ~a
70e0: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a  FlagOp[i].mask;.
70f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7100: 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61        if( oldFla
7110: 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b  gs!=db->flags ){
7120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
7130: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
7140: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
7150: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7160: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73          if( pRes
7170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7180: 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  *pRes = (db->fla
7190: 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e  gs & aFlagOp[i].
71a0: 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20  mask)!=0;.      
71b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
71c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
71d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
71e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
71f0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7200: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
7210: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
7220: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
7230: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
7240: 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d  e buffer z[0..n-
7250: 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  1] contains all 
7260: 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
7270: 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28  c int allSpaces(
7280: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
7290: 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt n){.  while( 
72a0: 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>0 && z[n-1]=='
72b0: 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72   ' ){ n--; }.  r
72c0: 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f  eturn n==0;.}../
72d0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
72e0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
72f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ng function name
7300: 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68  d "BINARY" which
7310: 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76   is always.** av
7320: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  ailable..**.** I
7330: 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72  f the padFlag ar
7340: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
7350: 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61  LL then space pa
7360: 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  dding at the end
7370: 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69  .** of strings i
7380: 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  s ignored.  This
7390: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
73a0: 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e  RTRIM collation.
73b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
73c0: 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  inCollFunc(.  vo
73d0: 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69  id *padFlag,.  i
73e0: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
73f0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
7400: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
7410: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
7420: 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
7430: 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
7440: 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
7450: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
7460: 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54   R-65033-28449 T
7470: 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41  he built-in BINA
7480: 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d  RY collation com
7490: 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e  pares.  ** strin
74a0: 67 73 20 62 79 74 65 20 62 79 20 62 79 74 65 20  gs byte by byte 
74b0: 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70  using the memcmp
74c0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d  () function from
74d0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a   the standard C.
74e0: 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f    ** library. */
74f0: 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 31  .  assert( pKey1
7500: 20 26 26 20 70 4b 65 79 32 20 29 3b 0a 20 20 72   && pKey2 );.  r
7510: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
7520: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
7530: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
7540: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
7550: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7560: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
7570: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
7580: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
7590: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
75a0: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
75b0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
75c0: 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37 33 37  F: R-31624-24737
75d0: 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65 20 42   RTRIM is like B
75e0: 49 4e 41 52 59 20 65 78 63 65 70 74 20 74 68 61  INARY except tha
75f0: 74 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a  t extra.      **
7600: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
7610: 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73 74 72  nd of either str
7620: 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  ing do not chang
7630: 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20 49 6e  e the result. In
7640: 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
7650: 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73 20 77  words, strings w
7660: 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71 75 61  ill compare equa
7670: 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  l to one another
7680: 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79   as long as they
7690: 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72  .      ** differ
76a0: 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d   only in the num
76b0: 62 65 72 20 6f 66 20 73 70 61 63 65 73 20 61 74  ber of spaces at
76c0: 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20 20 20   the end..      
76d0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
76e0: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
76f0: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
7700: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7710: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
7720: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
7730: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
7740: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
7750: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7760: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
7770: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
7780: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74  case independent
7790: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
77a0: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
77b0: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
77c0: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
77d0: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
77e0: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
77f0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
7800: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
7810: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
7820: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
7830: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
7840: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
7850: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
7860: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
7870: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
7880: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
7890: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
78a0: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
78b0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
78c0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
78d0: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
78e0: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
78f0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
7900: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7910: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
7920: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
7930: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
7940: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
7950: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
7960: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
7970: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7990: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
79a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
79b0: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
79c0: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
79d0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
79e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
79f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7a00: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7a10: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7a20: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7a30: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7a40: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7a50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7a60: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7a70: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
7a80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
7a90: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
7aa0: 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 61  y the sqlite3_la
7ab0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
7ac0: 29 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  ) API function..
7ad0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
7ae0: 73 65 74 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  set_last_insert_
7af0: 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  rowid(sqlite3 *d
7b00: 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  b, sqlite3_int64
7b10: 20 69 52 6f 77 69 64 29 7b 0a 23 69 66 64 65 66   iRowid){.#ifdef
7b20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
7b30: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
7b40: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
7b50: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
7b60: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
7b70: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
7b80: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
7b90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7ba0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
7bb0: 29 3b 0a 20 20 64 62 2d 3e 6c 61 73 74 52 6f 77  );.  db->lastRow
7bc0: 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 73  id = iRowid;.  s
7bd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
7be0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ve(db->mutex);.}
7bf0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7c00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
7c10: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
7c20: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
7c30: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
7c40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
7c50: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
7c60: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
7c70: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
7c80: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
7c90: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
7ca0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
7cb0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
7cc0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
7cd0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7ce0: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
7cf0: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
7d00: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7d10: 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20  f changes since 
7d20: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
7d30: 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  dle was opened..
7d40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
7d50: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c  otal_changes(sql
7d60: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
7d70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7d80: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7d90: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7da0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
7db0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
7dc0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
7dd0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
7de0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
7df0: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d  >nTotalChange;.}
7e00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
7e10: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
7e20: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
7e30: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
7e40: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  s fields of the.
7e50: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
7e60: 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f  le object, it do
7e70: 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79  es not close any
7e80: 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
7e90: 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20   may be open.** 
7ea0: 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61  at the b-tree/pa
7eb0: 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  ger level..*/.vo
7ec0: 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  id sqlite3CloseS
7ed0: 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65  avepoints(sqlite
7ee0: 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28  3 *db){.  while(
7ef0: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
7f00: 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74  ){.    Savepoint
7f10: 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61   *pTmp = db->pSa
7f20: 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d  vepoint;.    db-
7f30: 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
7f40: 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  mp->pNext;.    s
7f50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7f60: 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62   pTmp);.  }.  db
7f70: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
7f80: 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  ;.  db->nStateme
7f90: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73  nt = 0;.  db->is
7fa0: 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
7fb0: 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint = 0;.}../*.
7fc0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65  ** Invoke the de
7fd0: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
7fe0: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
7ff0: 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20  h FuncDef p, if 
8000: 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20  any. Except,.** 
8010: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  if this is not t
8020: 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20  he last copy of 
8030: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f  the function, do
8040: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20   not invoke it. 
8050: 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69  Multiple.** copi
8060: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66  es of a single f
8070: 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61  unction are crea
8080: 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f  ted when create_
8090: 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61  function() is ca
80a0: 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c  lled.** with SQL
80b0: 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65  ITE_ANY as the e
80c0: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
80d0: 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e  ic void function
80e0: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
80f0: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29  *db, FuncDef *p)
8100: 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  {.  FuncDestruct
8110: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20  or *pDestructor 
8120: 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72 75 63 74  = p->u.pDestruct
8130: 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72  or;.  if( pDestr
8140: 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65  uctor ){.    pDe
8150: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d  structor->nRef--
8160: 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 72  ;.    if( pDestr
8170: 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  uctor->nRef==0 )
8180: 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75 63  {.      pDestruc
8190: 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44  tor->xDestroy(pD
81a0: 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72  estructor->pUser
81b0: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  Data);.      sql
81c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
81d0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
81e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
81f0: 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73  Disconnect all s
8200: 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65  qlite3_vtab obje
8210: 63 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  cts that belong 
8220: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  to database conn
8230: 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68  ection.** db. Th
8240: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  is is called whe
8250: 6e 20 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c  n db is being cl
8260: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
8270: 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41  void disconnectA
8280: 6c 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a  llVtab(sqlite3 *
8290: 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  db){.#ifndef SQL
82a0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
82b0: 54 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20  TABLE.  int i;. 
82c0: 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20   HashElem *p;.  
82d0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
82e0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
82f0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
8300: 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61  i++){.    Schema
8310: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
8320: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[i].pSchema;.
8330: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
8340: 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  i].pSchema ){.  
8350: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
8360: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
8370: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b  ma->tblHash); p;
8380: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
8390: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(p)){.        T
83a0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61  able *pTab = (Ta
83b0: 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ble *)sqliteHash
83c0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20  Data(p);.       
83d0: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
83e0: 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56 74  Tab) ) sqlite3Vt
83f0: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
8400: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a   pTab);.      }.
8410: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
8420: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
8430: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
8440: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
8450: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f  Next(p)){.    Mo
8460: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
8470: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
8480: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66  hData(p);.    if
8490: 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20  ( pMod->pEpoTab 
84a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
84b0: 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64  VtabDisconnect(d
84c0: 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  b, pMod->pEpoTab
84d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
84e0: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
84f0: 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69  List(db);.  sqli
8500: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
8510: 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  (db);.#else.  UN
8520: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
8530: 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  b);.#endif.}../*
8540: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
8550: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
8560: 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e  ection db has un
8570: 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72  finalized prepar
8580: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ed.** statements
8590: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73   or unfinished s
85a0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
85b0: 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74  jects.  .*/.stat
85c0: 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  ic int connectio
85d0: 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20  nIsBusy(sqlite3 
85e0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  *db){.  int j;. 
85f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8600: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
8610: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
8620: 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75  db->pVdbe ) retu
8630: 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  rn 1;.  for(j=0;
8640: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
8650: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
8660: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42   = db->aDb[j].pB
8670: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
8680: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
8690: 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20  InBackup(pBt) ) 
86a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
86b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
86c0: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73  ** Close an exis
86d0: 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61  ting SQLite data
86e0: 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  base.*/.static i
86f0: 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28  nt sqlite3Close(
8700: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
8710: 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20   forceZombie){. 
8720: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
8730: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
8740: 52 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43 61  R-63257-11740 Ca
8750: 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c  lling sqlite3_cl
8760: 6f 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20  ose() or.    ** 
8770: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8780: 28 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70  () with a NULL p
8790: 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20  ointer argument 
87a0: 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
87b0: 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  -op. */.    retu
87c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
87d0: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
87e0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
87f0: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
8800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
8810: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
8820: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
8830: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
8840: 20 20 69 66 28 20 64 62 2d 3e 6d 54 72 61 63 65    if( db->mTrace
8850: 20 26 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f   & SQLITE_TRACE_
8860: 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 64 62 2d  CLOSE ){.    db-
8870: 3e 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54  >xTrace(SQLITE_T
8880: 52 41 43 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e  RACE_CLOSE, db->
8890: 70 54 72 61 63 65 41 72 67 2c 20 64 62 2c 20 30  pTraceArg, db, 0
88a0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  );.  }..  /* For
88b0: 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63  ce xDisconnect c
88c0: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
88d0: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
88e0: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
88f0: 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  b(db);..  /* If 
8900: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
8910: 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f   open, the disco
8920: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63  nnectAllVtab() c
8930: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
8940: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
8950: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
8960: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
8970: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
8980: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
8990: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
89a0: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
89b0: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
89c0: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
89d0: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
89e0: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
89f0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
8a00: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
8a10: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
8a20: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
8a30: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
8a40: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
8a50: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
8a60: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8a70: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
8a80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
8a90: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
8aa0: 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61    /* Legacy beha
8ab0: 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c  vior (sqlite3_cl
8ac0: 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20  ose() behavior) 
8ad0: 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  is to return.  *
8ae0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  * SQLITE_BUSY if
8af0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8b00: 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  can not be close
8b10: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
8b20: 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65   */.  if( !force
8b30: 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63  Zombie && connec
8b40: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
8b50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8b60: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
8b70: 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62  LITE_BUSY, "unab
8b80: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
8b90: 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22  to unfinalized "
8ba0: 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65  .       "stateme
8bb0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
8bc0: 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20  d backups");.   
8bd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
8be0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
8bf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8c00: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69  TE_BUSY;.  }..#i
8c10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8c20: 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
8c30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
8c40: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
8c50: 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68     /* Closing th
8c60: 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  e handle. Fourth
8c70: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
8c80: 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32  ssed the value 2
8c90: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
8ca0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
8cb0: 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62  llog(sqlite3Glob
8cc0: 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
8cd0: 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a  Arg, db, 0, 2);.
8ce0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
8cf0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e   Convert the con
8d00: 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a  nection into a z
8d10: 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63  ombie and then c
8d20: 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  lose it..  */.  
8d30: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
8d40: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b  TE_MAGIC_ZOMBIE;
8d50: 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  .  sqlite3LeaveM
8d60: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
8d70: 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ie(db);.  return
8d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8d90: 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69  *.** Two variati
8da0: 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69  ons on the publi
8db0: 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  c interface for 
8dc0: 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61  closing a databa
8dd0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
8de0: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c  . The sqlite3_cl
8df0: 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65  ose() version re
8e00: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
8e10: 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20  Y and.** leaves 
8e20: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
8e30: 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ption if there a
8e40: 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  re unfinalized p
8e50: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
8e60: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
8e70: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
8e80: 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ups.  The sqlite
8e90: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20  3_close_v2().** 
8ea0: 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74  version forces t
8eb0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
8ec0: 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65   become a zombie
8ed0: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
8ee0: 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72   unclosed resour
8ef0: 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65  ces, and arrange
8f00: 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69  s for deallocati
8f10: 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  on when the last
8f20: 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74  .** prepare stat
8f30: 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33  ement or sqlite3
8f40: 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a  _backup closes..
8f50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
8f60: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
8f70: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
8f80: 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a  3Close(db,0); }.
8f90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
8fa0: 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62  e_v2(sqlite3 *db
8fb0: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
8fc0: 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a  3Close(db,1); }.
8fd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
8fe0: 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
8ff0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
9000: 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72  b..**.** Further
9010: 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73  more, if databas
9020: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
9030: 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61  is a zombie (mea
9040: 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a  ning that there.
9050: 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  ** has been a pr
9060: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
9070: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72  te3_close(db) or
9080: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
9090: 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76  2(db)) and.** ev
90a0: 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ery sqlite3_stmt
90b0: 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69   has now been fi
90c0: 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72  nalized and ever
90d0: 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  y sqlite3_backup
90e0: 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64   has.** finished
90f0: 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20  , then free all 
9100: 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f  resources..*/.vo
9110: 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  id sqlite3LeaveM
9120: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
9130: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ie(sqlite3 *db){
9140: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20  .  HashElem *i; 
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9160: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
9170: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
9180: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt j;..  /* If t
9190: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
91a0: 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d  ding sqlite3_stm
91b0: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
91c0: 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a  kup objects.  **
91d0: 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65   or if the conne
91e0: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  ction has not ye
91f0: 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79  t been closed by
9200: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
9210: 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a  2(),.  ** then j
9220: 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75  ust leave the mu
9230: 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  tex and return..
9240: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
9250: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
9260: 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e  IC_ZOMBIE || con
9270: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62  nectionIsBusy(db
9280: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
9290: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
92a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
92b0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  urn;.  }..  /* I
92c0: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
92d0: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
92e0: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
92f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
9300: 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c  .  ** closed all
9310: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e   sqlite3_stmt an
9320: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
9330: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73   objects and has
9340: 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65   been.  ** passe
9350: 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d to sqlite3_clo
9360: 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  se (meaning that
9370: 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29   it is a zombie)
9380: 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20  .  Therefore,.  
9390: 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
93a0: 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  free all resourc
93b0: 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49  es..  */..  /* I
93c0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
93d0: 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74  is open, roll it
93e0: 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f   back. This also
93f0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66   ensures that if
9400: 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61  .  ** any databa
9410: 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20  se schemas have 
9420: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79  been modified by
9430: 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20   an uncommitted 
9440: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
9450: 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e   they are reset.
9460: 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65   And that the re
9470: 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75  quired b-tree mu
9480: 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d  tex is held to m
9490: 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ake.  ** the pag
94a0: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  er rollback and 
94b0: 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20  schema reset an 
94c0: 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e  atomic operation
94d0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f  . */.  sqlite3Ro
94e0: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
94f0: 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20  LITE_OK);..  /* 
9500: 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e  Free any outstan
9510: 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73  ding Savepoint s
9520: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20  tructures. */.  
9530: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
9540: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f  points(db);..  /
9550: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61  * Close all data
9560: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
9570: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
9580: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
9590: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
95a0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
95b0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
95c0: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
95d0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
95e0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
95f0: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
9600: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
9610: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
9620: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
9630: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
9640: 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73  Clear the TEMP s
9650: 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79  chema separately
9660: 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69   and last */.  i
9670: 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  f( db->aDb[1].pS
9680: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c  chema ){.    sql
9690: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
96a0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
96b0: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
96c0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
96d0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  (db);..  /* Free
96e0: 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66   up the array of
96f0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
9700: 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ases */.  sqlite
9710: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
9720: 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73  eArray(db);.  as
9730: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32  sert( db->nDb<=2
9740: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
9750: 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74  ->aDb==db->aDbSt
9760: 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65  atic );..  /* Te
9770: 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e  ll the code in n
9780: 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65  otify.c that the
9790: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c   connection no l
97a0: 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a  onger holds any.
97b0: 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64    ** locks and d
97c0: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
97d0: 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f  any further unlo
97e0: 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
97f0: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  cks..  */.  sqli
9800: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f  te3ConnectionClo
9810: 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  sed(db);..  for(
9820: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9830: 74 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69  t(&db->aFunc); i
9840: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9850: 78 74 28 69 29 29 7b 0a 20 20 20 20 46 75 6e 63  xt(i)){.    Func
9860: 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a  Def *pNext, *p;.
9870: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61      p = sqliteHa
9880: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 64  shData(i);.    d
9890: 6f 7b 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  o{.      functio
98a0: 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b  nDestroy(db, p);
98b0: 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
98c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
98d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
98e0: 20 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70   p);.      p = p
98f0: 4e 65 78 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Next;.    }while
9900: 28 20 70 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ( p );.  }.  sql
9910: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
9920: 62 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72  b->aFunc);.  for
9930: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
9940: 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  st(&db->aCollSeq
9950: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
9960: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
9970: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
9980: 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69   (CollSeq *)sqli
9990: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
99a0: 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79     /* Invoke any
99b0: 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67   destructors reg
99c0: 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c  istered for coll
99d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
99e0: 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  ser data. */.   
99f0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
9a00: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
9a10: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a  Coll[j].xDel ){.
9a20: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d          pColl[j]
9a30: 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70  .xDel(pColl[j].p
9a40: 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  User);.      }. 
9a50: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9a60: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c  DbFree(db, pColl
9a70: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9a80: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
9a90: 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
9aa0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
9ab0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72  RTUALTABLE.  for
9ac0: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
9ad0: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
9ae0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9af0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d  hNext(i)){.    M
9b00: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
9b10: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
9b20: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
9b30: 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f  f( pMod->xDestro
9b40: 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d  y ){.      pMod-
9b50: 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e  >xDestroy(pMod->
9b60: 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pAux);.    }.   
9b70: 20 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e   sqlite3VtabEpon
9b80: 79 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61 72 28  ymousTableClear(
9b90: 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73  db, pMod);.    s
9ba0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9bb0: 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71   pMod);.  }.  sq
9bc0: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
9bd0: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
9be0: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45  ndif..  sqlite3E
9bf0: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
9c00: 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61  OK); /* Dealloca
9c10: 74 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65  tes any cached e
9c20: 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f  rror strings. */
9c30: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
9c40: 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ree(db->pErr);. 
9c50: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74   sqlite3CloseExt
9c60: 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66  ensions(db);.#if
9c70: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
9c80: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71  HENTICATION.  sq
9c90: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
9ca0: 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a  uth.zAuthUser);.
9cb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
9cc0: 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29  b->auth.zAuthPW)
9cd0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e  ;.#endif..  db->
9ce0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
9cf0: 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  AGIC_ERROR;..  /
9d00: 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62  * The temp-datab
9d10: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c  ase schema is al
9d20: 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e  located differen
9d30: 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  tly from the oth
9d40: 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f  er schema.  ** o
9d50: 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71  bjects (using sq
9d60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72  liteMalloc() dir
9d70: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
9d80: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  f sqlite3BtreeSc
9d90: 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f  hema())..  ** So
9da0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
9db0: 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f  freed here. Todo
9dc0: 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74  : Why not roll t
9dd0: 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69  he temp schema i
9de0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  nto.  ** the sam
9df0: 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  e sqliteMalloc()
9e00: 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74   as the one that
9e10: 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64   allocates the d
9e20: 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74  atabase .  ** st
9e30: 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20  ructure?.  */.  
9e40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9e50: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  , db->aDb[1].pSc
9e60: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
9e70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9e80: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d  >mutex);.  db->m
9e90: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
9ea0: 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71  GIC_CLOSED;.  sq
9eb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
9ec0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
9ed0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f  ssert( sqlite3Lo
9ee0: 6f 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30  okasideUsed(db,0
9ef0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62  )==0 );.  if( db
9f00: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
9f10: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
9f20: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
9f30: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
9f40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
9f50: 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree(db);.}../*.*
9f60: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64  * Rollback all d
9f70: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20  atabase files.  
9f80: 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
9f90: 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68  ot SQLITE_OK, th
9fa0: 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65 20  en.** any write 
9fb0: 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  cursors are inva
9fc0: 6c 69 64 61 74 65 64 20 28 22 74 72 69 70 70 65  lidated ("trippe
9fd0: 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70  d" - as in "trip
9fe0: 70 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a  ping a circuit.*
9ff0: 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20  * breaker") and 
a000: 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74  made to return t
a010: 72 69 70 43 6f 64 65 20 69 66 20 74 68 65 72 65  ripCode if there
a020: 20 61 72 65 20 61 6e 79 20 66 75 72 74 68 65 72   are any further
a030: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
a040: 75 73 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e  use that cursor.
a050: 20 20 52 65 61 64 20 63 75 72 73 6f 72 73 20 72    Read cursors r
a060: 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76  emain open and v
a070: 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72 65 20  alid.** but are 
a080: 22 73 61 76 65 64 22 20 69 6e 20 63 61 73 65 20  "saved" in case 
a090: 74 68 65 20 74 61 62 6c 65 20 70 61 67 65 73 20  the table pages 
a0a0: 61 72 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64  are moved around
a0b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a0c0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c  3RollbackAll(sql
a0d0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72  ite3 *db, int tr
a0e0: 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69  ipCode){.  int i
a0f0: 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20  ;.  int inTrans 
a100: 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d  = 0;.  int schem
a110: 61 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72  aChange;.  asser
a120: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a130: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
a140: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
a150: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
a160: 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  ;..  /* Obtain a
a170: 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65  ll b-tree mutexe
a180: 73 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20  s before making 
a190: 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42 74 72  any calls to Btr
a1a0: 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20  eeRollback(). . 
a1b0: 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6d 70 6f   ** This is impo
a1c0: 72 74 61 6e 74 20 69 6e 20 63 61 73 65 20 74 68  rtant in case th
a1d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
a1e0: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
a1f0: 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65  has.  ** modifie
a200: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
a210: 63 68 65 6d 61 2e 20 49 66 20 74 68 65 20 62 2d  chema. If the b-
a220: 74 72 65 65 20 6d 75 74 65 78 65 73 20 61 72 65  tree mutexes are
a230: 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20   not taken.  ** 
a240: 68 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68  here, then anoth
a250: 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
a260: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74  connection might
a270: 20 73 6e 65 61 6b 20 69 6e 20 62 65 74 77 65 65   sneak in betwee
a280: 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  n.  ** the datab
a290: 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ase rollback and
a2a0: 20 73 63 68 65 6d 61 20 72 65 73 65 74 2c 20 77   schema reset, w
a2b0: 68 69 63 68 20 63 61 6e 20 63 61 75 73 65 20 66  hich can cause f
a2c0: 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70  alse.  ** corrup
a2d0: 74 69 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e 20  tion reports in 
a2e0: 73 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a  some cases.  */.
a2f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
a300: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63  terAll(db);.  sc
a310: 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62  hemaChange = (db
a320: 2d 3e 6d 44 62 46 6c 61 67 73 20 26 20 44 42 46  ->mDbFlags & DBF
a330: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65  LAG_SchemaChange
a340: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
a350: 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72  .busy==0;..  for
a360: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
a370: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
a380: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
a390: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
a3a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
a3b0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
a3c0: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  ns(p) ){.       
a3d0: 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20   inTrans = 1;.  
a3e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a3f0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a400: 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73  (p, tripCode, !s
a410: 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20  chemaChange);.  
a420: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a430: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
a440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
a450: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
a460: 20 20 69 66 28 20 28 64 62 2d 3e 6d 44 62 46 6c    if( (db->mDbFl
a470: 61 67 73 26 44 42 46 4c 41 47 5f 53 63 68 65 6d  ags&DBFLAG_Schem
a480: 61 43 68 61 6e 67 65 29 21 3d 30 20 26 26 20 64  aChange)!=0 && d
a490: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
a4a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
a4b0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
a4c0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
a4d0: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
a4e0: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
a4f0: 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  on(db);.  }.  sq
a500: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
a510: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e  ll(db);..  /* An
a520: 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  y deferred const
a530: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
a540: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
a550: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62  esolved. */.  db
a560: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
a570: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65  = 0;.  db->nDefe
a580: 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b  rredImmCons = 0;
a590: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
a5a0: 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
a5b0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68  ;..  /* If one h
a5c0: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
a5d0: 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72  ed, invoke the r
a5e0: 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c  ollback-hook cal
a5f0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64  lback */.  if( d
a600: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
a610: 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73  back && (inTrans
a620: 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d   || !db->autoCom
a630: 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e  mit) ){.    db->
a640: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
a650: 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  k(db->pRollbackA
a660: 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
a670: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
a680: 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  c string contain
a690: 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72  ing the name cor
a6a0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
a6b0: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
a6c0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
a6d0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
a6e0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
a6f0: 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a  _NEED_ERR_NAME).
a700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
a710: 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72  te3ErrName(int r
a720: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c){.  const char
a730: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
a740: 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72  nt i, origRc = r
a750: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
a760: 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69  2 && zName==0; i
a770: 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b  ++, rc &= 0xff){
a780: 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20  .    switch( rc 
a790: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ){.      case SQ
a7a0: 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20  LITE_OK:        
a7b0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a7c0: 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20   "SQLITE_OK";   
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a7e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a7f0: 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20  QLITE_ERROR:    
a800: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a810: 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  = "SQLITE_ERROR"
a820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
a830: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a840: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a  SQLITE_INTERNAL:
a850: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a860: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
a870: 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62  NAL";          b
a880: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a890: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20   SQLITE_PERM:   
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
a8b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d  e = "SQLITE_PERM
a8c0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
a8d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a8e0: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a900: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
a910: 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RT";            
a920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a930: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
a940: 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e  ROLLBACK:     zN
a950: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
a960: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20  ORT_ROLLBACK";  
a970: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a980: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
a9a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
a9b0: 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  USY";           
a9c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a9d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
a9e0: 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20  _RECOVERY:      
a9f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aa00: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  BUSY_RECOVERY"; 
aa10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aa20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
aa30: 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20  Y_SNAPSHOT:     
aa40: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aa50: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b  _BUSY_SNAPSHOT";
aa60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
aa80: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
aa90: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aaa0: 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20  E_LOCKED";      
aab0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aac0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
aad0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
aae0: 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  E: zName = "SQLI
aaf0: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
ab00: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
ab10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ab20: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20  NOMEM:          
ab30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ab40: 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ITE_NOMEM";     
ab50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ab60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ab70: 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20  _READONLY:      
ab80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ab90: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20  LITE_READONLY"; 
aba0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
abb0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
abc0: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
abd0: 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ERY:  zName = "S
abe0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
abf0: 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b  ECOVERY"; break;
ac00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ac10: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
ac20: 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  LOCK:  zName = "
ac30: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
ac40: 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  CANTLOCK"; break
ac50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ac60: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
ac70: 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  LBACK:  zName = 
ac80: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
ac90: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61  _ROLLBACK"; brea
aca0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
acb0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
acc0: 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  MOVED:   zName =
acd0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
ace0: 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65  Y_DBMOVED";  bre
acf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ad00: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a  QLITE_INTERRUPT:
ad10: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ad20: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  = "SQLITE_INTERR
ad30: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62 72  UPT";         br
ad40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20  SQLITE_IOERR:   
ad60: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ad70: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ad80: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
ad90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ada0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
adb0: 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AD:         zNam
adc0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
add0: 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20 20  R_READ";        
ade0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
adf0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
ae00: 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61  HORT_READ:   zNa
ae10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ae20: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20  RR_SHORT_READ"; 
ae30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ae40: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ae50: 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e  WRITE:        zN
ae60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ae70: 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20  ERR_WRITE";     
ae80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ae90: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
aea0: 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a  _FSYNC:        z
aeb0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
aec0: 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20  OERR_FSYNC";    
aed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aee0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
aef0: 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20  R_DIR_FSYNC:    
af00: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
af10: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22  IOERR_DIR_FSYNC"
af20: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
af30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
af40: 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20  RR_TRUNCATE:    
af50: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
af60: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22  _IOERR_TRUNCATE"
af70: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
af80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
af90: 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20  ERR_FSTAT:      
afa0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
afb0: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20  E_IOERR_FSTAT"; 
afc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
afd0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
afe0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20  OERR_UNLOCK:    
aff0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b000: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22  TE_IOERR_UNLOCK"
b010: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b020: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b030: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20  IOERR_RDLOCK:   
b040: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b050: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
b060: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b070: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b080: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20  _IOERR_DELETE:  
b090: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b0a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
b0b0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
b0c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b0d0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20  E_IOERR_NOMEM:  
b0e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b0f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
b100: 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  M";       break;
b110: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b120: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a  TE_IOERR_ACCESS:
b130: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b140: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
b150: 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ESS";      break
b160: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b170: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
b180: 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20  ESERVEDLOCK:.   
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b1b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b1c0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
b1d0: 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LOCK"; break;.  
b1e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1f0: 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20  IOERR_LOCK:     
b200: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b210: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b  ITE_IOERR_LOCK";
b220: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b230: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b240: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20  _IOERR_CLOSE:   
b250: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b260: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
b270: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b280: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b290: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
b2a0: 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  E:    zName = "S
b2b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
b2c0: 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b  CLOSE";   break;
b2d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b2e0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
b2f0: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b300: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b310: 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  OPEN";     break
b320: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b330: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b340: 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  E:      zName = 
b350: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b360: 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61  MSIZE";     brea
b370: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b380: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
b390: 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  CK:      zName =
b3a0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b3b0: 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65  HMLOCK";     bre
b3c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b3d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
b3e0: 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  AP:       zName 
b3f0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b400: 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72  SHMMAP";      br
b410: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b420: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
b430: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
b440: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b450: 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62  _SEEK";        b
b460: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b470: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
b480: 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d  LETE_NOENT: zNam
b490: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b4a0: 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b  R_DELETE_NOENT";
b4b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b4c0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  e SQLITE_IOERR_M
b4d0: 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  MAP:         zNa
b4e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b4f0: 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20  RR_MMAP";       
b500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b510: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b520: 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e  GETTEMPPATH:  zN
b530: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b540: 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22  ERR_GETTEMPPATH"
b550: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
b560: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b570: 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a  _CONVPATH:     z
b580: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b590: 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20  OERR_CONVPATH"; 
b5a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b5b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
b5c0: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  UPT:            
b5d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b5e0: 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  CORRUPT";       
b5f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b600: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
b610: 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20  RUPT_VTAB:      
b620: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b630: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20  _CORRUPT_VTAB"; 
b640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b650: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
b660: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
b670: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b680: 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20  E_NOTFOUND";    
b690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b6a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
b6b0: 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
b6c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b6d0: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
b6e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b6f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b700: 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20  CANTOPEN:       
b710: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b720: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20  ITE_CANTOPEN";  
b730: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b740: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b750: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
b760: 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  DIR: zName = "SQ
b770: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
b780: 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a  TEMPDIR";break;.
b790: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b7a0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
b7b0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
b7c0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
b7d0: 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b  SDIR";    break;
b7e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b7f0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
b800: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
b810: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b820: 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b  FULLPATH"; break
b830: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b840: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
b850: 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  VPATH:  zName = 
b860: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b870: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61  _CONVPATH"; brea
b880: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b890: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20  LITE_PROTOCOL:  
b8a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b8b0: 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   "SQLITE_PROTOCO
b8c0: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
b8d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b8e0: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
b8f0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b900: 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22  = "SQLITE_EMPTY"
b910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
b920: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b930: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20  SQLITE_SCHEMA:  
b940: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b950: 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d   = "SQLITE_SCHEM
b960: 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  A";            b
b970: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b980: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20   SQLITE_TOOBIG: 
b990: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b9a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42  e = "SQLITE_TOOB
b9b0: 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  IG";            
b9c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b9d0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b9e0: 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  INT:         zNa
b9f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
ba00: 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20  STRAINT";       
ba10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ba20: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
ba30: 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e  AINT_UNIQUE:  zN
ba40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
ba50: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22  NSTRAINT_UNIQUE"
ba60: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
ba70: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ba80: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a  RAINT_TRIGGER: z
ba90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
baa0: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
bab0: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
bac0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bad0: 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
bae0: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bb10: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
bb20: 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65  REIGNKEY";   bre
bb30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb40: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bb50: 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20  _CHECK:   zName 
bb60: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bb70: 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72  AINT_CHECK";  br
bb80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bb90: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bba0: 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20  T_PRIMARYKEY:.  
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bbd0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
bbe0: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
bbf0: 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  KEY";   break;. 
bc00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bc10: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
bc20: 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ULL: zName = "SQ
bc30: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bc40: 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a  NOTNULL";break;.
bc50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bc60: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
bc70: 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20  MITHOOK:.       
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bca0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bcb0: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b  INT_COMMITHOOK";
bcc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bcd0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bce0: 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20  TRAINT_VTAB:    
bcf0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd00: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22  CONSTRAINT_VTAB"
bd10: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
bd20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bd30: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
bd40: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bd70: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
bd80: 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61  CTION";     brea
bd90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bda0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bdb0: 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  ROWID:   zName =
bdc0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bdd0: 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65  INT_ROWID";  bre
bde0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bdf0: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20  QLITE_MISMATCH: 
be00: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
be10: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  = "SQLITE_MISMAT
be20: 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  CH";          br
be30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
be40: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20  SQLITE_MISUSE:  
be50: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
be60: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53   = "SQLITE_MISUS
be70: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  E";            b
be80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
be90: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20   SQLITE_NOLFS:  
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
beb0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46  e = "SQLITE_NOLF
bec0: 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S";             
bed0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bee0: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bf00: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54  me = "SQLITE_AUT
bf10: 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  H";             
bf20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bf30: 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  se SQLITE_FORMAT
bf40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bf50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f  ame = "SQLITE_FO
bf60: 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20  RMAT";          
bf70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bf80: 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45  ase SQLITE_RANGE
bf90: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
bfa0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
bfb0: 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20  ANGE";          
bfc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bfd0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41  case SQLITE_NOTA
bfe0: 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  DB:             
bff0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c000: 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20  NOTADB";        
c010: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c020: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57   case SQLITE_ROW
c030: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
c040: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c050: 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20  _ROW";          
c060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c070: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c080: 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20  TICE:           
c090: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c0a0: 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20  E_NOTICE";      
c0b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c0c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c0d0: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
c0e0: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
c0f0: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
c100: 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  R_WAL";break;.  
c110: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c120: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
c130: 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20  OLLBACK:.       
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
c160: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
c170: 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
c180: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
c190: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
c1a0: 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  ING:            
c1b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c1c0: 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20  WARNING";       
c1d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c1e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
c1f0: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20  NING_AUTOINDEX: 
c200: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c210: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
c220: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
c230: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
c240: 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  NE:             
c250: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c260: 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20  E_DONE";        
c270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c280: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61   }.  }.  if( zNa
c290: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  me==0 ){.    sta
c2a0: 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30  tic char zBuf[50
c2b0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
c2c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
c2d0: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c  Buf), zBuf, "SQL
c2e0: 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22  ITE_UNKNOWN(%d)"
c2f0: 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a  , origRc);.    z
c300: 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d  Name = zBuf;.  }
c310: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
c320: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c330: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
c340: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
c350: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
c360: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
c370: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
c380: 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ument..*/.const 
c390: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
c3a0: 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73  Str(int rc){.  s
c3b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c3c0: 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d  * const aMsg[] =
c3d0: 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45   {.    /* SQLITE
c3e0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20  _OK          */ 
c3f0: 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a  "not an error",.
c400: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52      /* SQLITE_ER
c410: 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51  ROR       */ "SQ
c420: 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 22 2c 0a  L logic error",.
c430: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
c440: 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a  TERNAL    */ 0,.
c450: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45      /* SQLITE_PE
c460: 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63  RM        */ "ac
c470: 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20  cess permission 
c480: 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20  denied",.    /* 
c490: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20  SQLITE_ABORT    
c4a0: 20 20 20 2a 2f 20 22 71 75 65 72 79 20 61 62 6f     */ "query abo
c4b0: 72 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rted",.    /* SQ
c4c0: 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20  LITE_BUSY       
c4d0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73   */ "database is
c4e0: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
c4f0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20   SQLITE_LOCKED  
c500: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c510: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
c520: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c530: 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20  _NOMEM       */ 
c540: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  "out of memory",
c550: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
c560: 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61  EADONLY    */ "a
c570: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
c580: 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62  a readonly datab
c590: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
c5a0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20  ITE_INTERRUPT   
c5b0: 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22  */ "interrupted"
c5c0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c5d0: 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22  IOERR       */ "
c5e0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c  disk I/O error",
c5f0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
c600: 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64  ORRUPT     */ "d
c610: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
c620: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22  ge is malformed"
c630: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c640: 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22  NOTFOUND    */ "
c650: 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f  unknown operatio
c660: 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  n",.    /* SQLIT
c670: 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f  E_FULL        */
c680: 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   "database or di
c690: 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20  sk is full",.   
c6a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   /* SQLITE_CANTO
c6b0: 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c  PEN    */ "unabl
c6c0: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
c6d0: 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a  se file",.    /*
c6e0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
c6f0: 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20      */ "locking 
c700: 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f  protocol",.    /
c710: 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20  * SQLITE_EMPTY  
c720: 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f       */ 0,.    /
c730: 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  * SQLITE_SCHEMA 
c740: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
c750: 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61  e schema has cha
c760: 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nged",.    /* SQ
c770: 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20  LITE_TOOBIG     
c780: 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62   */ "string or b
c790: 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20  lob too big",.  
c7a0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53    /* SQLITE_CONS
c7b0: 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73  TRAINT  */ "cons
c7c0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a  traint failed",.
c7d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
c7e0: 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61  SMATCH    */ "da
c7f0: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22  tatype mismatch"
c800: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c810: 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22  MISUSE      */ "
c820: 62 61 64 20 70 61 72 61 6d 65 74 65 72 20 6f 72  bad parameter or
c830: 20 6f 74 68 65 72 20 41 50 49 20 6d 69 73 75 73   other API misus
c840: 65 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e",.#ifdef SQLIT
c850: 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 20 20  E_DISABLE_LFS.  
c860: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46    /* SQLITE_NOLF
c870: 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67  S       */ "larg
c880: 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69  e file support i
c890: 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 23 65 6c  s disabled",.#el
c8a0: 73 65 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  se.    /* SQLITE
c8b0: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
c8c0: 30 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  0,.#endif.    /*
c8d0: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
c8e0: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
c8f0: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
c900: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
c910: 4d 41 54 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  MAT      */ 0,. 
c920: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
c930: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 63 6f 6c  GE       */ "col
c940: 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66  umn index out of
c950: 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20   range",.    /* 
c960: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20  SQLITE_NOTADB   
c970: 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 6e     */ "file is n
c980: 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a  ot a database",.
c990: 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61    };.  const cha
c9a0: 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f  r *zErr = "unkno
c9b0: 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69  wn error";.  swi
c9c0: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63  tch( rc ){.    c
c9d0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
c9e0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20  _ROLLBACK: {.   
c9f0: 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74     zErr = "abort
ca00: 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b   due to ROLLBACK
ca10: 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";.      break;.
ca20: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
ca30: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d  t: {.      rc &=
ca40: 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28   0xff;.      if(
ca50: 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26   ALWAYS(rc>=0) &
ca60: 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61  & rc<ArraySize(a
ca70: 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d  Msg) && aMsg[rc]
ca80: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  !=0 ){.        z
ca90: 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a  Err = aMsg[rc];.
caa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
cab0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
cac0: 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a   return zErr;.}.
cad0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
cae0: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ine implements a
caf0: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74   busy callback t
cb00: 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74  hat sleeps and t
cb10: 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e  ries.** again un
cb20: 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61  til a timeout va
cb30: 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20  lue is reached. 
cb40: 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c   The timeout val
cb50: 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65  ue is.** an inte
cb60: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ger number of mi
cb70: 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65  lliseconds passe
cb80: 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73  d in as the firs
cb90: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  t.** argument..*
cba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
cbb0: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
cbc0: 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70  llback(. void *p
cbd0: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
cbe0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
cbf0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74  nnection */. int
cc00: 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20   count          
cc10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cc20: 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68  of times table h
cc30: 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a  as been busy */.
cc40: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
cc50: 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c  _WIN || HAVE_USL
cc60: 45 45 50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EEP.  static con
cc70: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
cc80: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
cc90: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
cca0: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
ccb0: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
ccc0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
ccd0: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
cce0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
ccf0: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
cd00: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
cd10: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
cd20: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
cd30: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
cd40: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
cd50: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
cd60: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
cd70: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
cd80: 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65  , prior;..  asse
cd90: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
cda0: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
cdb0: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
cdc0: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
cdd0: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
cde0: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
cdf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
ce00: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
ce10: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
ce20: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
ce30: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
ce40: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
ce50: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
ce60: 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20  delay > timeout 
ce70: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
ce80: 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a  imeout - prior;.
ce90: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
cea0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
ceb0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
cec0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
ced0: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
cee0: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  n 1;.#else.  sql
cef0: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
cf00: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
cf10: 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c   timeout = ((sql
cf20: 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73  ite3 *)ptr)->bus
cf30: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20  yTimeout;.  if( 
cf40: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
cf50: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
cf60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cf70: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
cf80: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
cf90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
cfa0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
cfb0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
cfc0: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
cfd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cfe0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
cff0: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
d000: 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e  led with a lock.
d010: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
d020: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
d030: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
d040: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
d050: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
d060: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
d070: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
d080: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
d090: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
d0a0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
d0b0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b  BusyHandler *p){
d0c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
d0d0: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20   p->xFunc==0 || 
d0e0: 70 2d 3e 6e 42 75 73 79 3c 30 20 29 7b 0a 20 20  p->nBusy<0 ){.  
d0f0: 20 20 70 2d 3e 6e 54 69 6d 65 6f 75 74 2b 2b 3b    p->nTimeout++;
d100: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d110: 20 7d 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75   }.  rc = p->xFu
d120: 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e  nc(p->pArg, p->n
d130: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d  Busy);.  if( rc=
d140: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 69  =0 ){.    p->nTi
d150: 6d 65 6f 75 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e  meout++;.    p->
d160: 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  nBusy = -1;.  }e
d170: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  lse{.    p->nBus
d180: 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  y++;.  }.  retur
d190: 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n rc; .}../*.** 
d1a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
d1b0: 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  s the busy callb
d1c0: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
d1d0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
d1e0: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
d1f0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
d200: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
d210: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
d220: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
d230: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
d240: 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  ,.  int (*xBusy)
d250: 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76  (void*,int),.  v
d260: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66  oid *pArg.){.#if
d270: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d280: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
d290: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
d2a0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
d2b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
d2c0: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
d2d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d2e0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d2f0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
d300: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
d310: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
d320: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
d330: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
d340: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
d350: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d360: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
d370: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d380: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d390: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
d3a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d3b0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
d3c0: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
d3d0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
d3e0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
d3f0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
d400: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
d410: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
d420: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
d430: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
d440: 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73  ent. The progres
d450: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a  s callback will.
d460: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76  ** be invoked ev
d470: 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73  ery nOps opcodes
d480: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d490: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
d4a0: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
d4b0: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
d4c0: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
d4d0: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
d4e0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64  id *pArg.){.#ifd
d4f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d500: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
d510: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
d520: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
d530: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
d540: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
d550: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d560: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
d570: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d580: 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e  ex);.  if( nOps>
d590: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  0 ){.    db->xPr
d5a0: 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65  ogress = xProgre
d5b0: 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f  ss;.    db->nPro
d5c0: 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69  gressOps = (unsi
d5d0: 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64  gned)nOps;.    d
d5e0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
d5f0: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
d600: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
d610: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
d620: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
d630: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
d640: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
d650: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d660: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d670: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
d680: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d690: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
d6a0: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
d6b0: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
d6c0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
d6d0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d6e0: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
d6f0: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
d700: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
d710: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
d720: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66  db, int ms){.#if
d730: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d740: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
d750: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
d760: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
d770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
d780: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
d790: 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20    if( ms>0 ){.  
d7a0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
d7b0: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
d7c0: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
d7d0: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
d7e0: 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  ;.    db->busyTi
d7f0: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65  meout = ms;.  }e
d800: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
d810: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
d820: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
d830: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20  .}../*.** Cause 
d850: 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72  any pending oper
d860: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74  ation to stop at
d870: 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70   its earliest op
d880: 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f  portunity..*/.vo
d890: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  id sqlite3_inter
d8a0: 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62  rupt(sqlite3 *db
d8b0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
d8c0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
d8d0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
d8e0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
d8f0: 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20 64  ) && (db==0 || d
d900: 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45  b->magic!=SQLITE
d910: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20 29  _MAGIC_ZOMBIE) )
d920: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
d930: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
d940: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d950: 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e  #endif.  db->u1.
d960: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
d970: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
d980: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
d990: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
d9a0: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
d9b0: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
d9c0: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
d9d0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
d9e0: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
d9f0: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
da00: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
da10: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
da20: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
da30: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
da40: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
da50: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
da60: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
da70: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
da80: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
da90: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
daa0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
dab0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
dac0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
dad0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
dae0: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
daf0: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
db00: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
db10: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
db20: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
db30: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
db40: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
db50: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
db60: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
db70: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
db80: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75  _context*),.  Fu
db90: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
dba0: 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46  estructor.){.  F
dbb0: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
dbc0: 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78   nName;.  int ex
dbd0: 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73  traFlags;..  ass
dbe0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
dbf0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
dc00: 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e  x) );.  if( zFun
dc10: 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a  ctionName==0 ||.
dc20: 20 20 20 20 20 20 28 78 53 46 75 6e 63 20 26 26        (xSFunc &&
dc30: 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65   (xFinal || xSte
dc40: 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21  p)) || .      (!
dc50: 78 53 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  xSFunc && (xFina
dc60: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
dc70: 0a 20 20 20 20 20 20 28 21 78 53 46 75 6e 63 20  .      (!xSFunc 
dc80: 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78  && (!xFinal && x
dc90: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
dca0: 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67  (nArg<-1 || nArg
dcb0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  >SQLITE_MAX_FUNC
dcc0: 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20  TION_ARG) ||.   
dcd0: 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d     (255<(nName =
dce0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
dcf0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29  ( zFunctionName)
dd00: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
dd10: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
dd20: 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  KPT;.  }..  asse
dd30: 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
dd40: 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45  CONSTANT==SQLITE
dd50: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
dd60: 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d  ;.  extraFlags =
dd70: 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44   enc &  SQLITE_D
dd80: 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20  ETERMINISTIC;.  
dd90: 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46  enc &= (SQLITE_F
dda0: 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49  UNC_ENCMASK|SQLI
ddb0: 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e  TE_ANY);.  .#ifn
ddc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ddd0: 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51  UTF16.  /* If SQ
dde0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
ddf0: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
de00: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
de10: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
de20: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
de30: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
de40: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
de50: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
de60: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
de70: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
de80: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
de90: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a  nternally..  **.
dea0: 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41    ** If SQLITE_A
deb0: 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  NY is specified,
dec0: 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69   add three versi
ded0: 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ons of the funct
dee0: 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ion.  ** to the 
def0: 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  hash table..  */
df00: 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  .  if( enc==SQLI
df10: 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20  TE_UTF16 ){.    
df20: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
df30: 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73  16NATIVE;.  }els
df40: 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54  e if( enc==SQLIT
df50: 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74  E_ANY ){.    int
df60: 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
df70: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
df80: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
df90: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
dfa0: 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c  UTF8|extraFlags,
dfb0: 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44  .         pUserD
dfc0: 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  ata, xSFunc, xSt
dfd0: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
dfe0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  tructor);.    if
dff0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e000: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
e010: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
e020: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
e030: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
e040: 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61  UTF16LE|extraFla
e050: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55  gs,.          pU
e060: 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c  serData, xSFunc,
e070: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
e080: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
e090: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
e0a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e0b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e0c0: 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51    }.    enc = SQ
e0d0: 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20  LITE_UTF16BE;.  
e0e0: 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20  }.#else.  enc = 
e0f0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e  SQLITE_UTF8;.#en
e100: 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63  dif.  .  /* Chec
e110: 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67  k if an existing
e120: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
e130: 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72  ng overridden or
e140: 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c   deleted. If so,
e150: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20  .  ** and there 
e160: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
e170: 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  then return SQLI
e180: 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75  TE_BUSY. If a fu
e190: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62  nction.  ** is b
e1a0: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f  eing overridden/
e1b0: 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72  deleted but ther
e1c0: 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  e are no active 
e1d0: 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20  VMs, allow the. 
e1e0: 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f   ** operation to
e1f0: 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e   continue but in
e200: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65  validate all pre
e210: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
e220: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  nts..  */.  p = 
e230: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
e240: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
e250: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
e260: 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  )enc, 0);.  if( 
e270: 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61  p && (p->funcFla
e280: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
e290: 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26  _ENCMASK)==enc &
e2a0: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
e2b0: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
e2c0: 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
e2d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e2e0: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
e2f0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
e300: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
e310: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
e320: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
e330: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
e340: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
e350: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
e360: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
e370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
e380: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e390: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
e3a0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
e3b0: 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ts(db);.    }.  
e3c0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
e3d0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
e3e0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
e3f0: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31  nArg, (u8)enc, 1
e400: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c  );.  assert(p ||
e410: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
e420: 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  d);.  if( !p ){.
e430: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e440: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
e450: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c  }..  /* If an ol
e460: 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  der version of t
e470: 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  he function with
e480: 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65   a configured de
e490: 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a  structor is.  **
e4a0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
e4b0: 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
e4c0: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68  uctor function h
e4d0: 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69  ere. */.  functi
e4e0: 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29  onDestroy(db, p)
e4f0: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 72 75  ;..  if( pDestru
e500: 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73  ctor ){.    pDes
e510: 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b  tructor->nRef++;
e520: 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70 44 65 73  .  }.  p->u.pDes
e530: 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72  tructor = pDestr
e540: 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e 63  uctor;.  p->func
e550: 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e 63  Flags = (p->func
e560: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
e570: 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20 65  UNC_ENCMASK) | e
e580: 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74 65 73  xtraFlags;.  tes
e590: 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63 46 6c  tcase( p->funcFl
e5a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45 54  ags & SQLITE_DET
e5b0: 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20  ERMINISTIC );.  
e5c0: 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78 53 46 75  p->xSFunc = xSFu
e5d0: 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a 20 78 53  nc ? xSFunc : xS
e5e0: 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c  tep;.  p->xFinal
e5f0: 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20  ize = xFinal;.  
e600: 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  p->pUserData = p
e610: 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e  UserData;.  p->n
e620: 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b  Arg = (u16)nArg;
e630: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e640: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
e650: 65 61 74 65 20 6e 65 77 20 75 73 65 72 20 66 75  eate new user fu
e660: 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  nctions..*/.int 
e670: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e680: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
e690: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
e6a0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69  char *zFunc,.  i
e6b0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
e6c0: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  nc,.  void *p,. 
e6d0: 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28   void (*xSFunc)(
e6e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e6f0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e700: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e710: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
e720: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e730: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e740: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
e750: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e760: 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  *).){.  return s
e770: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e780: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46  nction_v2(db, zF
e790: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
e7a0: 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70  p, xSFunc, xStep
e7b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29        xFinal, 0)
e7e0: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
e7f0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e800: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
e810: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
e820: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
e830: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
e840: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
e850: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
e860: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e870: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e880: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
e890: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
e8a0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e8b0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e8c0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
e8d0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
e8e0: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f    void (*xDestro
e8f0: 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20  y)(void *).){.  
e900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e910: 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73  ERROR;.  FuncDes
e920: 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20  tructor *pArg = 
e930: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
e940: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e950: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
e960: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
e970: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
e980: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
e990: 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
e9a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e9b0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
e9c0: 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f 79  ;.  if( xDestroy
e9d0: 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28   ){.    pArg = (
e9e0: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
e9f0: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
ea00: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
ea10: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29  FuncDestructor))
ea20: 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72 67 20  ;.    if( !pArg 
ea30: 29 7b 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f  ){.      xDestro
ea40: 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  y(p);.      goto
ea50: 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20   out;.    }.    
ea60: 70 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d  pArg->xDestroy =
ea70: 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70   xDestroy;.    p
ea80: 41 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d  Arg->pUserData =
ea90: 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   p;.  }.  rc = s
eaa0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
eab0: 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67  (db, zFunc, nArg
eac0: 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63  , enc, p, xSFunc
ead0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
eae0: 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41   pArg);.  if( pA
eaf0: 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66  rg && pArg->nRef
eb00: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
eb10: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
eb20: 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79   );.    xDestroy
eb30: 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
eb40: 44 62 46 72 65 65 28 64 62 2c 20 70 41 72 67 29  DbFree(db, pArg)
eb50: 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72  ;.  }.. out:.  r
eb60: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
eb70: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
eb80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
eb90: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
eba0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
ebb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ebc0: 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69  T_UTF16.int sqli
ebd0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
ebe0: 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
ebf0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f   *db,.  const vo
ec00: 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  id *zFunctionNam
ec10: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
ec20: 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20   int eTextRep,. 
ec30: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
ec40: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
ec50: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
ec60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
ec70: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
ec80: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
ec90: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
eca0: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
ecb0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
ecc0: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
ecd0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
ece0: 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66  *zFunc8;..#ifdef
ecf0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
ed00: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
ed10: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
ed20: 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e  ckOk(db) || zFun
ed30: 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72  ctionName==0 ) r
ed40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
ed50: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
ed60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ed70: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
ed80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
ed90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
eda0: 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c  ;.  zFunc8 = sql
edb0: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
edc0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
edd0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
ede0: 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20  NATIVE);.  rc = 
edf0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
ee00: 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
ee10: 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
ee20: 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c 78 46   xSFunc,xStep,xF
ee30: 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74  inal,0);.  sqlit
ee40: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75  e3DbFree(db, zFu
ee50: 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nc8);.  rc = sql
ee60: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
ee70: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
ee80: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ee90: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
eea0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  rc;.}.#endif.../
eeb0: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61  *.** Declare tha
eec0: 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  t a function has
eed0: 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64   been overloaded
eee0: 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61   by a virtual ta
eef0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
ef00: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61  e function alrea
ef10: 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72  dy exists as a r
ef20: 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75  egular global fu
ef30: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20  nction, then.** 
ef40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
ef50: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65  a no-op.  If the
ef60: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
ef70: 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63  ot exist, then c
ef80: 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f  reate.** a new o
ef90: 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74  ne that always t
efa0: 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65  hrows a run-time
efb0: 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20   error.  .**.** 
efc0: 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62  When virtual tab
efd0: 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72  les intend to pr
efe0: 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61  ovide an overloa
eff0: 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  ded function, th
f000: 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c  ey.** should cal
f010: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  l this routine t
f020: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
f030: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
f040: 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f  exists..** A glo
f050: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  bal function mus
f060: 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72  t exist in order
f070: 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75   for name resolu
f080: 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20  tion to work.** 
f090: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74  properly..*/.int
f0a0: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
f0b0: 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  d_function(.  sq
f0c0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
f0d0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
f0e0: 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20    int nArg.){.  
f0f0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f100: 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
f110: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f120: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f130: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f140: 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
f150: 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20  || nArg<-2 ){.  
f160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f170: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
f180: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f190: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f1a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
f1b0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
f1c0: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
f1d0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
f1e0: 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , 0)==0 ){.    r
f1f0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
f200: 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c  eFunc(db, zName,
f210: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
f220: 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  F8,.            
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
f240: 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64  , sqlite3Invalid
f250: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  Function, 0, 0, 
f260: 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  0);.  }.  rc = s
f270: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
f280: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
f290: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f2a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f2b0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
f2c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
f2d0: 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  CE./*.** Registe
f2e0: 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74 69  r a trace functi
f2f0: 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72  on.  The pArg fr
f300: 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  om the previousl
f310: 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72 61  y registered tra
f320: 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  ce.** is returne
f330: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
f340: 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  L trace function
f350: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74   means that no t
f360: 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75 74  racing is execut
f370: 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a  es.  A non-NULL.
f380: 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70 6f  ** trace is a po
f390: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
f3a0: 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f  ion that is invo
f3b0: 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  ked at the start
f3c0: 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20   of each.** SQL 
f3d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69  statement..*/.#i
f3e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f3f0: 54 5f 44 45 50 52 45 43 41 54 45 44 0a 76 6f 69  T_DEPRECATED.voi
f400: 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65  d *sqlite3_trace
f410: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
f420: 69 64 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64  id(*xTrace)(void
f430: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20  *,const char*), 
f440: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76  void *pArg){.  v
f450: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64  oid *pOld;..#ifd
f460: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f470: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
f480: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f490: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
f4a0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
f4b0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
f4c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
f4d0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
f4e0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f4f0: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
f500: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20  db->pTraceArg;. 
f510: 20 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 78 54   db->mTrace = xT
f520: 72 61 63 65 20 3f 20 53 51 4c 49 54 45 5f 54 52  race ? SQLITE_TR
f530: 41 43 45 5f 4c 45 47 41 43 59 20 3a 20 30 3b 0a  ACE_LEGACY : 0;.
f540: 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 28    db->xTrace = (
f550: 69 6e 74 28 2a 29 28 75 33 32 2c 76 6f 69 64 2a  int(*)(u32,void*
f560: 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 29 78 54  ,void*,void*))xT
f570: 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61  race;.  db->pTra
f580: 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ceArg = pArg;.  
f590: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f5a0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f5b0: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
f5c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f5d0: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
f5e0: 44 20 2a 2f 0a 0a 2f 2a 20 52 65 67 69 73 74 65  D */../* Registe
f5f0: 72 20 61 20 74 72 61 63 65 20 63 61 6c 6c 62 61  r a trace callba
f600: 63 6b 20 75 73 69 6e 67 20 74 68 65 20 76 65 72  ck using the ver
f610: 73 69 6f 6e 2d 32 20 69 6e 74 65 72 66 61 63 65  sion-2 interface
f620: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f630: 5f 74 72 61 63 65 5f 76 32 28 0a 20 20 73 71 6c  _trace_v2(.  sql
f640: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 63 65          /* Trace
f670: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
f680: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d   */.  unsigned m
f690: 54 72 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Trace,          
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 76 65 6e   /* Mask of even
f6c0: 74 73 20 74 6f 20 62 65 20 74 72 61 63 65 64 20  ts to be traced 
f6d0: 2a 2f 0a 20 20 69 6e 74 28 2a 78 54 72 61 63 65  */.  int(*xTrace
f6e0: 29 28 75 6e 73 69 67 6e 65 64 2c 76 6f 69 64 2a  )(unsigned,void*
f6f0: 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 2c 20 20  ,void*,void*),  
f700: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 69  /* Callback to i
f710: 6e 76 6f 6b 65 20 2a 2f 0a 20 20 76 6f 69 64 20  nvoke */.  void 
f720: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
f750: 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51   */.){.#ifdef SQ
f760: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
f770: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
f780: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
f790: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
f7a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
f7b0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
f7c0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f7d0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f7e0: 65 78 29 3b 0a 20 20 69 66 28 20 6d 54 72 61 63  ex);.  if( mTrac
f7f0: 65 3d 3d 30 20 29 20 78 54 72 61 63 65 20 3d 20  e==0 ) xTrace = 
f800: 30 3b 0a 20 20 69 66 28 20 78 54 72 61 63 65 3d  0;.  if( xTrace=
f810: 3d 30 20 29 20 6d 54 72 61 63 65 20 3d 20 30 3b  =0 ) mTrace = 0;
f820: 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20  .  db->mTrace = 
f830: 6d 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 78 54  mTrace;.  db->xT
f840: 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20  race = xTrace;. 
f850: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
f860: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
f870: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f880: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f890: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f8a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f8b0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
f8c0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
f8d0: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
f8e0: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
f8f0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
f900: 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70  registered .** p
f910: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
f920: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
f930: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66  *.** A NULL prof
f940: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ile function mea
f950: 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69  ns that no profi
f960: 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  ling is executes
f970: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
f980: 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f   profile is a po
f990: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
f9a0: 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f  ion that is invo
f9b0: 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  ked at the concl
f9c0: 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68  usion of.** each
f9d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
f9e0: 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76  hat is run..*/.v
f9f0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f  oid *sqlite3_pro
fa00: 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20  file(.  sqlite3 
fa10: 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50  *db,.  void (*xP
fa20: 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f  rofile)(void*,co
fa30: 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
fa40: 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  _uint64),.  void
fa50: 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64   *pArg.){.  void
fa60: 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
fa70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
fa80: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
fa90: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
faa0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
fab0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
fac0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
fad0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
fae0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
faf0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
fb00: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
fb10: 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20  >pProfileArg;.  
fb20: 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78  db->xProfile = x
fb30: 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70  Profile;.  db->p
fb40: 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72  ProfileArg = pAr
fb50: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
fb60: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
fb70: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
fb80: 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ld;.}.#endif /* 
fb90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
fba0: 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69 66  ECATED */.#endif
fbb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fbc0: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
fbd0: 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74  Register a funct
fbe0: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
fbf0: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
fc00: 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a  tion commits..**
fc10: 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20   If the invoked 
fc20: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
fc30: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
fc40: 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d  the commit becom
fc50: 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  es a.** rollback
fc60: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
fc70: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a  e3_commit_hook(.
fc80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fca0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
fcb0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
fcc0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c  */.  int (*xCall
fcd0: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f  back)(void*),  /
fce0: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e  * Function to in
fcf0: 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d  voke on each com
fd00: 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  mit */.  void *p
fd10: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
fd20: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
fd30: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
fd40: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  /.){.  void *pOl
fd50: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
fd60: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
fd70: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
fd80: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
fd90: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
fda0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
fdb0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
fdc0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
fdd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fde0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
fdf0: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
fe00: 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
fe10: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
fe20: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
fe30: 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
fe40: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
fe50: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
fe60: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
fe70: 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
fe80: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
fe90: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
fea0: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
feb0: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
fec0: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
fed0: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
fee0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
fef0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
ff00: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
ff10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff30: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
ff40: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
ff50: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
ff60: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
ff70: 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
ff80: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
ff90: 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
ffa0: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
ffb0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
ffc0: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
ffd0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
ffe0: 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53  *pRet;..#ifdef S
fff0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
10000 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
10010 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
10020 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
10030 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
10040 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
10050 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
10060 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10070 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
10080 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
10090 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62  pUpdateArg;.  db
100a0 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
100b0 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
100c0 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20   db->pUpdateArg 
100d0 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
100e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
100f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
10100 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
10110 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
10120 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
10130 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
10140 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
10150 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79  olled.** back by
10160 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
10170 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
10180 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c  id *sqlite3_roll
10190 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  back_hook(.  sql
101a0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
101b0 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
101c0 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
101d0 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
101e0 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
101f0 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c  )(void*), /* Cal
10200 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
10210 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10230 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
10240 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
10250 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
10260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10270 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10280 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10290 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
102a0 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
102b0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
102c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
102d0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
102e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
102f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
10300 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   = db->pRollback
10310 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c  Arg;.  db->xRoll
10320 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78  backCallback = x
10330 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
10340 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70  pRollbackArg = p
10350 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
10360 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
10370 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10380 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  pRet;.}..#ifdef 
10390 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
103a0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a  EUPDATE_HOOK./*.
103b0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
103c0 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
103d0 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
103e0 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
103f0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
10400 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
10410 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
10420 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
10430 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61  *sqlite3_preupda
10440 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  te_hook(.  sqlit
10450 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
10460 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
10470 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
10480 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
10490 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20  id(*xCallback)( 
104a0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62          /* Callb
104b0 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
104c0 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65      void*,sqlite
104d0 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  3*,int,char cons
104e0 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73  t*,char const*,s
104f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c  qlite3_int64,sql
10500 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76  ite3_int64),.  v
10510 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
10520 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
10530 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d  t callback argum
10540 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ent */.){.  void
10550 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
10560 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10570 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
10580 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74   = db->pPreUpdat
10590 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65  eArg;.  db->xPre
105a0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
105b0 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
105c0 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 20  ->pPreUpdateArg 
105d0 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
105e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
105f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
10600 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
10610 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
10620 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
10630 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
10640 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
10650 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
10660 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
10670 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
10680 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  y sqlite3_wal_au
10690 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a  tocheckpoint()..
106a0 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ** Invoke sqlite
106b0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
106c0 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
106d0 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  f frames in the 
106e0 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67  log file.** is g
106f0 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69  reater than sqli
10700 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74  te3.pWalArg cast
10710 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28   to an integer (
10720 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
10730 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61  ured by.** wal_a
10740 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29  utocheckpoint())
10750 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
10760 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28  3WalDefaultHook(
10770 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  .  void *pClient
10780 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67  Data,     /* Arg
10790 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ument */.  sqlit
107a0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
107b0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
107c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
107d0 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44  *zDb,       /* D
107e0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
107f0 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20   nFrame         
10800 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57      /* Size of W
10810 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e  AL */.){.  if( n
10820 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54  Frame>=SQLITE_PT
10830 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74  R_TO_INT(pClient
10840 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c  Data) ){.    sql
10850 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
10860 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
10870 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10880 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
10890 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
108a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
108b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
108c0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
108d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
108e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  */../*.** Config
108f0 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77  ure an sqlite3_w
10900 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
10910 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ck to automatica
10920 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  lly checkpoint.*
10930 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74  * a database aft
10940 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
10950 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
10960 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20  here are nFrame 
10970 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65  or.** more frame
10980 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
10990 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20  e. Passing zero 
109a0 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  or a negative va
109b0 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46  lue as the.** nF
109c0 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64  rame parameter d
109d0 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69  isables automati
109e0 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e  c checkpoints en
109f0 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  tirely..**.** Th
10a00 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  e callback regis
10a10 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
10a20 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20  nction replaces 
10a30 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c  any existing cal
10a40 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65  lback.** registe
10a50 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  red using sqlite
10a60 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69  3_wal_hook(). Li
10a70 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72  kewise, register
10a80 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a  ing a callback.*
10a90 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  * using sqlite3_
10aa0 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62  wal_hook() disab
10ab0 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  les the automati
10ac0 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63  c checkpoint mec
10ad0 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67  hanism.** config
10ae0 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ured by this fun
10af0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
10b00 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
10b10 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
10b20 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65   *db, int nFrame
10b30 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
10b40 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53  _OMIT_WAL.  UNUS
10b50 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
10b60 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
10b70 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65  ETER(nFrame);.#e
10b80 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49 54  lse.#ifdef SQLIT
10b90 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10ba0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10bb0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10bc0 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
10bd0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10be0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46 72  #endif.  if( nFr
10bf0 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ame>0 ){.    sql
10c00 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
10c10 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  , sqlite3WalDefa
10c20 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f  ultHook, SQLITE_
10c30 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d  INT_TO_PTR(nFram
10c40 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
10c50 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
10c60 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  ok(db, 0, 0);.  
10c70 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
10c80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10c90 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
10ca0 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
10cb0 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
10cc0 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
10cd0 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
10ce0 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65  to the write-ahe
10cf0 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64  ad-log by this d
10d00 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10d10 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
10d20 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20  ite3_wal_hook(. 
10d30 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
10d60 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68  ook to this db h
10d70 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a  andle */.  int(*
10d80 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20  xCallback)(void 
10d90 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e  *, sqlite3*, con
10da0 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a  st char*, int),.
10db0 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
10de0 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43  ent passed to xC
10df0 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a  allback() */.){.
10e00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10e10 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a  MIT_WAL.  void *
10e20 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  pRet;.#ifdef SQL
10e30 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10e40 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
10e50 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
10e60 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
10e70 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
10e80 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
10e90 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
10ea0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10eb0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10ec0 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57  .  pRet = db->pW
10ed0 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61  alArg;.  db->xWa
10ee0 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  lCallback = xCal
10ef0 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61  lback;.  db->pWa
10f00 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  lArg = pArg;.  s
10f10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10f20 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10f30 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65   return pRet;.#e
10f40 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  lse.  return 0;.
10f50 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
10f60 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
10f70 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20  ase zDb..*/.int 
10f80 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
10f90 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c  kpoint_v2(.  sql
10fa0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10fc0 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
10fd0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10fe0 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *zDb,           
10ff0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11000 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
11010 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  e (or NULL) */. 
11020 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20   int eMode,     
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
11050 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f  POINT_* value */
11060 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20  .  int *pnLog,  
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
11090 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72  of WAL log in fr
110a0 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ames */.  int *p
110b0 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20 20  nCkpt           
110c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
110d0 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  : Total number o
110e0 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f  f frames checkpo
110f0 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64  inted */.){.#ifd
11100 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
11110 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  AL.  return SQLI
11120 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69  TE_OK;.#else.  i
11130 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
11140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11150 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
11160 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c  .  int iDb = SQL
11170 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
11180 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44  ;  /* sqlite3.aD
11190 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20  b[] index of db 
111a0 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  to checkpoint */
111b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
111c0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
111d0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
111e0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
111f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
11200 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
11210 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ndif..  /* Initi
11220 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
11230 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31   variables to -1
11240 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
11250 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69  r occurs. */.  i
11260 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f  f( pnLog ) *pnLo
11270 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e  g = -1;.  if( pn
11280 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d  Ckpt ) *pnCkpt =
11290 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   -1;..  assert( 
112a0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
112b0 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a  T_PASSIVE==0 );.
112c0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
112d0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
112e0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
112f0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
11300 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b  NT_RESTART==2 );
11310 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
11320 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
11330 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66  NCATE==3 );.  if
11340 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
11350 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
11360 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
11370 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55  E_CHECKPOINT_TRU
11380 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  NCATE ){.    /* 
11390 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
113a0 33 39 39 36 2d 31 32 30 38 38 20 54 68 65 20 4d  3996-12088 The M
113b0 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20   parameter must 
113c0 62 65 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b  be a valid check
113d0 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64  point.    ** mod
113e0 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  e: */.    return
113f0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
11400 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d    }..  sqlite3_m
11410 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
11420 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62  utex);.  if( zDb
11430 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20   && zDb[0] ){.  
11440 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
11450 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
11460 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44  b);.  }.  if( iD
11470 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  b<0 ){.    rc = 
11480 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
11490 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
114a0 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
114b0 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e  _ERROR, "unknown
114c0 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20   database: %s", 
114d0 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  zDb);.  }else{. 
114e0 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c     db->busyHandl
114f0 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
11500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
11510 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62  eckpoint(db, iDb
11520 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
11530 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c  pnCkpt);.    sql
11540 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
11550 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
11560 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
11570 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   rc);..  /* If t
11580 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
11590 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 63  ve statements, c
115a0 6c 65 61 72 20 74 68 65 20 69 6e 74 65 72 72 75  lear the interru
115b0 70 74 20 66 6c 61 67 20 61 74 20 74 68 69 73 0a  pt flag at this.
115c0 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a    ** point.  */.
115d0 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
115e0 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ctive==0 ){.    
115f0 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
11600 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pted = 0;.  }.. 
11610 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11620 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
11630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
11640 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.}.../*.** C
11650 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
11660 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69  se zDb. If zDb i
11670 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68  s NULL, or if th
11680 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69  e buffer zDb poi
11690 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69  nts.** to contai
116a0 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ns a zero-length
116b0 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74   string, all att
116c0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
116d0 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69  are .** checkpoi
116e0 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
116f0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
11700 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
11710 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
11720 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ){.  /* EVIDENCE
11730 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35  -OF: R-41613-205
11740 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  53 The sqlite3_w
11750 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c  al_checkpoint(D,
11760 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  X) is equivalent
11770 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   to.  ** sqlite3
11780 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
11790 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48  v2(D,X,SQLITE_CH
117a0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
117b0 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75  ,0,0). */.  retu
117c0 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
117d0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
117e0 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  zDb,SQLITE_CHECK
117f0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
11800 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
11810 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
11820 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b  *.** Run a check
11830 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73  point on databas
11840 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61  e iDb. This is a
11850 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61   no-op if databa
11860 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74  se iDb is.** not
11870 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20   currently open 
11880 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  in WAL mode..**.
11890 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
118a0 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74  ion is open on t
118b0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e  he database bein
118c0 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20  g checkpointed, 
118d0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
118e0 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
118f0 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68  _LOCKED and a ch
11900 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  eckpoint is not 
11910 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a  attempted. If .*
11920 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
11930 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20  s while running 
11940 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20  the checkpoint, 
11950 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
11960 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75  code is .** retu
11970 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54  rned (i.e. SQLIT
11980 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77  E_IOERR). Otherw
11990 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
119a0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
119b0 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
119c0 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20  le db should be 
119d0 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c  held by the call
119e0 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a  er. The mutex.**
119f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11a00 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d   the specific b-
11a10 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b  tree being check
11a20 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e  pointed is taken
11a30 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63   by.** this func
11a40 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63  tion while the c
11a50 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e  heckpoint is run
11a60 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  ning..**.** If i
11a70 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c  Db is passed SQL
11a80 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
11a90 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63  , then all attac
11aa0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
11ab0 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65  e.** checkpointe
11ac0 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  d. If an error i
11ad0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
11ae0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d   is returned imm
11af0 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f  ediately -.** no
11b00 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
11b10 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61   to checkpoint a
11b20 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74  ny remaining dat
11b30 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61  abases..**.** Pa
11b40 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73  rameter eMode is
11b50 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43   one of SQLITE_C
11b60 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
11b70 45 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41 52 54  E, FULL, RESTART
11b80 0a 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54 45 2e  .** or TRUNCATE.
11b90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
11ba0 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
11bb0 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
11bc0 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a  int eMode, int *
11bd0 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b  pnLog, int *pnCk
11be0 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pt){.  int rc = 
11bf0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
11c00 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11c10 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
11c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
11c40 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
11c50 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64  rough attached d
11c60 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73  bs */.  int bBus
11c70 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
11c80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
11c90 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68  if SQLITE_BUSY h
11ca0 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  as been encounte
11cb0 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  red */..  assert
11cc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11cd0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
11ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
11cf0 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d  Log || *pnLog==-
11d00 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
11d10 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70  pnCkpt || *pnCkp
11d20 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28  t==-1 );..  for(
11d30 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26  i=0; i<db->nDb &
11d40 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
11d50 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
11d60 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51  ==iDb || iDb==SQ
11d70 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
11d80 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
11d90 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63  sqlite3BtreeChec
11da0 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69  kpoint(db->aDb[i
11db0 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e  ].pBt, eMode, pn
11dc0 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
11dd0 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20      pnLog = 0;. 
11de0 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b       pnCkpt = 0;
11df0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
11e00 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
11e10 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b        bBusy = 1;
11e20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
11e30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
11e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
11e50 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
11e60 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20  _OK && bBusy) ? 
11e70 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
11e80 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
11e90 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
11ea0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11eb0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
11ec0 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72  ue if main-memor
11ed0 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
11ee0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61   instead of.** a
11ef0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
11f00 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61  for transient pa
11f10 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74  ger files and st
11f20 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
11f30 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
11f40 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20  eturned depends 
11f50 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
11f60 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28  db->temp_store (
11f70 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d  runtime.** param
11f80 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f  eter) and the co
11f90 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
11fa0 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   of SQLITE_TEMP_
11fb0 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f  STORE. The.** fo
11fc0 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
11fd0 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61  scribes the rela
11fe0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
11ff0 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65   these two value
12000 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75  s.** and this fu
12010 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76  nctions return v
12020 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51  alue..**.**   SQ
12030 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
12040 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
12050 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
12060 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
12070 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
12080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
12090 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
120a0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
120b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
120c0 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
120e0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
120f0 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
12100 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
12130 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
12140 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
12170 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
12180 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
12190 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
121a0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
121b0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
121c0 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
121d0 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
121e0 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
12200 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
12210 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
12250 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 1).**   2     
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
12280 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
12290 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20  turn 1).**   3  
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
122c0 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
122d0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e  (return 1).*/.in
122e0 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  t sqlite3TempInM
122f0 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69  emory(const sqli
12300 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51  te3 *db){.#if SQ
12310 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
12320 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =1.  return ( db
12330 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
12340 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
12350 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
12360 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =2.  return ( db
12370 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
12380 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
12390 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
123a0 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  =3.  UNUSED_PARA
123b0 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74  METER(db);.  ret
123c0 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  urn 1;.#endif.#i
123d0 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
123e0 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f  ORE<1 || SQLITE_
123f0 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55  TEMP_STORE>3.  U
12400 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12410 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  db);.  return 0;
12420 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12430 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e   Return UTF-8 en
12440 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
12450 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
12460 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
12470 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
12480 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
12490 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71  qlite3_errmsg(sq
124a0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
124b0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
124c0 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
124d0 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
124e0 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  tr(SQLITE_NOMEM_
124f0 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28  BKPT);.  }.  if(
12500 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
12510 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
12520 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
12530 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
12540 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29  ITE_MISUSE_BKPT)
12550 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
12560 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
12570 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
12580 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12590 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
125a0 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
125b0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65  OMEM_BKPT);.  }e
125c0 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73  lse{.    testcas
125d0 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  e( db->pErr==0 )
125e0 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a  ;.    z = (char*
125f0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
12600 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ext(db->pErr);. 
12610 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
12620 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
12630 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
12640 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
12650 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
12660 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
12670 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12680 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12690 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
126a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
126b0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
126c0 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65   Return UTF-16 e
126d0 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
126e0 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
126f0 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
12700 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
12710 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
12720 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
12730 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
12740 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
12750 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b  6 outOfMem[] = {
12760 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27  .    'o', 'u', '
12770 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66  t', ' ', 'o', 'f
12780 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27  ', ' ', 'm', 'e'
12790 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c  , 'm', 'o', 'r',
127a0 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73   'y', 0.  };.  s
127b0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
127c0 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20  misuse[] = {.   
127d0 20 27 62 27 2c 20 27 61 27 2c 20 27 64 27 2c 20   'b', 'a', 'd', 
127e0 27 20 27 2c 20 27 70 27 2c 20 27 61 27 2c 20 27  ' ', 'p', 'a', '
127f0 72 27 2c 20 27 61 27 2c 20 27 6d 27 2c 20 27 65  r', 'a', 'm', 'e
12800 27 2c 20 27 74 27 2c 20 27 65 27 2c 20 27 72 27  ', 't', 'e', 'r'
12810 2c 20 27 20 27 2c 0a 20 20 20 20 27 6f 27 2c 20  , ' ',.    'o', 
12820 27 72 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27  'r', ' ', 'o', '
12830 74 27 2c 20 27 68 27 2c 20 27 65 27 2c 20 27 72  t', 'h', 'e', 'r
12840 27 2c 20 27 20 27 2c 20 27 41 27 2c 20 27 50 27  ', ' ', 'A', 'P'
12850 2c 20 27 49 27 2c 20 27 20 27 2c 0a 20 20 20 20  , 'I', ' ',.    
12860 27 6d 27 2c 20 27 69 27 2c 20 27 73 27 2c 20 27  'm', 'i', 's', '
12870 75 27 2c 20 27 73 27 2c 20 27 65 27 2c 20 30 0a  u', 's', 'e', 0.
12880 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
12890 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
128a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
128b0 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
128c0 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
128d0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
128e0 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
128f0 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
12900 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73  )misuse;.  }.  s
12910 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12920 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
12930 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
12940 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
12950 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
12960 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  m;.  }else{.    
12970 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
12980 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
12990 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  r);.    if( z==0
129a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
129b0 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
129c0 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73  , db->errCode, s
129d0 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
129e0 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20  >errCode));.    
129f0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
12a00 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
12a10 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
12a20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61  /* A malloc() ma
12a30 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69  y have failed wi
12a40 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f  thin the call to
12a50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
12a60 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61  ext16().    ** a
12a70 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73  bove. If this is
12a80 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
12a90 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
12aa0 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20  iled flag needs 
12ab0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65  to.    ** be cle
12ac0 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ared before retu
12ad0 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64  rning. Do this d
12ae0 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
12af0 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73   of via.    ** s
12b00 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c  qlite3ApiExit(),
12b10 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e   to avoid settin
12b20 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  g the database h
12b30 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  andle error mess
12b40 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
12b50 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72 28  sqlite3OomClear(
12b60 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
12b70 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
12b80 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
12b90 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
12ba0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
12bb0 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
12bc0 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
12bd0 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ecent error code
12be0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e   generated by an
12bf0 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e   SQLite routine.
12c00 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70   If NULL is.** p
12c10 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
12c20 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d  nction, we assum
12c30 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  e a malloc() fai
12c40 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74  led during sqlit
12c50 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  e3_open()..*/.in
12c60 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  t sqlite3_errcod
12c70 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
12c80 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
12c90 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
12ca0 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
12cb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12cc0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
12cd0 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
12ce0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12cf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12d00 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
12d10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
12d20 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e  ->errCode & db->
12d30 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73  errMask;.}.int s
12d40 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
12d50 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
12d60 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
12d70 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
12d80 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
12d90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
12da0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
12db0 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
12dc0 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
12dd0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
12de0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12df0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
12e00 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b  urn db->errCode;
12e10 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  .}.int sqlite3_s
12e20 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c 69  ystem_errno(sqli
12e30 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
12e40 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53 79 73  rn db ? db->iSys
12e50 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a  Errno : 0;.}  ..
12e60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
12e70 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
12e80 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
12e90 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
12ea0 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
12eb0 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74  ent.  For now, t
12ec0 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73  his simply calls
12ed0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71   the internal sq
12ee0 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a  lite3ErrStr().**
12ef0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f   function..*/.co
12f00 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
12f10 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63 29  3_errstr(int rc)
12f20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
12f30 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a  e3ErrStr(rc);.}.
12f40 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
12f50 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  new collating fu
12f60 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62  nction for datab
12f70 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e  ase "db".  The n
12f80 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20  ame is zName.** 
12f90 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  and the encoding
12fa0 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74   is enc..*/.stat
12fb0 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c  ic int createCol
12fc0 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
12fd0 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3* db,.  const c
12fe0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75  har *zName, .  u
12ff0 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70  8 enc,.  void* p
13000 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
13010 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
13020 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
13030 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
13040 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
13050 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  *).){.  CollSeq 
13060 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e  *pColl;.  int en
13070 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  c2;.  .  assert(
13080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13090 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
130a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  ;..  /* If SQLIT
130b0 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
130c0 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
130d0 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
130e0 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
130f0 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
13100 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
13110 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
13120 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
13130 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
13140 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
13150 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
13160 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65  rnally..  */.  e
13170 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73  nc2 = enc;.  tes
13180 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
13190 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74  ITE_UTF16 );.  t
131a0 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53  estcase( enc2==S
131b0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
131c0 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63  NED );.  if( enc
131d0 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
131e0 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  || enc2==SQLITE_
131f0 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b  UTF16_ALIGNED ){
13200 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49  .    enc2 = SQLI
13210 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
13220 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53    }.  if( enc2<S
13230 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e  QLITE_UTF8 || en
13240 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c2>SQLITE_UTF16B
13250 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
13260 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
13270 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
13280 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c  eck if this call
13290 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20   is removing or 
132a0 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69  replacing an exi
132b0 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  sting collation 
132c0 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20  .  ** sequence. 
132d0 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65  If so, and there
132e0 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
132f0 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66   return busy. If
13300 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20   there.  ** are 
13310 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69  no active VMs, i
13320 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72  nvalidate any pr
13330 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
13340 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43  ments..  */.  pC
13350 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
13360 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
13370 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29  )enc2, zName, 0)
13380 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26  ;.  if( pColl &&
13390 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a   pColl->xCmp ){.
133a0 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62      if( db->nVdb
133b0 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  eActive ){.     
133c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
133d0 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
133e0 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
133f0 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
13400 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f  /modify collatio
13410 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74  n sequence due t
13420 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
13430 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  nts");.      ret
13440 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
13450 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13460 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
13470 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
13480 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
13490 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
134a0 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
134b0 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
134c0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
134d0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
134e0 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
134f0 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
13500 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
13510 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
13520 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
13530 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
13540 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
13550 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
13560 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
13570 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
13580 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
13590 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
135a0 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
135b0 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
135c0 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
135d0 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
135e0 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
135f0 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
13600 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
13610 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
13620 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
13630 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
13640 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
13650 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
13660 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
13670 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
13680 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
13690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
136a0 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
136b0 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
136c0 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
136d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
136e0 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
136f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13700 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
13710 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
13720 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
13730 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
13740 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
13750 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13760 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 43  NOMEM_BKPT;.  pC
13770 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
13780 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70  pare;.  pColl->p
13790 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70  User = pCtx;.  p
137a0 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
137b0 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  l;.  pColl->enc 
137c0 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
137d0 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
137e0 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73  6_ALIGNED));.  s
137f0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
13800 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65  SQLITE_OK);.  re
13810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13820 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  }.../*.** This a
13830 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72  rray defines har
13840 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f  d upper bounds o
13850 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20  n limit values. 
13860 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   The.** initiali
13870 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74  zer must be kept
13880 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68   in sync with th
13890 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a  e SQLITE_LIMIT_*
138a0 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20  .** #defines in 
138b0 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74  sqlite3.h..*/.st
138c0 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61  atic const int a
138d0 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a  HardLimit[] = {.
138e0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e    SQLITE_MAX_LEN
138f0 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
13900 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20  X_SQL_LENGTH,.  
13910 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
13920 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  N,.  SQLITE_MAX_
13930 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51  EXPR_DEPTH,.  SQ
13940 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
13950 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49  D_SELECT,.  SQLI
13960 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a  TE_MAX_VDBE_OP,.
13970 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e    SQLITE_MAX_FUN
13980 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c  CTION_ARG,.  SQL
13990 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
139a0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ,.  SQLITE_MAX_L
139b0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
139c0 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
139d0 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
139e0 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ,      /* IMP: R
139f0 2d 33 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a  -38091-32352 */.
13a00 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49    SQLITE_MAX_TRI
13a10 47 47 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51  GGER_DEPTH,.  SQ
13a20 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
13a30 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a  THREADS,.};../*.
13a40 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
13a50 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65   hard limits are
13a60 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62   set to reasonab
13a70 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66  le values.*/.#if
13a80 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
13a90 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
13aa0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13ab0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13ac0 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
13ad0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
13ae0 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
13af0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
13b00 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  L_LENGTH must be
13b10 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
13b20 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13b30 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53  MAX_SQL_LENGTH>S
13b40 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13b50 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13b60 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
13b70 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74  ust not be great
13b80 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d  er than SQLITE_M
13b90 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66  AX_LENGTH.#endif
13ba0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13bb0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c  COMPOUND_SELECT<
13bc0 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  2.# error SQLITE
13bd0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
13be0 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74 20  LECT must be at 
13bf0 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23  least 2.#endif.#
13c00 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  if SQLITE_MAX_VD
13c10 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72  BE_OP<40.# error
13c20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
13c30 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c  _OP must be at l
13c40 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23  east 40.#endif.#
13c50 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  if SQLITE_MAX_FU
13c60 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20  NCTION_ARG<0 || 
13c70 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
13c80 49 4f 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65 72  ION_ARG>127.# er
13c90 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  ror SQLITE_MAX_F
13ca0 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74  UNCTION_ARG must
13cb0 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
13cc0 64 20 31 32 37 0a 23 65 6e 64 69 66 0a 23 69 66  d 127.#endif.#if
13cd0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
13ce0 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45  CHED<0 || SQLITE
13cf0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32  _MAX_ATTACHED>12
13d00 35 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  5.# error SQLITE
13d10 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75  _MAX_ATTACHED mu
13d20 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
13d30 61 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23  and 125.#endif.#
13d40 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  if SQLITE_MAX_LI
13d50 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
13d60 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
13d70 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
13d80 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  ERN_LENGTH must 
13d90 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
13da0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13db0 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37  MAX_COLUMN>32767
13dc0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13dd0 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20  MAX_COLUMN must 
13de0 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37  not exceed 32767
13df0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13e00 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
13e10 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  EPTH<1.# error S
13e20 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
13e30 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20  R_DEPTH must be 
13e40 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
13e50 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13e60 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c  _WORKER_THREADS<
13e70 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
13e80 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35  WORKER_THREADS>5
13e90 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
13ea0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13eb0 41 44 53 20 6d 75 73 74 20 62 65 20 62 65 74 77  ADS must be betw
13ec0 65 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e  een 0 and 50.#en
13ed0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
13ee0 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
13ef0 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74  a limit.  Report
13f00 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a   the old value..
13f10 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64  ** If an invalid
13f20 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20   limit index is 
13f30 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74  supplied, report
13f40 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20   -1..** Make no 
13f50 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c  changes but stil
13f60 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64  l report the old
13f70 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a   value if the.**
13f80 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65   new limit is ne
13f90 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  gative..**.** A 
13fa0 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  new lower limit 
13fb0 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20  does not shrink 
13fc0 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75  existing constru
13fd0 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c  cts..** It merel
13fe0 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63  y prevents new c
13ff0 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65  onstructs that e
14000 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a  xceed the limit.
14010 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e  ** from forming.
14020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
14030 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  limit(sqlite3 *d
14040 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20  b, int limitId, 
14050 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20  int newLimit){. 
14060 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a   int oldLimit;..
14070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14080 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
14090 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
140a0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
140b0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
140c0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
140d0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
140e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
140f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
14100 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65  0189-54097 For e
14110 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f  ach limit catego
14120 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ry SQLITE_LIMIT_
14130 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20  NAME.  ** there 
14140 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20  is a hard upper 
14150 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d  bound set at com
14160 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43  pile-time by a C
14170 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20   preprocessor.  
14180 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20  ** macro called 
14190 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e  SQLITE_MAX_NAME.
141a0 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20   (The "_LIMIT_" 
141b0 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63  in the name is c
141c0 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22  hanged to.  ** "
141d0 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20  _MAX_".).  */.  
141e0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
141f0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14200 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
14210 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
14220 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
14230 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14240 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  SQL_LENGTH]==SQL
14250 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
14260 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
14270 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
14280 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d  E_LIMIT_COLUMN]=
14290 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  =SQLITE_MAX_COLU
142a0 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  MN );.  assert( 
142b0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
142c0 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
142d0 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
142e0 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  EXPR_DEPTH );.  
142f0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
14300 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14310 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
14320 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  ==SQLITE_MAX_COM
14330 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20  POUND_SELECT);. 
14340 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14350 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14360 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54  _VDBE_OP]==SQLIT
14370 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b  E_MAX_VDBE_OP );
14380 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
14390 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
143a0 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
143b0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  ==SQLITE_MAX_FUN
143c0 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61  CTION_ARG );.  a
143d0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
143e0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41  t[SQLITE_LIMIT_A
143f0 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45  TTACHED]==SQLITE
14400 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b  _MAX_ATTACHED );
14410 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
14420 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
14430 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
14440 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20  LENGTH]==.      
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14480 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
14490 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
144a0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
144b0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
144c0 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53  IABLE_NUMBER]==S
144d0 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
144e0 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73  LE_NUMBER);.  as
144f0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
14500 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  [SQLITE_LIMIT_TR
14510 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51  IGGER_DEPTH]==SQ
14520 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
14530 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
14540 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
14550 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
14560 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c  ER_THREADS]==SQL
14570 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
14580 48 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65  HREADS );.  asse
14590 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  rt( SQLITE_LIMIT
145a0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d  _WORKER_THREADS=
145b0 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  =(SQLITE_N_LIMIT
145c0 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c  -1) );...  if( l
145d0 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
145e0 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
145f0 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
14600 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
14610 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
14620 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
14630 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34     /* IMP: R-524
14660 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20  76-28732 */.    
14670 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61  if( newLimit>aHa
14680 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
14690 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d   ){.      newLim
146a0 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b  it = aHardLimit[
146b0 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d  limitId];  /* IM
146c0 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34  P: R-51463-25634
146d0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   */.    }.    db
146e0 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
146f0 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  ] = newLimit;.  
14700 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69  }.  return oldLi
14710 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
14720 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
14730 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a   R-53341-35419 *
14740 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  /.}../*.** This 
14750 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
14760 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55   to parse both U
14770 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20  RIs and non-URI 
14780 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64  filenames passed
14790 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20   by the.** user 
147a0 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  to API functions
147b0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
147c0 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
147d0 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61  v2(), and for da
147e0 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73  tabase.** URIs s
147f0 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
14800 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65   of ATTACH state
14810 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
14820 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
14830 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
14840 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
14850 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28  the VFS to use (
14860 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20  or.** a NULL to 
14870 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61  signify the defa
14880 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20  ult VFS) if the 
14890 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  URI does not con
148a0 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22  tain a "vfs=xxx"
148b0 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
148c0 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ter. The second 
148d0 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  argument contain
148e0 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f  s the URI (or no
148f0 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a  n-URI filename).
14900 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20  ** itself. When 
14910 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
14920 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c   called the *pFl
14930 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f  ags variable sho
14940 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74  uld contain.** t
14950 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73  he default flags
14960 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
14970 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74  abase handle wit
14980 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f  h. The value sto
14990 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67  red in.** *pFlag
149a0 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64  s may be updated
149b0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
149c0 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c  g if the URI fil
149d0 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a  ename contains .
149e0 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f  ** "cache=xxx" o
149f0 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65  r "mode=xxx" que
14a00 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ry parameters..*
14a10 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
14a20 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
14a30 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
14a40 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69  is case *ppVfs i
14a50 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
14a60 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61  o.** the VFS tha
14a70 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
14a80 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
14a90 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46  abase file. *pzF
14aa0 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  ile is set to.**
14ab0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14ac0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
14ad0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
14ae0 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69  le to open. It i
14af0 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
14b00 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
14b10 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
14b20 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65  ally call sqlite
14b30 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65  3_free() to rele
14b40 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
14b50 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  er..**.** If an 
14b60 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
14b70 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  en an SQLite err
14b80 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14b90 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73  ned and *pzErrMs
14ba0 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20  g.** may be set 
14bb0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
14bc0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
14bd0 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
14be0 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65  age error .** me
14bf0 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
14c00 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14c10 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
14c20 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
14c30 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
14c40 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  er by calling sq
14c50 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
14c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73  .int sqlite3Pars
14c70 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68  eUri(.  const ch
14c80 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c  ar *zDefaultVfs,
14c90 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
14ca0 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73  o use if no "vfs
14cb0 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69  =xxx" query opti
14cc0 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
14cd0 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20  ar *zUri,       
14ce0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
14cf0 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f  erminated URI to
14d00 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69   parse */.  unsi
14d10 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73  gned int *pFlags
14d20 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
14d30 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50  N/OUT: SQLITE_OP
14d40 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EN_XXX flags */.
14d50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a    sqlite3_vfs **
14d60 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  ppVfs,          
14d70 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f    /* OUT: VFS to
14d80 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20   use */ .  char 
14d90 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  **pzFile,       
14da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
14db0 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70  T: Filename comp
14dc0 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a  onent of URI */.
14dd0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
14de0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
14df0 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
14e00 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d  message (if rc!=
14e10 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b  SQLITE_OK) */.){
14e20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14e30 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65  TE_OK;.  unsigne
14e40 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70  d int flags = *p
14e50 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63  Flags;.  const c
14e60 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66  har *zVfs = zDef
14e70 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20  aultVfs;.  char 
14e80 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63  *zFile;.  char c
14e90 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73  ;.  int nUri = s
14ea0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
14eb0 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Uri);..  assert(
14ec0 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b   *pzErrMsg==0 );
14ed0 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20  ..  if( ((flags 
14ee0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
14ef0 49 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  I)             /
14f00 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33  * IMP: R-48725-3
14f10 32 32 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20  2206 */.        
14f20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
14f30 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e  obalConfig.bOpen
14f40 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  Uri) /* IMP: R-5
14f50 31 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20  1689-46548 */.  
14f60 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d   && nUri>=5 && m
14f70 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c  emcmp(zUri, "fil
14f80 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d  e:", 5)==0 /* IM
14f90 50 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36  P: R-57884-37496
14fa0 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61   */.  ){.    cha
14fb0 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74  r *zOpt;.    int
14fc0 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
14fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
14fe0 72 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20  rser state when 
14ff0 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20  parsing URI */. 
15000 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20     int iIn;     
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63   /* Input charac
15030 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ter index */.   
15040 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20   int iOut = 0;  
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15060 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74  * Output charact
15070 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
15080 75 36 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69  u64 nByte = nUri
15090 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +2;           /*
150a0 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
150b0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
150c0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
150d0 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
150e0 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74  _URI flag is set
150f0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20   to indicate to 
15100 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20  the VFS xOpen . 
15110 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61     ** method tha
15120 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
15130 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20  xtra parameters 
15140 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
15150 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20  le-name.  */.   
15160 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
15170 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20  _OPEN_URI;..    
15180 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e  for(iIn=0; iIn<n
15190 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74  Uri; iIn++) nByt
151a0 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d  e += (zUri[iIn]=
151b0 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ='&');.    zFile
151c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
151d0 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  c64(nByte);.    
151e0 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
151f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15200 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49 6e 20  _BKPT;..    iIn 
15210 3d 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 5;.#ifdef SQLI
15220 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54  TE_ALLOW_URI_AUT
15230 48 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20 73  HORITY.    if( s
15240 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22  trncmp(zUri+5, "
15250 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  ///", 3)==0 ){. 
15260 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
15270 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
15280 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63  wing condition c
15290 61 75 73 65 73 20 55 52 49 73 20 77 69 74 68 20  auses URIs with 
152a0 66 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63  five leading / c
152b0 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20  haracters.      
152c0 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f  ** like file:///
152d0 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62  //host/path to b
152e0 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
152f0 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73   UNCs like //hos
15300 74 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a  t/path..      **
15310 20 54 68 65 20 63 6f 72 72 65 63 74 20 55 52 49   The correct URI
15320 20 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61   for that UNC ha
15330 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f  s only two or fo
15340 75 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61  ur leading / cha
15350 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a  racters.      **
15360 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74   file://host/pat
15370 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f  h or file:////ho
15380 73 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20  st/path.  But 5 
15390 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20  leading slashes 
153a0 69 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  is a .      ** c
153b0 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20  ommon error, we 
153c0 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20  are told, so we 
153d0 68 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73  handle it as a s
153e0 70 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a  pecial case. */.
153f0 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
15400 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c  p(zUri+7, "///",
15410 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b   3)==0 ){ iIn++;
15420 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
15430 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c   strncmp(zUri+5,
15440 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c   "//localhost/",
15450 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   12)==0 ){.     
15460 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d   iIn = 16;.    }
15470 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69  .#else.    /* Di
15480 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65  scard the scheme
15490 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73   and authority s
154a0 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55  egments of the U
154b0 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  RI. */.    if( z
154c0 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a  Uri[5]=='/' && z
154d0 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20  Uri[6]=='/' ){. 
154e0 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
154f0 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
15500 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
15510 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='/' ) iIn++;.
15520 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37        if( iIn!=7
15530 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20   && (iIn!=16 || 
15540 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73  memcmp("localhos
15550 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29  t", &zUri[7], 9)
15560 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  ) ){.        *pz
15570 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
15580 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
15590 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a  d uri authority:
155a0 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20   %.*s", .       
155b0 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72       iIn-7, &zUr
155c0 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  i[7]);.        r
155d0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
155e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
155f0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
15600 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
15610 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  if..    /* Copy 
15620 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
15630 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d   any query param
15640 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a  eters into the z
15650 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20  File buffer. .  
15660 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20    ** Decode %HH 
15670 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f  escape codes alo
15680 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20  ng the way. .   
15690 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69   **.    ** Withi
156a0 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72  n this loop, var
156b0 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79  iable eState may
156c0 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20   be set to 0, 1 
156d0 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a  or 2, depending.
156e0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61      ** on the pa
156f0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41  rsing context. A
15700 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
15710 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61  *.    **   0: Pa
15720 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e  rsing file-name.
15730 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72  .    **   1: Par
15740 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f  sing name sectio
15750 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
15760 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
15770 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50  r..    **   2: P
15780 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63  arsing value sec
15790 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
157a0 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
157b0 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eter..    */.   
157c0 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20   eState = 0;.   
157d0 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
157e0 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
157f0 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='#' ){.      iI
15800 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  n++;.      if( c
15810 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26  =='%' .       &&
15820 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
15830 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20  (zUri[iIn]) .   
15840 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
15850 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b  xdigit(zUri[iIn+
15860 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  1]) .      ){.  
15870 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20        int octet 
15880 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49  = (sqlite3HexToI
15890 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20  nt(zUri[iIn++]) 
158a0 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f  << 4);.        o
158b0 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48  ctet += sqlite3H
158c0 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
158d0 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  ++]);..        a
158e0 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20  ssert( octet>=0 
158f0 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a  && octet<256 );.
15900 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65          if( octe
15910 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
15920 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 52  SQLITE_ENABLE_UR
15930 49 5f 30 30 5f 45 52 52 4f 52 0a 20 20 20 20 20  I_00_ERROR.     
15940 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
15950 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
15960 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20  n "%00" appears 
15970 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20  within the URI. 
15980 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  In this.        
15990 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e    ** case we ign
159a0 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20  ore all text in 
159b0 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
159c0 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20   the path, name 
159d0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
159e0 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
159f0 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f  being parsed. So
15a00 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72   ignore the curr
15a10 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20  ent character.  
15a20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73          ** and s
15a30 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  kip to the next 
15a40 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c  "?", "=" or "&",
15a50 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
15a60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
15a70 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
15a80 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
15a90 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
15aa0 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c   && (eState!=0 |
15ab0 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20  | c!='?').      
15ac0 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
15ad0 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27  te!=1 || (c!='='
15ae0 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20   && c!='&')).   
15af0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
15b00 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27  State!=2 || c!='
15b10 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  &').          ){
15b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
15b30 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
15b40 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
15b50 75 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ue;.#else.      
15b60 20 20 20 20 2f 2a 20 49 66 20 45 4e 41 42 4c 45      /* If ENABLE
15b70 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 20 69 73  _URI_00_ERROR is
15b80 20 64 65 66 69 6e 65 64 2c 20 22 25 30 30 22 20   defined, "%00" 
15b90 69 6e 20 61 20 55 52 49 20 69 73 20 61 6e 20 65  in a URI is an e
15ba0 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rror. */.       
15bb0 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
15bc0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
15bd0 75 6e 65 78 70 65 63 74 65 64 20 25 25 30 30 20  unexpected %%00 
15be0 69 6e 20 75 72 69 22 29 3b 0a 20 20 20 20 20 20  in uri");.      
15bf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15c00 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
15c10 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
15c20 6f 75 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  out;.#endif.    
15c30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
15c40 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d  = octet;.      }
15c50 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d  else if( eState=
15c60 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c  =1 && (c=='&' ||
15c70 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20   c=='=') ){.    
15c80 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f      if( zFile[iO
15c90 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1]==0 ){.    
15ca0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74        /* An empt
15cb0 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49  y option name. I
15cc0 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f  gnore this optio
15cd0 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f  n altogether. */
15ce0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
15cf0 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
15d00 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26  Uri[iIn]!='#' &&
15d10 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26   zUri[iIn-1]!='&
15d20 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20  ' ) iIn++;.     
15d30 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15d50 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20   if( c=='&' ){. 
15d60 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69           zFile[i
15d70 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
15d80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15d90 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
15da0 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
15db0 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
15dc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53     }else if( (eS
15dd0 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f  tate==0 && c=='?
15de0 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32  ') || (eState==2
15df0 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20   && c=='&') ){. 
15e00 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
15e10 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31        eState = 1
15e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15e30 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15e40 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
15e50 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69   eState==1 ) zFi
15e60 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
15e70 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  ';.    zFile[iOu
15e80 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
15e90 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
15ea0 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43   '\0';..    /* C
15eb0 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65  heck if there we
15ec0 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73  re any options s
15ed0 70 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68  pecified that sh
15ee0 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65  ould be interpre
15ef0 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65  ted .    ** here
15f00 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61  . Options that a
15f10 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68  re interpreted h
15f20 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73  ere include "vfs
15f30 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74  " and those that
15f40 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f  .    ** correspo
15f50 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74  nd to flags that
15f60 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74   may be passed t
15f70 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70  o the sqlite3_op
15f80 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d  en_v2().    ** m
15f90 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f  ethod. */.    zO
15fa0 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69  pt = &zFile[sqli
15fb0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
15fc0 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65  e)+1];.    while
15fd0 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20  ( zOpt[0] ){.   
15fe0 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71     int nOpt = sq
15ff0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
16000 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  pt);.      char 
16010 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f  *zVal = &zOpt[nO
16020 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74  pt+1];.      int
16030 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53   nVal = sqlite3S
16040 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a  trlen30(zVal);..
16050 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
16060 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73  3 && memcmp("vfs
16070 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29  ", zOpt, 3)==0 )
16080 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d  {.        zVfs =
16090 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c   zVal;.      }el
160a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
160b0 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20  ct OpenMode {.  
160c0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
160d0 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20  ar *z;.         
160e0 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20   int mode;.     
160f0 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b     } *aMode = 0;
16100 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
16110 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20  ModeType = 0;.  
16120 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d        int mask =
16130 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
16140 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20  limit = 0;..    
16150 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20      if( nOpt==5 
16160 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65  && memcmp("cache
16170 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29  ", zOpt, 5)==0 )
16180 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
16190 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f  ic struct OpenMo
161a0 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20  de aCacheMode[] 
161b0 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
161c0 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c  { "shared",  SQL
161d0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
161e0 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  ACHE },.        
161f0 20 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c      { "private",
16200 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
16210 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20  VATECACHE },.   
16220 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
16230 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
16240 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
16250 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
16260 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f  REDCACHE|SQLITE_
16270 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
16280 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  E;.          aMo
16290 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b  de = aCacheMode;
162a0 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74  .          limit
162b0 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20   = mask;.       
162c0 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
162d0 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20  cache";.        
162e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
162f0 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28  pt==4 && memcmp(
16300 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29  "mode", zOpt, 4)
16310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16320 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
16330 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64  penMode aOpenMod
16340 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
16350 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c      { "ro",  SQL
16360 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16370 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Y },.           
16380 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45   { "rw",  SQLITE
16390 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
163a0 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  }, .            
163b0 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f  { "rwc", SQLITE_
163c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
163d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
163e0 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  ATE },.         
163f0 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53     { "memory", S
16400 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
16410 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Y },.           
16420 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
16430 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
16440 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
16450 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20  OPEN_READONLY | 
16460 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16470 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20  WRITE.          
16480 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
16490 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
164a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
164b0 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d  RY;.          aM
164c0 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b  ode = aOpenMode;
164d0 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74  .          limit
164e0 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b   = mask & flags;
164f0 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
16500 54 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b  Type = "access";
16510 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
16520 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b      if( aMode ){
16530 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
16540 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
16550 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  mode = 0;.      
16560 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f      for(i=0; aMo
16570 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20  de[i].z; i++){. 
16580 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
16590 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65   char *z = aMode
165a0 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20  [i].z;.         
165b0 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c     if( nVal==sql
165c0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
165d0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61  && 0==memcmp(zVa
165e0 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20  l, z, nVal) ){. 
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
16600 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64  e = aMode[i].mod
16610 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
16620 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16640 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
16650 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mode==0 ){.     
16660 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
16670 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
16680 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d  tf("no such %s m
16690 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54  ode: %s", zModeT
166a0 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
166b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
166c0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
166d0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
166e0 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
166f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16700 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51   if( (mode & ~SQ
16710 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
16720 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  )>limit ){.     
16730 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
16740 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
16750 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20  tf("%s mode not 
16760 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20  allowed: %s",.  
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c        zModeType,
167a0 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
167b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
167c0 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  PERM;.          
167d0 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
167e0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
167f0 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  }.          flag
16800 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61  s = (flags & ~ma
16810 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20  sk) | mode;.    
16820 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
16830 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61       zOpt = &zVa
16840 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d  l[nVal+1];.    }
16850 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ..  }else{.    z
16860 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
16870 61 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b  alloc64(nUri+2);
16880 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
16890 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
168a0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
168b0 69 66 28 20 6e 55 72 69 20 29 7b 0a 20 20 20 20  if( nUri ){.    
168c0 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20    memcpy(zFile, 
168d0 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
168e0 20 7d 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72   }.    zFile[nUr
168f0 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  i] = '\0';.    z
16900 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27  File[nUri+1] = '
16910 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26  \0';.    flags &
16920 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  = ~SQLITE_OPEN_U
16930 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66  RI;.  }..  *ppVf
16940 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
16950 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66  find(zVfs);.  if
16960 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20  ( *ppVfs==0 ){. 
16970 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
16980 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
16990 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22  no such vfs: %s"
169a0 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20  , zVfs);.    rc 
169b0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
169c0 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f    }. parse_uri_o
169d0 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
169e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
169f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
16a00 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  e);.    zFile = 
16a10 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73  0;.  }.  *pFlags
16a20 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46   = flags;.  *pzF
16a30 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72  ile = zFile;.  r
16a40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
16a50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16a60 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
16a70 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
16a80 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
16a90 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
16aa0 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
16ab0 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
16ac0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
16ad0 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
16ae0 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
16af0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16b00 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
16b10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
16b20 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
16b30 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
16b40 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
16b50 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
16b60 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
16b70 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
16b80 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
16b90 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c  igned int flags,
16ba0 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
16bb0 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
16bc0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
16bd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16be0 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
16bf0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
16c00 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
16c10 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
16c20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65  allocated handle
16c30 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
16c40 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
16c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16c60 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
16c70 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c90 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61  * True for threa
16ca0 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  dsafe connection
16cb0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70  s */.  char *zOp
16cc0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
16cd0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
16ce0 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  me argument to p
16cf0 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  ass to BtreeOpen
16d00 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  () */.  char *zE
16d10 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
16d20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
16d30 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71   message from sq
16d40 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20  lite3ParseUri() 
16d50 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
16d60 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
16d70 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
16d80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16d90 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
16da0 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
16db0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16dc0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
16dd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
16de0 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
16df0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16e00 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
16e10 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16e20 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
16e30 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
16e40 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
16e50 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
16e60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
16e70 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
16e80 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
16e90 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
16ea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
16eb0 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
16ec0 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
16ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
16ee0 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
16ef0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
16f00 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20  FullMutex;.  }. 
16f10 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
16f20 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
16f30 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61  CACHE ){.    fla
16f40 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
16f50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
16f60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
16f70 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16f80 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
16f90 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  ed ){.    flags 
16fa0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  |= SQLITE_OPEN_S
16fb0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
16fc0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72  .  /* Remove har
16fd0 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74  mful bits from t
16fe0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
16ff0 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  er.  **.  ** The
17000 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
17010 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f  UTEX and SQLITE_
17020 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66  OPEN_FULLMUTEX f
17030 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64  lags were.  ** d
17040 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65  ealt with in the
17050 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62   previous code b
17060 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74  lock.  Besides t
17070 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20  hese, the only. 
17080 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20   ** valid input 
17090 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  flags for sqlite
170a0 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20  3_open_v2() are 
170b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
170c0 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ONLY,.  ** SQLIT
170d0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
170e0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
170f0 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45  EATE, SQLITE_OPE
17100 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20  N_SHAREDCACHE,. 
17110 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
17120 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e  PRIVATECACHE, an
17130 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20  d some reserved 
17140 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20  bits.  Silently 
17150 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c  mask.  ** off al
17160 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20  l other flags.. 
17170 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
17180 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
17190 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
171b0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
171c0 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
171d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
171e0 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20  _MAIN_DB |.     
171f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17200 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20  _OPEN_TEMP_DB | 
17210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17220 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
17230 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20  SIENT_DB | .    
17240 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17250 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
17260 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
17270 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17280 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c  N_TEMP_JOURNAL |
17290 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
172a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
172b0 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
172c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
172d0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
172e0 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20  RNAL |.         
172f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17300 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20  N_NOMUTEX |.    
17310 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17320 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
17330 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
17340 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
17350 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29  L.             )
17360 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
17370 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
17380 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
17390 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  db = sqlite3Mall
173a0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73  ocZero( sizeof(s
173b0 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28  qlite3) );.  if(
173c0 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70   db==0 ) goto op
173d0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20  endb_out;.  if( 
173e0 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a  isThreadsafe ){.
173f0 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20      db->mutex = 
17400 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
17410 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52  c(SQLITE_MUTEX_R
17420 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69  ECURSIVE);.    i
17430 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20  f( db->mutex==0 
17440 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17450 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20  _free(db);.     
17460 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67   db = 0;.      g
17470 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
17480 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
17490 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
174a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
174b0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66  ->errMask = 0xff
174c0 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b  ;.  db->nDb = 2;
174d0 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
174e0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
174f0 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62  ;.  db->aDb = db
17500 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20  ->aDbStatic;..  
17510 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
17520 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
17530 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
17540 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
17550 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
17560 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
17570 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c  imit));.  db->aL
17580 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
17590 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
175a0 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ] = SQLITE_DEFAU
175b0 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  LT_WORKER_THREAD
175c0 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  S;.  db->autoCom
175d0 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e  mit = 1;.  db->n
175e0 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b  extAutovac = -1;
175f0 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20  .  db->szMmap = 
17600 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17610 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62  fig.szMmap;.  db
17620 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
17630 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f   0;.  db->nMaxSo
17640 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46  rterMmap = 0x7FF
17650 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61  FFFFF;.  db->fla
17660 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
17670 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c  rtColNames | SQL
17680 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65  ITE_EnableTrigge
17690 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65  r | SQLITE_Cache
176a0 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e  Spill.#if !defin
176b0 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
176c0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
176d0 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46  X) || SQLITE_DEF
176e0 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
176f0 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20 20 20  NDEX.           
17700 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
17710 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a  utoIndex.#endif.
17720 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
17730 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43  LT_CKPTFULLFSYNC
17740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17750 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46    | SQLITE_CkptF
17760 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a  ullFSync.#endif.
17770 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
17780 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34  LT_FILE_FORMAT<4
17790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
177a0 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63    | SQLITE_Legac
177b0 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a  yFileFmt.#endif.
177c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
177d0 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
177e0 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
177f0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f       | SQLITE_Lo
17800 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64  adExtension.#end
17810 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
17820 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f  FAULT_RECURSIVE_
17830 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20  TRIGGERS.       
17840 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17850 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23  TE_RecTriggers.#
17860 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
17870 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  d(SQLITE_DEFAULT
17880 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26  _FOREIGN_KEYS) &
17890 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  & SQLITE_DEFAULT
178a0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20  _FOREIGN_KEYS.  
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
178c0 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b   SQLITE_ForeignK
178d0 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  eys.#endif.#if d
178e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45  efined(SQLITE_RE
178f0 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f  VERSE_UNORDERED_
17900 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20  SELECTS).       
17910 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17920 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a  TE_ReverseOrder.
17930 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
17940 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
17950 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
17960 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20  HECK).          
17970 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
17980 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69  CellSizeCk.#endi
17990 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
179a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
179b0 5f 54 4f 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20  _TOKENIZER).    
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
179d0 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69  QLITE_Fts3Tokeni
179e0 7a 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  zer.#endif.#if d
179f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
17a00 41 42 4c 45 5f 51 50 53 47 29 0a 20 20 20 20 20  ABLE_QPSG).     
17a10 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17a20 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a  LITE_EnableQPSG.
17a30 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
17a40 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
17a50 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
17a60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17a70 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17a80 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
17a90 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
17aa0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
17ab0 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
17ac0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
17ad0 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
17ae0 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
17af0 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
17b00 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
17b10 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
17b20 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
17b30 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
17b40 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
17b50 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
17b60 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
17b70 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
17b80 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ilure..  **.  **
17b90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17ba0 35 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69  52786-44878 SQLi
17bb0 74 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65  te defines three
17bc0 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
17bd0 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  ing.  ** functio
17be0 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74  ns:.  */.  creat
17bf0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73  eCollation(db, s
17c00 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
17c10 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
17c20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
17c30 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
17c40 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53  ion(db, sqlite3S
17c50 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45  trBINARY, SQLITE
17c60 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e  _UTF16BE, 0, bin
17c70 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
17c80 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
17c90 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49  db, sqlite3StrBI
17ca0 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46  NARY, SQLITE_UTF
17cb0 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16LE, 0, binColl
17cc0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
17cd0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
17ce0 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45  "NOCASE", SQLITE
17cf0 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65  _UTF8, 0, nocase
17d00 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30  CollatingFunc, 0
17d10 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
17d20 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
17d30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
17d40 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
17d50 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
17d60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17d70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
17d80 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f  ndb_out;.  }.  /
17d90 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17da0 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54 68 65  -08308-17224 The
17db0 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
17dc0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
17dd0 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73  all.  ** strings
17de0 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a   is BINARY. .  *
17df0 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  /.  db->pDfltCol
17e00 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
17e10 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
17e20 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53  E_UTF8, sqlite3S
17e30 74 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  trBINARY, 0);.  
17e40 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
17e50 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
17e60 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65  * Parse the file
17e70 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e  name/URI argumen
17e80 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79  t.  **.  ** Only
17e90 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20   allow sensible 
17ea0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
17eb0 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67  bits in the flag
17ec0 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20  s argument.  .  
17ed0 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  ** Throw an erro
17ee0 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e  r if any non-sen
17ef0 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69  se combination i
17f00 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20  s used.  If we. 
17f10 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b   ** do not block
17f20 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61   illegal combina
17f30 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63  tions here, it c
17f40 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a  ould trigger.  *
17f50 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  * assert() state
17f60 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20  ments in deeper 
17f70 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c  layers.  Sensibl
17f80 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20  e combinations. 
17f90 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20   ** are:.  **.  
17fa0 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f  **  1:  SQLITE_O
17fb0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a  PEN_READONLY.  *
17fc0 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  2:  SQLITE_OP
17fd0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a  EN_READWRITE.  *
17fe0 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  6:  SQLITE_OP
17ff0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
18000 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
18010 45 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65  E.  */.  db->ope
18020 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  nFlags = flags;.
18030 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
18040 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
18050 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73  == 0x01 );.  ass
18060 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
18070 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78  _READWRITE == 0x
18080 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  02 );.  assert( 
18090 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
180a0 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b  TE    == 0x04 );
180b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
180c0 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
180d0 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59  2 ); /* READONLY
180e0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
180f0 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
18100 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x04 ); /* READW
18110 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61  RITE */.  testca
18120 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
18130 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52  ))==0x40 ); /* R
18140 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
18150 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c  E */.  if( ((1<<
18160 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34  (flags&7)) & 0x4
18170 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  6)==0 ){.    rc 
18180 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  = SQLITE_MISUSE_
18190 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  BKPT;  /* IMP: R
181a0 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a  -65497-44594 */.
181b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
181c0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  = sqlite3ParseUr
181d0 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  i(zVfs, zFilenam
181e0 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e  e, &flags, &db->
181f0 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a  pVfs, &zOpen, &z
18200 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69  ErrMsg);.  }.  i
18210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18220 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
18230 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73  SQLITE_NOMEM ) s
18240 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
18250 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
18260 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
18270 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25  rc, zErrMsg ? "%
18280 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29  s" : 0, zErrMsg)
18290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
182a0 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
182b0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
182c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
182d0 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74   the backend dat
182e0 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a  abase driver */.
182f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
18300 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
18310 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62  , zOpen, db, &db
18320 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
18330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18340 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
18350 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
18360 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
18370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18380 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18390 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
183a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
183b0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
183c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
183d0 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
183e0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
183f0 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
18400 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61  BtreeEnter(db->a
18410 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62  Db[0].pBt);.  db
18420 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61  ->aDb[0].pSchema
18430 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
18440 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  Get(db, db->aDb[
18450 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21  0].pBt);.  if( !
18460 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18470 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48   ) ENC(db) = SCH
18480 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73  EMA_ENC(db);.  s
18490 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
184a0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
184b0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ;.  db->aDb[1].p
184c0 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
184d0 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29  SchemaGet(db, 0)
184e0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  ;..  /* The defa
184f0 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  ult safety_level
18500 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
18510 74 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b 20  tabase is FULL; 
18520 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a  for the temp.  *
18530 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73  * database it is
18540 20 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63 68   OFF. This match
18550 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  es the pager lay
18560 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20  er defaults.  . 
18570 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d   */.  db->aDb[0]
18580 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69  .zDbSName = "mai
18590 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  n";.  db->aDb[0]
185a0 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
185b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
185c0 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20  YNCHRONOUS+1;.  
185d0 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e  db->aDb[1].zDbSN
185e0 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20  ame = "temp";.  
185f0 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74  db->aDb[1].safet
18600 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52 5f  y_level = PAGER_
18610 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b  SYNCHRONOUS_OFF;
18620 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
18630 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
18640 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  N;.  if( db->mal
18650 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
18660 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
18670 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  ;.  }..  /* Regi
18680 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69  ster all built-i
18690 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74  n functions, but
186a0 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
186b0 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a  to read the.  **
186c0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
186d0 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65   yet. This is de
186e0 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20  layed until the 
186f0 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64  first time the d
18700 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20  atabase.  ** is 
18710 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  accessed..  */. 
18720 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
18730 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
18740 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 50  sqlite3RegisterP
18750 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c  erConnectionBuil
18760 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  tinFunctions(db)
18770 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18780 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23  _errcode(db);..#
18790 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
187a0 42 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65  BLE_FTS5.  /* Re
187b0 67 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c 74  gister any built
187c0 2d 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65 20  -in FTS5 module 
187d0 62 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74  before loading t
187e0 68 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a  he automatic.  *
187f0 2a 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68  * extensions. Th
18800 69 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61  is allows automa
18810 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  tic extensions t
18820 6f 20 72 65 67 69 73 74 65 72 20 46 54 53 35 20  o register FTS5 
18830 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73  .  ** tokenizers
18840 20 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20 66   and auxiliary f
18850 75 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20  unctions.  */.  
18860 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18870 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
18880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
18890 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
188a0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
188b0 69 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75  if..  /* Load au
188c0 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f  tomatic extensio
188d0 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20  ns - extensions 
188e0 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72  that have been r
188f0 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75  egistered.  ** u
18900 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
18910 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e  _automatic_exten
18920 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f  sion() API..  */
18930 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
18950 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e  te3AutoLoadExten
18960 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72  sions(db);.    r
18970 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
18980 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ode(db);.    if(
18990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
189a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  {.      goto ope
189b0 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
189c0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
189d0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20  E_ENABLE_FTS1.  
189e0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
189f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74  ailed ){.    ext
18a00 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
18a10 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts1Init(sqlite3*
18a20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18a30 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b  te3Fts1Init(db);
18a40 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18a50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18a60 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62  E_FTS2.  if( !db
18a70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
18a80 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
18a90 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
18aa0 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  t sqlite3Fts2Ini
18ab0 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
18ac0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
18ad0 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  2Init(db);.  }.#
18ae0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
18af0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
18b00 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   /* automaticall
18b10 79 20 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c  y defined by SQL
18b20 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20  ITE_ENABLE_FTS4 
18b30 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  */.  if( !db->ma
18b40 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
18b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18b60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
18b70 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
18b80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
18b90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
18ba0 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
18bb0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
18be0 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
18bf0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
18c00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
18c10 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
18c20 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18c30 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
18c40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
18c50 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
18c60 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
18c70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53  QLITE_ENABLE_DBS
18c80 54 41 54 5f 56 54 41 42 0a 20 20 69 66 28 20 21  TAT_VTAB.  if( !
18c90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18ca0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
18cb0 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
18cc0 69 74 65 33 44 62 73 74 61 74 52 65 67 69 73 74  ite3DbstatRegist
18cd0 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  er(db);.  }.#end
18ce0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18cf0 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20  E_ENABLE_JSON1. 
18d00 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18d10 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18d20 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
18d30 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49   = sqlite3Json1I
18d40 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
18d50 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
18d60 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 56 54  TE_ENABLE_STMTVT
18d70 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  AB.  if( !db->ma
18d80 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
18d90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
18da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
18db0 6d 74 56 74 61 62 49 6e 69 74 28 64 62 29 3b 0a  mtVtabInit(db);.
18dc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
18dd0 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
18de0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31  T_LOCKING_MODE=1
18df0 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45   makes EXCLUSIVE
18e00 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
18e10 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
18e20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
18e30 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30  T_LOCKING_MODE=0
18e40 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65   make NORMAL the
18e50 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
18e60 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69  .  ** mode.  Doi
18e70 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c  ng nothing at al
18e80 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52  l also makes NOR
18e90 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e  MAL the default.
18ea0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
18eb0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
18ec0 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64  ING_MODE.  db->d
18ed0 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51  fltLockMode = SQ
18ee0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
18ef0 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c  KING_MODE;.  sql
18f00 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
18f10 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
18f20 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
18f30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f50 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
18f60 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a  _LOCKING_MODE);.
18f70 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
18f80 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28   ) sqlite3Error(
18f90 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45  db, rc);..  /* E
18fa0 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73  nable the lookas
18fb0 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79  ide-malloc subsy
18fc0 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c  stem */.  setupL
18fd0 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20  ookaside(db, 0, 
18fe0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18ff0 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c  fig.szLookaside,
19000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19010 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19020 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
19030 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c  okaside);..  sql
19040 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
19050 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49  ckpoint(db, SQLI
19060 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41  TE_DEFAULT_WAL_A
19070 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a  UTOCHECKPOINT);.
19080 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69  .opendb_out:.  i
19090 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73  f( db ){.    ass
190a0 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d  ert( db->mutex!=
190b0 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66  0 || isThreadsaf
190c0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
190d0 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
190e0 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
190f0 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
19100 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19110 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
19120 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
19130 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73  rrcode(db);.  as
19140 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72  sert( db!=0 || r
19150 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
19160 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19170 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
19180 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
19190 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a  b);.    db = 0;.
191a0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
191b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
191c0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
191d0 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a  ITE_MAGIC_SICK;.
191e0 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62    }.  *ppDb = db
191f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
19200 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
19210 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
19220 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
19230 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e  ){.    /* Openin
19240 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46  g a db handle. F
19250 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20  ourth parameter 
19260 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a  is passed 0. */.
19270 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d      void *pArg =
19280 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
19290 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b  nfig.pSqllogArg;
192a0 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
192b0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
192c0 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65  (pArg, db, zFile
192d0 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  name, 0);.  }.#e
192e0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
192f0 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
19300 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  C).  if( rc==SQL
19310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
19320 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a  nst char *zKey;.
19330 20 20 20 20 69 66 28 20 28 7a 4b 65 79 20 3d 20      if( (zKey = 
19340 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
19350 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65  meter(zOpen, "he
19360 78 6b 65 79 22 29 29 21 3d 30 20 26 26 20 7a 4b  xkey"))!=0 && zK
19370 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 75  ey[0] ){.      u
19380 38 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69  8 iByte;.      i
19390 6e 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72  nt i;.      char
193a0 20 7a 44 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20   zDecoded[40];. 
193b0 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42       for(i=0, iB
193c0 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  yte=0; i<sizeof(
193d0 7a 44 65 63 6f 64 65 64 29 2a 32 20 26 26 20 73  zDecoded)*2 && s
193e0 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
193f0 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Key[i]); i++){. 
19400 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28         iByte = (
19410 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69  iByte<<4) + sqli
19420 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 4b 65 79  te3HexToInt(zKey
19430 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [i]);.        if
19440 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 44 65  ( (i&1)!=0 ) zDe
19450 63 6f 64 65 64 5b 69 2f 32 5d 20 3d 20 69 42 79  coded[i/2] = iBy
19460 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
19470 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32    sqlite3_key_v2
19480 28 64 62 2c 20 30 2c 20 7a 44 65 63 6f 64 65 64  (db, 0, zDecoded
19490 2c 20 69 2f 32 29 3b 0a 20 20 20 20 7d 65 6c 73  , i/2);.    }els
194a0 65 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71  e if( (zKey = sq
194b0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
194c0 74 65 72 28 7a 4f 70 65 6e 2c 20 22 6b 65 79 22  ter(zOpen, "key"
194d0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))!=0 ){.      s
194e0 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
194f0 2c 20 30 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74  , 0, zKey, sqlit
19500 65 33 53 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29  e3Strlen30(zKey)
19510 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
19520 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
19530 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74  ee(zOpen);.  ret
19540 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d  urn rc & 0xff;.}
19550 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
19560 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
19570 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
19580 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  e3_open(.  const
19590 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
195a0 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
195b0 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e  pDb .){.  return
195c0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
195d0 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20  ilename, ppDb,. 
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
19600 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
19610 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
19620 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
19630 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f  e3_open_v2(.  co
19640 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  nst char *filena
19650 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73  me,   /* Databas
19660 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d  e filename (UTF-
19670 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  8) */.  sqlite3 
19680 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20  **ppDb,         
19690 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64  /* OUT: SQLite d
196a0 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
196b0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
196c0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a        /* Flags *
196d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
196e0 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e  zVfs        /* N
196f0 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c  ame of VFS modul
19700 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  e to use */.){. 
19710 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
19720 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70  base(filename, p
19730 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  pDb, (unsigned i
19740 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  nt)flags, zVfs);
19750 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
19760 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
19770 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
19780 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
19790 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
197a0 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76  pen16(.  const v
197b0 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  oid *zFilename, 
197c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
197d0 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  b.){.  char cons
197e0 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20  t *zFilename8;  
197f0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e   /* zFilename en
19800 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69  coded in UTF-8 i
19810 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36  nstead of UTF-16
19820 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
19830 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
19840 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
19850 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
19860 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d  RMOR.  if( ppDb=
19870 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
19880 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
19890 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
198a0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
198b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
198c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
198d0 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
198e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
198f0 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  rc;.#endif.  if(
19900 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20   zFilename==0 ) 
19910 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30  zFilename = "\00
19920 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d  0\000";.  pVal =
19930 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
19940 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
19950 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
19960 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53  -1, zFilename, S
19970 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
19980 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
19990 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20  );.  zFilename8 
199a0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
199b0 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
199c0 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69  UTF8);.  if( zFi
199d0 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72  lename8 ){.    r
199e0 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65  c = openDatabase
199f0 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44  (zFilename8, ppD
19a00 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
19a10 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
19a20 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
19a30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
19a40 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  ATE, 0);.    ass
19a50 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63  ert( *ppDb || rc
19a60 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
19a70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19a80 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61  LITE_OK && !DbHa
19a90 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c  sProperty(*ppDb,
19aa0 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
19ab0 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43  ded) ){.      SC
19ac0 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20  HEMA_ENC(*ppDb) 
19ad0 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53  = ENC(*ppDb) = S
19ae0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
19af0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
19b00 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19b10 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
19b20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  }.  sqlite3Value
19b30 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
19b40 65 74 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b  eturn rc & 0xff;
19b50 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
19b60 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
19b70 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
19b80 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
19b90 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
19ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
19bb0 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
19bc0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
19bd0 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
19be0 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
19bf0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
19c00 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
19c10 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
19c20 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
19c30 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
19c40 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
19c50 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
19c60 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
19c70 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61  ation_v2(db, zNa
19c80 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  me, enc, pCtx, x
19c90 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a  Compare, 0);.}..
19ca0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
19cb0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
19cc0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
19cd0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19ce0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
19cf0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
19d00 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
19d10 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
19d20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
19d30 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
19d40 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
19d50 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
19d60 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
19d70 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
19d80 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
19d90 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
19da0 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  rc;..#ifdef SQLI
19db0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
19dc0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
19dd0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
19de0 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
19df0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19e00 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
19e10 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
19e20 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
19e30 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
19e40 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
19e50 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
19e60 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
19e70 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20  zName, (u8)enc, 
19e80 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
19e90 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71  xDel);.  rc = sq
19ea0 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
19eb0 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
19ec0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
19ed0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
19ee0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
19f00 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  6./*.** Register
19f10 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
19f20 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
19f30 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
19f40 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
19f50 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
19f60 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  lation16(.  sqli
19f70 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
19f80 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20  t void *zName,. 
19f90 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
19fa0 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
19fb0 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
19fc0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
19fd0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
19fe0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
19ff0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
1a000 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65   *zName8;..#ifde
1a010 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a020 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1a030 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1a040 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
1a050 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  me==0 ) return S
1a060 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1a070 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1a080 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1a090 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
1a0a0 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
1a0b0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61  cFailed );.  zNa
1a0c0 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  me8 = sqlite3Utf
1a0d0 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c  16to8(db, zName,
1a0e0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31   -1, SQLITE_UTF1
1a0f0 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20  6NATIVE);.  if( 
1a100 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63  zName8 ){.    rc
1a110 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
1a120 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28  on(db, zName8, (
1a130 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
1a140 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20  ompare, 0);.    
1a150 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1a160 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20  , zName8);.  }. 
1a170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1a180 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1a190 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a1a0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1a1b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1a1c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a1d0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
1a1e0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1a1f0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a200 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
1a210 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
1a220 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
1a230 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
1a240 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
1a250 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
1a260 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
1a270 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a280 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
1a290 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1a2a0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
1a2b0 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
1a2c0 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28  d(*xCollNeeded)(
1a2d0 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
1a2e0 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
1a2f0 74 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64  t char*).){.#ifd
1a300 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1a310 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1a320 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1a330 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
1a340 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1a350 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1a360 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a370 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1a380 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
1a390 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  ed = xCollNeeded
1a3a0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
1a3b0 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d  ded16 = 0;.  db-
1a3c0 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
1a3d0 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
1a3e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1a3f0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1a400 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
1a410 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1a420 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1a430 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
1a440 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
1a450 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
1a460 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
1a470 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
1a480 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
1a490 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
1a4a0 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
1a4b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
1a4c0 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
1a4d0 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
1a4e0 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69  needed16(.  sqli
1a4f0 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
1a500 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
1a510 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
1a520 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c  Needed16)(void*,
1a530 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
1a540 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64  xtRep,const void
1a550 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *).){.#ifdef SQL
1a560 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1a570 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1a580 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1a590 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1a5a0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1a5b0 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1a5c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1a5d0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
1a5e0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30  >xCollNeeded = 0
1a5f0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
1a600 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65  ded16 = xCollNee
1a610 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f  ded16;.  db->pCo
1a620 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
1a630 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
1a640 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1a650 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1a660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a670 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1a680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1a690 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
1a6a0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
1a6b0 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
1a6c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
1a6d0 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20  an anachronism. 
1a6e0 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73  It used to be us
1a6f0 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ed to recover fr
1a700 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  om a.** malloc()
1a710 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51   failure, but SQ
1a720 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68  Lite now does th
1a730 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1a740 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a750 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
1a760 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1a770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1a780 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  dif../*.** Test 
1a790 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
1a7a0 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  r not the databa
1a7b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
1a7c0 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a   in autocommit.*
1a7d0 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  * mode.  Return 
1a7e0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e  TRUE if it is an
1a7f0 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20  d FALSE if not. 
1a800 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   Autocommit mode
1a810 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66   is on.** by def
1a820 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69  ault.  Autocommi
1a830 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79  t is disabled by
1a840 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
1a850 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64  nt and reenabled
1a860 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20  .** by the next 
1a870 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
1a880 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
1a890 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
1a8a0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
1a8b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a8c0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1a8d0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1a8e0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1a8f0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
1a900 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1a910 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a920 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1a930 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  n db->autoCommit
1a940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
1a950 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1a960 73 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65  s are substitute
1a970 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  s for constants 
1a980 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a  SQLITE_CORRUPT,.
1a990 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ** SQLITE_MISUSE
1a9a0 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
1a9b0 4e 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  N, SQLITE_NOMEM 
1a9c0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68  and possibly oth
1a9d0 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73  er error.** cons
1a9e0 74 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72  tants.  They ser
1a9f0 76 65 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a  ve two purposes:
1aa00 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72  .**.**   1.  Ser
1aa10 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65  ve as a convenie
1aa20 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20  nt place to set 
1aa30 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20  a breakpoint in 
1aa40 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20  a debugger.**   
1aa50 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68      to detect wh
1aa60 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72  en version error
1aa70 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75   conditions occu
1aa80 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20  rs..**.**   2.  
1aa90 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c  Invoke sqlite3_l
1aaa0 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20  og() to provide 
1aab0 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20  the source code 
1aac0 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a  location where.*
1aad0 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65  *       a low-le
1aae0 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72  vel error is fir
1aaf0 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a  st detected..*/.
1ab00 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 6f 72  static int repor
1ab10 74 45 72 72 6f 72 28 69 6e 74 20 69 45 72 72 2c  tError(int iErr,
1ab20 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e   int lineno, con
1ab30 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b  st char *zType){
1ab40 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69  .  sqlite3_log(i
1ab50 45 72 72 2c 20 22 25 73 20 61 74 20 6c 69 6e 65  Err, "%s at line
1ab60 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
1ab70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
1ab80 54 79 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30  Type, lineno, 20
1ab90 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
1aba0 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  d());.  return i
1abb0 45 72 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  Err;.}.int sqlit
1abc0 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
1abd0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1abe0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1abf0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1ac00 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1ac10 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1ac20 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65  TE_CORRUPT, line
1ac30 6e 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f  no, "database co
1ac40 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e  rruption");.}.in
1ac50 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
1ac60 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1ac70 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1ac80 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ac90 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1aca0 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f  eturn reportErro
1acb0 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  r(SQLITE_MISUSE,
1acc0 20 6c 69 6e 65 6e 6f 2c 20 22 6d 69 73 75 73 65   lineno, "misuse
1acd0 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ");.}.int sqlite
1ace0 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69  3CantopenError(i
1acf0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1ad00 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1ad10 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1ad20 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1ad30 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1ad40 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e  TE_CANTOPEN, lin
1ad50 65 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  eno, "cannot ope
1ad60 6e 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64  n file");.}.#ifd
1ad70 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ad80 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
1ad90 70 74 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20  ptPgnoError(int 
1ada0 6c 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e  lineno, Pgno pgn
1adb0 6f 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  o){.  char zMsg[
1adc0 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  100];.  sqlite3_
1add0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1ade0 7a 4d 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61  zMsg), zMsg, "da
1adf0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1ae00 6e 20 70 61 67 65 20 25 64 22 2c 20 70 67 6e 6f  n page %d", pgno
1ae10 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
1ae20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ae30 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1ae40 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72  return reportErr
1ae50 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  or(SQLITE_CORRUP
1ae60 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 4d 73 67 29  T, lineno, zMsg)
1ae70 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e  ;.}.int sqlite3N
1ae80 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69  omemError(int li
1ae90 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1aea0 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1aeb0 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1aec0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72  ;.  return repor
1aed0 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f  tError(SQLITE_NO
1aee0 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f  MEM, lineno, "OO
1aef0 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  M");.}.int sqlit
1af00 65 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f  e3IoerrnomemErro
1af10 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
1af20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1af30 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1af40 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Log!=0 );.  retu
1af50 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28 53  rn reportError(S
1af60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1af70 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f 4f 20  M, lineno, "I/O 
1af80 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a 7d 0a 23  OOM error");.}.#
1af90 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
1afa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
1afb0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
1afc0 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
1afd0 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
1afe0 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
1aff0 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
1b000 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
1b010 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
1b020 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
1b030 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
1b040 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
1b050 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
1b060 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
1b070 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
1b080 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
1b090 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
1b0a0 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
1b0b0 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
1b0c0 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
1b0d0 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69  p(void){.}.#endi
1b0e0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
1b0f0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
1b100 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69   about a specifi
1b110 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61  c column of a da
1b120 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
1b130 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20   See comment in 
1b140 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74  sqlite3.h (sqlit
1b150 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61  e.h.in) for deta
1b160 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
1b170 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
1b180 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c  _metadata(.  sql
1b190 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1b1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
1b1b0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f  ection handle */
1b1c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b1d0 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  DbName,        /
1b1e0 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
1b1f0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
1b200 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e  st char *zTableN
1b210 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  ame,     /* Tabl
1b220 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73  e name */.  cons
1b230 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e  t char *zColumnN
1b240 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  ame,    /* Colum
1b250 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72  n name */.  char
1b260 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54   const **pzDataT
1b270 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55  ype,    /* OUTPU
1b280 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61  T: Declared data
1b290 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
1b2a0 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65  const **pzCollSe
1b2b0 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  q,     /* OUTPUT
1b2c0 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  : Collation sequ
1b2d0 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  ence name */.  i
1b2e0 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20  nt *pNotNull,   
1b2f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1b300 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f  TPUT: True if NO
1b310 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
1b320 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e  t exists */.  in
1b330 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20  t *pPrimaryKey, 
1b340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1b350 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
1b360 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a  umn part of PK *
1b370 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e  /.  int *pAutoin
1b380 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
1b390 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1b3a0 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74  if column is aut
1b3b0 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29  o-increment */.)
1b3c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
1b3d0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
1b3e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
1b3f0 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   0;.  Column *pC
1b400 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  ol = 0;.  int iC
1b410 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ol = 0;.  char c
1b420 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20  onst *zDataType 
1b430 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
1b440 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b  t *zCollSeq = 0;
1b450 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d  .  int notnull =
1b460 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72   0;.  int primar
1b470 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ykey = 0;.  int 
1b480 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23  autoinc = 0;...#
1b490 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1b4a0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1b4b0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1b4c0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
1b4d0 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29   zTableName==0 )
1b4e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b4f0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1b500 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1b510 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74  * Ensure the dat
1b520 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
1b530 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a   been loaded */.
1b540 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b550 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1b560 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b570 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
1b580 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
1b590 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  (db, &zErrMsg);.
1b5a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1b5b0 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =rc ){.    goto 
1b5c0 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
1b5d0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
1b5e0 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
1b5f0 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71  n */.  pTab = sq
1b600 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
1b610 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  b, zTableName, z
1b620 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  DbName);.  if( !
1b630 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53  pTab || pTab->pS
1b640 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61  elect ){.    pTa
1b650 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  b = 0;.    goto 
1b660 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
1b670 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f    /* Find the co
1b680 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69  lumn for which i
1b690 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64  nfo is requested
1b6a0 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d   */.  if( zColum
1b6b0 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nName==0 ){.    
1b6c0 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 65 78 69  /* Query for exi
1b6d0 73 74 61 6e 63 65 20 6f 66 20 74 61 62 6c 65 20  stance of table 
1b6e0 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  only */.  }else{
1b6f0 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
1b700 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
1b710 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
1b720 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
1b730 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
1b740 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
1b750 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
1b760 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  me, zColumnName)
1b770 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1b780 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1b790 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70  .    if( iCol==p
1b7a0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
1b7b0 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
1b7c0 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
1b7d0 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e  IsRowid(zColumnN
1b7e0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
1b7f0 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
1b800 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  ey;.        pCol
1b810 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54   = iCol>=0 ? &pT
1b820 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a  ab->aCol[iCol] :
1b830 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
1b840 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
1b850 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
1b860 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20  error_out;.     
1b870 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1b880 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1b890 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68   block stores th
1b8a0 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  e meta informati
1b8b0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  on that will be 
1b8c0 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f  returned.  ** to
1b8d0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c   the caller in l
1b8e0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a  ocal variables z
1b8f0 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53  DataType, zCollS
1b900 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69  eq, notnull, pri
1b910 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64  marykey.  ** and
1b920 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69   autoinc. At thi
1b930 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72  s point there ar
1b940 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74  e two possibilit
1b950 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ies:.  ** .  ** 
1b960 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69      1. The speci
1b970 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fied column name
1b980 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69   was rowid", "oi
1b990 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20  d" or "_rowid_" 
1b9a0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  .  **        and
1b9b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70   there is no exp
1b9c0 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
1b9d0 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20   IPK column. .  
1b9e0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54  **.  **     2. T
1b9f0 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  he table is not 
1ba00 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63  a view and the c
1ba10 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74  olumn name ident
1ba20 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20  ified an .  **  
1ba30 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79        explicitly
1ba40 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
1ba50 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f  . Copy meta info
1ba60 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43  rmation from *pC
1ba70 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ol..  */ .  if( 
1ba80 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74  pCol ){.    zDat
1ba90 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  aType = sqlite3C
1baa0 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 30  olumnType(pCol,0
1bab0 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  );.    zCollSeq 
1bac0 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
1bad0 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f     notnull = pCo
1bae0 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20  l->notNull!=0;. 
1baf0 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d     primarykey  =
1bb00 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
1bb10 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
1bb20 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f  EY)!=0;.    auto
1bb30 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  inc = pTab->iPKe
1bb40 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62  y==iCol && (pTab
1bb50 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1bb60 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
1bb70 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1bb80 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54  zDataType = "INT
1bb90 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61  EGER";.    prima
1bba0 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20  rykey = 1;.  }. 
1bbb0 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29   if( !zCollSeq )
1bbc0 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  {.    zCollSeq =
1bbd0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1bbe0 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  Y;.  }..error_ou
1bbf0 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t:.  sqlite3Btre
1bc00 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
1bc10 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
1bc20 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
1bc30 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
1bc40 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
1bc50 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
1bc60 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
1bc70 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
1bc80 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
1bc90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
1bca0 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
1bcb0 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
1bcc0 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
1bcd0 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1bce0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
1bcf0 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
1bd00 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
1bd10 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
1bd20 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
1bd30 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
1bd40 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
1bd50 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
1bd60 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
1bd70 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
1bd80 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
1bd90 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
1bda0 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
1bdb0 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
1bdc0 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
1bdd0 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
1bde0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1bdf0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
1be00 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
1be10 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
1be20 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
1be30 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
1be40 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
1be50 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
1be60 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1be70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1be80 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
1be90 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73  rc, (zErrMsg?"%s
1bea0 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  ":0), zErrMsg);.
1beb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1bec0 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1bed0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
1bee0 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
1bef0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1bf00 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1bf10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1bf20 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
1bf30 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
1bf40 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
1bf50 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
1bf60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1bf70 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
1bf80 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1bf90 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
1bfa0 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
1bfb0 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
1bfc0 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
1bfd0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
1bfe0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
1bff0 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
1c000 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
1c010 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
1c020 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
1c030 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
1c040 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
1c050 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
1c060 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
1c070 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
1c080 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c090 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
1c0a0 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
1c0b0 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
1c0c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c0d0 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
1c0e0 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
1c0f0 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
1c100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1c110 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1c120 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1c130 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1c140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1c150 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1c160 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1c170 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1c180 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
1c190 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66  sk = onoff ? 0xf
1c1a0 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a  fffffff : 0xff;.
1c1b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c1c0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1c1d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c1e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1c1f0 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43  nvoke the xFileC
1c200 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e  ontrol method on
1c210 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1c220 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
1c230 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1c240 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  rol(sqlite3 *db,
1c250 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1c260 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  Name, int op, vo
1c270 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
1c280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1c290 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  OR;.  Btree *pBt
1c2a0 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ree;..#ifdef SQL
1c2b0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1c2c0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1c2d0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1c2e0 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1c2f0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1c300 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1c310 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1c320 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
1c330 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  ree = sqlite3DbN
1c340 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1c350 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  DbName);.  if( p
1c360 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
1c370 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
1c380 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1c390 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1c3a0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1c3b0 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
1c3c0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1c3d0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
1c3e0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1c3f0 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74  ;.    fd = sqlit
1c400 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
1c410 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1c420 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   fd!=0 );.    if
1c430 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
1c440 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  TL_FILE_POINTER 
1c450 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1c460 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
1c470 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   fd;.      rc = 
1c480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c490 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1c4a0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f  ITE_FCNTL_VFS_PO
1c4b0 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1c4c0 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70  (sqlite3_vfs**)p
1c4d0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Arg = sqlite3Pag
1c4e0 65 72 56 66 73 28 70 50 61 67 65 72 29 3b 0a 20  erVfs(pPager);. 
1c4f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c500 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1c510 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1c520 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e  NTL_JOURNAL_POIN
1c530 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1c540 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1c550 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rg = sqlite3Page
1c560 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67 65 72  rJrnlFile(pPager
1c570 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1c580 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1c590 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  se if( fd->pMeth
1c5a0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ods ){.      rc 
1c5b0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
1c5c0 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70  ontrol(fd, op, p
1c5d0 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Arg);.    }else{
1c5e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c5f0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20  TE_NOTFOUND;.   
1c600 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1c610 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1c620 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1c630 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1c640 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1c650 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
1c660 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
1c670 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
1c680 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
1c690 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
1c6a0 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
1c6b0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1c6c0 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20  ITE_UNTESTABLE. 
1c6d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1c6e0 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76  R(op);.#else.  v
1c6f0 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f  a_list ap;.  va_
1c700 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
1c710 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a   switch( op ){..
1c720 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61      /*.    ** Sa
1c730 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ve the current s
1c740 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
1c750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1c760 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1c770 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20  L_PRNG_SAVE: {. 
1c780 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
1c790 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20  SaveState();.   
1c7a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c7b0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
1c7c0 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65  estore the state
1c7d0 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20   of the PRNG to 
1c7e0 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73  the last state s
1c7f0 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  aved using.    *
1c800 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66  * PRNG_SAVE.  If
1c810 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e   PRNG_SAVE has n
1c820 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1c830 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20   called, then.  
1c840 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61    ** this verb a
1c850 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45  cts like PRNG_RE
1c860 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  SET..    */.    
1c870 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1c880 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
1c890 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1c8a0 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61  e3PrngRestoreSta
1c8b0 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
1c8c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c8d0 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68  .    ** Reset th
1c8e0 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69  e PRNG back to i
1c8f0 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ts uninitialized
1c900 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78   state.  The nex
1c910 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
1c920 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
1c930 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65  ess() will resee
1c940 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67  d the PRNG using
1c950 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20   a single call. 
1c960 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61     ** to the xRa
1c970 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20  ndomness method 
1c980 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  of the default V
1c990 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  FS..    */.    c
1c9a0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c9b0 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20  TRL_PRNG_RESET: 
1c9c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1c9d0 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b  randomness(0,0);
1c9e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c9f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1ca00 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1ca10 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f  _control(BITVEC_
1ca20 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67  TEST, size, prog
1ca30 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ram).    **.    
1ca40 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67  ** Run a test ag
1ca50 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f  ainst a Bitvec o
1ca60 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20  bject of size.  
1ca70 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75  The program argu
1ca80 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61  ment.    ** is a
1ca90 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  n array of integ
1caa0 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73  ers that defines
1cab0 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75   the test.  Retu
1cac0 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a  rn -1 on a.    *
1cad0 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
1cae0 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20  ion error, 0 on 
1caf0 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d  success, or non-
1cb00 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f  zero for an erro
1cb10 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68  r..    ** See th
1cb20 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  e sqlite3BitvecB
1cb30 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72  uiltinTest() for
1cb40 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1cb50 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
1cb60 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1cb70 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f  TESTCTRL_BITVEC_
1cb80 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEST: {.      in
1cb90 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
1cba0 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
1cbb0 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72  t *aProg = va_ar
1cbc0 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
1cbd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1cbe0 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
1cbf0 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20  (sz, aProg);.   
1cc00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cc10 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1cc20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1cc30 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41  trol(FAULT_INSTA
1cc40 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20  LL, xCallback). 
1cc50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72     **.    ** Arr
1cc60 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  ange to invoke x
1cc70 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65  Callback() whene
1cc80 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74  ver sqlite3Fault
1cc90 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  Sim() is called,
1cca0 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c  .    ** if xCall
1ccb0 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  back is not NULL
1ccc0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1ccd0 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68 65  As a test of the
1cce0 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72   fault simulator
1ccf0 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c   mechanism itsel
1cd00 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  f, sqlite3FaultS
1cd10 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20  im(0).    ** is 
1cd20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65  called immediate
1cd30 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c  ly after install
1cd40 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c  ing the new call
1cd50 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74  back and the ret
1cd60 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  urn.    ** value
1cd70 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75   from sqlite3Fau
1cd80 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73  ltSim(0) becomes
1cd90 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
1cda0 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
1cdb0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a  test_control()..
1cdc0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1cdd0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cde0 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b  FAULT_INSTALL: {
1cdf0 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69  .      /* MSVC i
1ce00 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75  s picky about pu
1ce10 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20  lling func ptrs 
1ce20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20  from va lists.. 
1ce30 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73       ** http://s
1ce40 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74  upport.microsoft
1ce50 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20  .com/kb/47961.  
1ce60 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c      ** sqlite3Gl
1ce70 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74  obalConfig.xTest
1ce80 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72  Callback = va_ar
1ce90 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74  g(ap, int(*)(int
1cea0 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
1ceb0 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a     typedef int(*
1cec0 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1ced0 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20  _t)(int);.      
1cee0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cef0 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63  fig.xTestCallbac
1cf00 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54  k = va_arg(ap, T
1cf10 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f  ESTCALLBACKFUNC_
1cf20 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
1cf30 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1cf40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1cf50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1cf60 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1cf70 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47  st_control(BENIG
1cf80 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20  N_MALLOC_HOOKS, 
1cf90 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20  xBegin, xEnd).  
1cfa0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69    **.    ** Regi
1cfb0 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61  ster hooks to ca
1cfc0 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ll to indicate w
1cfd0 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61  hich malloc() fa
1cfe0 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61  ilures .    ** a
1cff0 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a  re benign..    *
1d000 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1d010 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47  E_TESTCTRL_BENIG
1d020 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20  N_MALLOC_HOOKS: 
1d030 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  {.      typedef 
1d040 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63  void (*void_func
1d050 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20  tion)(void);.   
1d060 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
1d070 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20   xBenignBegin;. 
1d080 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
1d090 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20  on xBenignEnd;. 
1d0a0 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69       xBenignBegi
1d0b0 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  n = va_arg(ap, v
1d0c0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
1d0d0 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20       xBenignEnd 
1d0e0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
1d0f0 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
1d100 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e     sqlite3Benign
1d110 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e  MallocHooks(xBen
1d120 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67  ignBegin, xBenig
1d130 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65  nEnd);.      bre
1d140 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d150 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1d160 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1d170 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1d180 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73  ENDING_BYTE, uns
1d190 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20  igned int X).   
1d1a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1d1b0 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
1d1c0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  to the value in 
1d1d0 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66  the argument, if
1d1e0 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b   X>0..    ** Mak
1d1f0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
1d200 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68  X==0.  Return th
1d210 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70  e value of the p
1d220 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20  ending byte.    
1d230 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e  ** as it existin
1d240 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  g before this ro
1d250 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1d260 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d270 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e  IMPORTANT:  Chan
1d280 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1d290 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30   byte from 0x400
1d2a0 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e  00000 results in
1d2b0 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d  .    ** an incom
1d2c0 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65  patible database
1d2d0 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43   file format.  C
1d2e0 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
1d2f0 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ING byte.    ** 
1d300 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61  while any databa
1d310 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
1d320 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e   open results in
1d330 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20   undefined and. 
1d340 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75     ** deleteriou
1d350 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20  s behavior..    
1d360 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d370 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1d380 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20  ING_BYTE: {.    
1d390 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42    rc = PENDING_B
1d3a0 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  YTE;.#ifndef SQL
1d3b0 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20  ITE_OMIT_WSD.   
1d3c0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73     {.        uns
1d3d0 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c  igned int newVal
1d3e0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
1d3f0 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
1d400 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20       if( newVal 
1d410 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67  ) sqlite3Pending
1d420 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20  Byte = newVal;. 
1d430 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1d440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d450 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1d460 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1d470 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1d480 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e  TCTRL_ASSERT, in
1d490 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1d4a0 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
1d4b0 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
1d4c0 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77  me test to see w
1d4d0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20  hether or not.  
1d4e0 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61    ** assert() wa
1d4f0 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
1d500 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58  pile-time.  If X
1d510 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73   is true and ass
1d520 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  ert().    ** is 
1d530 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
1d540 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1d550 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73  s true.  If X is
1d560 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a   true and.    **
1d570 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1d580 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
1d590 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1d5a0 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20  zero.  If X is. 
1d5b0 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20     ** false and 
1d5c0 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
1d5d0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73  led, then the as
1d5e0 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e  sertion fires an
1d5f0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  d the.    ** pro
1d600 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66  cess aborts.  If
1d610 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20   X is false and 
1d620 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
1d630 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20  bled, then the. 
1d640 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c     ** return val
1d650 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20  ue is zero..    
1d660 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d670 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1d680 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61  RT: {.      vola
1d690 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a  tile int x = 0;.
1d6a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2f 2a        assert( /*
1d6b0 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b 2a  side-effects-ok*
1d6c0 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70  / (x = va_arg(ap
1d6d0 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20  ,int))!=0 );.   
1d6e0 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20     rc = x;.     
1d6f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
1d700 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1d710 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d720 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d730 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20  TRL_ALWAYS, int 
1d740 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1d750 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
1d760 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
1d770 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77   test to see how
1d780 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a   the ALWAYS and.
1d790 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63      ** NEVER mac
1d7a0 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ros were defined
1d7b0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1d7c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d7d0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1d7e0 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20   is ALWAYS(X).  
1d7f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d800 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74  he recommended t
1d810 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66  est is X==2.  If
1d820 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1d830 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61  e is 2, that mea
1d840 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53  ns.    ** ALWAYS
1d850 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
1d860 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61  re both no-op pa
1d870 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
1d880 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  s, which is the.
1d890 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73      ** default s
1d8a0 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  etting.  If the 
1d8b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1d8c0 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29  1, then ALWAYS()
1d8d0 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a   is either.    *
1d8e0 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20  * hard-coded to 
1d8f0 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20  true or else it 
1d900 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61  asserts if its a
1d910 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
1d920 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
1d930 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72  st behavior (har
1d940 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29  d-coded to true)
1d950 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
1d960 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
1d970 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
1d980 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
1d990 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e  ) is disabled an
1d9a0 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20  d the second.   
1d9b0 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73   ** behavior (as
1d9c0 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75  sert if the argu
1d9d0 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29  ment to ALWAYS()
1d9e0 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68   is false) is th
1d9f0 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
1da00 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1da10 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
1da20 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65  at assert() is e
1da30 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nabled..    **. 
1da40 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69     ** The run-ti
1da50 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  me test procedur
1da60 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d  e might look som
1da70 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73  ething like this
1da80 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
1da90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
1daa0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1dab0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
1dac0 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20  YS, 2)==2 ){.   
1dad0 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
1dae0 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
1daf0 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d   are no-op pass-
1db00 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20  through macros. 
1db10 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69     **    }else i
1db20 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
1db30 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1db40 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
1db50 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  1) ){.    **    
1db60 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61    // ALWAYS(x) a
1db70 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73  sserts that x is
1db80 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20   true. NEVER(x) 
1db90 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c  asserts x is fal
1dba0 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  se..    **    }e
1dbb0 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  lse{.    **     
1dbc0 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73   // ALWAYS(x) is
1dbd0 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20   a constant 1.  
1dbe0 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f  NEVER(x) is a co
1dbf0 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a  nstant 0..    **
1dc00 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20      }.    */.   
1dc10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1dc20 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a  TCTRL_ALWAYS: {.
1dc30 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
1dc40 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
1dc50 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28      rc = ALWAYS(
1dc60 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
1dc70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1dc80 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f     **   sqlite3_
1dc90 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1dca0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54  ITE_TESTCTRL_BYT
1dcb0 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a  EORDER);.    **.
1dcc0 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67      ** The integ
1dcd0 65 72 20 72 65 74 75 72 6e 65 64 20 72 65 76 65  er returned reve
1dce0 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64  als the byte-ord
1dcf0 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74  er of the comput
1dd00 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  er on which.    
1dd10 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e  ** SQLite is run
1dd20 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ning:.    **.   
1dd30 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20 20   **       1     
1dd40 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64  big-endian,    d
1dd50 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e  etermined at run
1dd60 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20  -time.    **    
1dd70 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d    10     little-
1dd80 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e  endian, determin
1dd90 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1dda0 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20     **  432101   
1ddb0 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20    big-endian,   
1ddc0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63   determined at c
1ddd0 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20  ompile-time.    
1dde0 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20 20 6c  **  123410     l
1ddf0 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65  ittle-endian, de
1de00 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70  termined at comp
1de10 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20  ile-time.    */ 
1de20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1de30 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
1de40 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  DER: {.      rc 
1de50 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44  = SQLITE_BYTEORD
1de60 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f  ER*100 + SQLITE_
1de70 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20  LITTLEENDIAN*10 
1de80 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49  + SQLITE_BIGENDI
1de90 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  AN;.      break;
1dea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1deb0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1dec0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1ded0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73  TCTRL_RESERVE, s
1dee0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1def0 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
1df00 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76   Set the nReserv
1df10 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20  e size to N for 
1df20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1df30 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
1df40 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  e.    ** connect
1df50 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20  ion db..    */. 
1df60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1df70 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a  ESTCTRL_RESERVE:
1df80 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1df90 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1dfa0 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1dfb0 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
1dfc0 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1dfd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1dfe0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1dff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1e000 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64  reeSetPageSize(d
1e010 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
1e020 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , x, 0);.      s
1e030 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1e040 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1e050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e060 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
1e070 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e080 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e090 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73  OPTIMIZATIONS, s
1e0a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1e0b0 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
1e0c0 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
1e0d0 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  le various optim
1e0e0 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73  izations for tes
1e0f0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
1e100 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75  The .    ** argu
1e110 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d  ment N is a bitm
1e120 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74  ask of optimizat
1e130 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62  ions to be disab
1e140 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c  led.  For normal
1e150 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
1e160 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e  n N should be 0.
1e170 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68    The idea is th
1e180 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61  at a test progra
1e190 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20  m (like the.    
1e1a0 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73  ** SQL Logic Tes
1e1b0 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f  t or SLT test mo
1e1c0 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68  dule) can run th
1e1d0 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69  e same SQL multi
1e1e0 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a  ple times.    **
1e1f0 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70   with various op
1e200 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61  timizations disa
1e210 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  bled to verify t
1e220 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73  hat the same ans
1e230 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62  wer.    ** is ob
1e240 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20  tained in every 
1e250 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
1e260 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e270 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
1e280 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ONS: {.      sql
1e290 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1e2a0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1e2b0 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74  .      db->dbOpt
1e2c0 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61  Flags = (u16)(va
1e2d0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20  _arg(ap, int) & 
1e2e0 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62  0xffff);.      b
1e2f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
1e300 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  def SQLITE_N_KEY
1e310 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69  WORD.    /* sqli
1e320 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e330 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e340 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73  _ISKEYWORD, cons
1e350 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20  t char *zWord). 
1e360 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
1e370 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f  zWord is a keywo
1e380 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79  rd recognized by
1e390 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
1e3a0 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20  n return the.   
1e3b0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65   ** number of ke
1e3c0 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a  ywords.  Or if z
1e3d0 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65  Word is not a ke
1e3e0 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e  yword, return 0.
1e3f0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
1e400 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72  This test featur
1e410 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
1e420 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67  ble in the amalg
1e430 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20  amation since.  
1e440 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
1e450 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20  N_KEYWORD macro 
1e460 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69  is not defined i
1e470 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53  n this file if S
1e480 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20  QLite.    ** is 
1e490 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61  built using sepa
1e4a0 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65  rate source file
1e4b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
1e4c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1e4d0 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a  RL_ISKEYWORD: {.
1e4e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1e4f0 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67   *zWord = va_arg
1e500 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
1e510 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
1e520 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e530 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72  (zWord);.      r
1e540 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77  c = (sqlite3Keyw
1e550 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f  ordCode((u8*)zWo
1e560 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f  rd, n)!=TK_ID) ?
1e570 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
1e580 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65  D : 0;.      bre
1e590 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
1e5a0 20 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69   ..    /*   sqli
1e5b0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e5c0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e5d0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
1e5e0 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20  , int onoff);.  
1e5f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
1e600 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69  arameter onoff i
1e610 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66  s non-zero, conf
1e620 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65  igure the wrappe
1e630 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20  rs so that all. 
1e640 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
1e650 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74   calls to localt
1e660 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e  ime() and varian
1e670 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66  ts fail. If onof
1e680 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a  f is zero,.    *
1e690 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74  * undo this sett
1e6a0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1e6b0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e6c0 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1e6d0 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  AULT: {.      sq
1e6e0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e6f0 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c  g.bLocaltimeFaul
1e700 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
1e710 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
1e720 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e730 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1e740 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1e750 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1e760 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20  RUPT, int);.    
1e770 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72  **.    ** Set or
1e780 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68   clear a flag th
1e790 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
1e7a0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1e7b0 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65  ile is always we
1e7c0 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65  ll-.    ** forme
1e7d0 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72  d and never corr
1e7e0 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20  upt.  This flag 
1e7f0 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61  is clear by defa
1e800 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ult, indicating 
1e810 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61  that.    ** data
1e820 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74  base files might
1e830 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20   have arbitrary 
1e840 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74  corruption.  Set
1e850 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75  ting the flag du
1e860 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74  ring.    ** test
1e870 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61  ing causes certa
1e880 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1e890 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1e8a0 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74  de to be activat
1e8b0 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  ed.    ** that d
1e8c0 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69  emonstrat invari
1e8d0 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72  ants on well-for
1e8e0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
1e8f0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1e900 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e910 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
1e920 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1e930 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1e940 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61  everCorrupt = va
1e950 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1e960 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e970 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
1e980 65 20 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77  e threshold at w
1e990 68 69 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75  hich OP_Once cou
1e9a0 6e 74 65 72 73 20 72 65 73 65 74 20 62 61 63 6b  nters reset back
1e9b0 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a   to zero..    **
1e9c0 20 42 79 20 64 65 66 61 75 6c 74 20 74 68 69 73   By default this
1e9d0 20 69 73 20 30 78 37 66 66 66 66 66 66 65 20 28   is 0x7ffffffe (
1e9e0 6f 76 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c  over 2 billion),
1e9f0 20 62 75 74 20 74 68 61 74 20 76 61 6c 75 65 20   but that value 
1ea00 69 73 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69  is.    ** too bi
1ea10 67 20 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72  g to test in a r
1ea20 65 61 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74  easonable amount
1ea30 20 6f 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69   of time, so thi
1ea40 73 20 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20  s control is.   
1ea50 20 2a 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20   ** provided to 
1ea60 73 65 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20  set a small and 
1ea70 65 61 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65  easily reachable
1ea80 20 72 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20   reset value..  
1ea90 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1eaa0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e  LITE_TESTCTRL_ON
1eab0 43 45 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f  CE_RESET_THRESHO
1eac0 4c 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LD: {.      sqli
1ead0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1eae0 69 4f 6e 63 65 52 65 73 65 74 54 68 72 65 73 68  iOnceResetThresh
1eaf0 6f 6c 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  old = va_arg(ap,
1eb00 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1eb10 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1eb20 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1eb30 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1eb40 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1eb50 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63  VERAGE, xCallbac
1eb60 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a  k, ptr);.    **.
1eb70 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56      ** Set the V
1eb80 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c  DBE coverage cal
1eb90 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
1eba0 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68  o xCallback with
1ebb0 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a   context .    **
1ebc0 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20   pointer ptr..  
1ebd0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ebe0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1ebf0 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23  BE_COVERAGE: {.#
1ec00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
1ec10 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20  E_COVERAGE.     
1ec20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1ec30 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1ec40 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38  (void*,int,u8,u8
1ec50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec60 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64  GlobalConfig.xVd
1ec70 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72  beBranch = va_ar
1ec80 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c  g(ap,branch_call
1ec90 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  back);.      sql
1eca0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ecb0 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20  .pVdbeBranchArg 
1ecc0 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64  = va_arg(ap,void
1ecd0 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  *);.#endif.     
1ece0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1ecf0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1ed00 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1ed10 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1ed20 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d  TER_MMAP, db, nM
1ed30 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  ax); */.    case
1ed40 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ed50 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a  _SORTER_MMAP: {.
1ed60 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1ed70 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1ed80 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1ed90 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
1eda0 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
1edb0 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1edc0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1edd0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1ede0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1edf0 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b  ESTCTRL_ISINIT);
1ee00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1ee10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1ee20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65  if SQLite has be
1ee30 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
1ee40 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  nd SQLITE_ERROR 
1ee50 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20  if.    ** not.. 
1ee60 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1ee70 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1ee80 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69  SINIT: {.      i
1ee90 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1eea0 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
1eeb0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
1eec0 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
1eed0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1eee0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1eef0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ef00 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
1ef10 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f   db, dbName, onO
1ef20 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a  ff, tnum);.    *
1ef30 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65  *.    ** This te
1ef40 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73  st control is us
1ef50 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70  ed to create imp
1ef60 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22  oster tables.  "
1ef70 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  db" is a pointer
1ef80 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  .    ** to the d
1ef90 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1efa0 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74  on.  dbName is t
1efb0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1efc0 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a   (ex: "main" or.
1efd0 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77      ** "temp") w
1efe0 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76  hich will receiv
1eff0 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20  e the imposter. 
1f000 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69   "onOff" turns i
1f010 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a  mposter mode on.
1f020 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20      ** or off.  
1f030 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f  "tnum" is the ro
1f040 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1f050 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74  -tree to which t
1f060 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20  he imposter.    
1f070 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ** table should 
1f080 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a  connect..    **.
1f090 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d      ** Enable im
1f0a0 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79  poster mode only
1f0b0 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
1f0c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1f0d0 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a  n parsed.  Then.
1f0e0 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e      ** run a sin
1f0f0 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  gle CREATE TABLE
1f100 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f   statement to co
1f110 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f  nstruct the impo
1f120 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20  ster table in.  
1f130 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20    ** the parsed 
1f140 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75  schema.  Then tu
1f150 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  rn imposter mode
1f160 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e   back off again.
1f170 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1f180 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74  f onOff==0 and t
1f190 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74  num>0 then reset
1f1a0 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
1f1b0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63  all databases, c
1f1c0 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  ausing.    ** th
1f1d0 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72  e schema to be r
1f1e0 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78 74  eparsed the next
1f1f0 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64   time it is need
1f200 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  ed.  This has th
1f210 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20  e.    ** effect 
1f220 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69  of erasing all i
1f230 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a  mposter tables..
1f240 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1f250 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f260 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
1f270 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f280 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1f290 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e3*);.      sqli
1f2a0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1f2b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
1f2c0 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
1f2d0 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
1f2e0 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70  me(db, va_arg(ap
1f2f0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a  ,const char*));.
1f300 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
1f310 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  usy = db->init.i
1f320 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76  mposterTable = v
1f330 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1f340 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65       db->init.ne
1f350 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61  wTnum = va_arg(a
1f360 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  p,int);.      if
1f370 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1f380 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  =0 && db->init.n
1f390 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20  ewTnum>0 ){.    
1f3a0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
1f3b0 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
1f3c0 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
1f3d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1f3e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1f3f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1f400 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1f410 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1f420 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f430 55 4e 54 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20  UNTESTABLE */.  
1f440 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f450 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
1f460 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75  ility routine, u
1f470 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70  seful to VFS imp
1f480 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68  lementations, th
1f490 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20  at checks.** to 
1f4a0 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61 73  see if a databas
1f4b0 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52 49  e file was a URI
1f4c0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20   that contained 
1f4d0 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72 79  a specific query
1f4e0 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20   .** parameter, 
1f4f0 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e  and if so obtain
1f500 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1f510 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  he query paramet
1f520 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  er..**.** The zF
1f530 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
1f540 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   is the filename
1f550 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20   pointer passed 
1f560 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29  into the xOpen()
1f570 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20  .** method of a 
1f580 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1f590 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20  on.  The zParam 
1f5a0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1f5b0 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71  name of the.** q
1f5c0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 77  uery parameter w
1f5d0 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f  e seek.  This ro
1f5e0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1f5f0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a  e value of the z
1f600 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74  Param.** paramet
1f610 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  er if it exists.
1f620 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74    If the paramet
1f630 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  er does not exis
1f640 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  t, this routine.
1f650 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c  ** returns a NUL
1f660 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f  L pointer..*/.co
1f670 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1f680 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1f690 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1f6a0 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1f6b0 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66  r *zParam){.  if
1f6c0 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
1f6d0 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72 65  | zParam==0 ) re
1f6e0 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e  turn 0;.  zFilen
1f6f0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
1f700 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
1f710 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  ) + 1;.  while( 
1f720 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
1f730 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63      int x = strc
1f740 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  mp(zFilename, zP
1f750 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65  aram);.    zFile
1f760 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1f770 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1f780 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  e) + 1;.    if( 
1f790 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46  x==0 ) return zF
1f7a0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69  ilename;.    zFi
1f7b0 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
1f7c0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
1f7d0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  ame) + 1;.  }.  
1f7e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1f7f0 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c  ** Return a bool
1f800 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ean value for a 
1f810 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1f820 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1f830 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73  uri_boolean(cons
1f840 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1f850 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1f860 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74  Param, int bDflt
1f870 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1f880 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
1f890 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65  _parameter(zFile
1f8a0 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1f8b0 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d   bDflt = bDflt!=
1f8c0 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20  0;.  return z ? 
1f8d0 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
1f8e0 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44  n(z, bDflt) : bD
1f8f0 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
1f900 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e  turn a 64-bit in
1f910 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
1f920 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
1f930 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  r..*/.sqlite3_in
1f940 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  t64 sqlite3_uri_
1f950 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63  int64(.  const c
1f960 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1f970 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
1f980 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65  s passed to xOpe
1f990 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
1f9a0 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20  r *zParam,      
1f9b0 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65   /* URI paramete
1f9c0 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71  r sought */.  sq
1f9d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c  lite3_int64 bDfl
1f9e0 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  t       /* retur
1f9f0 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69  n if parameter i
1fa00 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a  s missing */.){.
1fa10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1fa20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
1fa30 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
1fa40 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71  e, zParam);.  sq
1fa50 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
1fa60 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65   if( z && sqlite
1fa70 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
1fa80 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &v)==SQLITE_OK
1fa90 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20   ){.    bDflt = 
1faa0 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  v;.  }.  return 
1fab0 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bDflt;.}../*.** 
1fac0 52 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65  Return the Btree
1fad0 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66   pointer identif
1fae0 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20  ied by zDbName. 
1faf0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1fb00 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74  not found..*/.Bt
1fb10 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61  ree *sqlite3DbNa
1fb20 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65  meToBtree(sqlite
1fb30 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1fb40 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69  r *zDbName){.  i
1fb50 6e 74 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65  nt iDb = zDbName
1fb60 20 3f 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   ? sqlite3FindDb
1fb70 4e 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  Name(db, zDbName
1fb80 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
1fb90 69 44 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e  iDb<0 ? 0 : db->
1fba0 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a  aDb[iDb].pBt;.}.
1fbb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1fbc0 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
1fbd0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1fbe0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1fbf0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
1fc00 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
1fc10 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66  ar *sqlite3_db_f
1fc20 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20  ilename(sqlite3 
1fc30 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1fc40 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
1fc50 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20  ee *pBt;.#ifdef 
1fc60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1fc70 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1fc80 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1fc90 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1fca0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1fcb0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1fcc0 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
1fcd0 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
1fce0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1fcf0 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
1fd00 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
1fd10 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
1fd20 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a  ame(pBt) : 0;.}.
1fd30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
1fd40 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72  if database is r
1fd50 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66  ead-only or 0 if
1fd60 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65   read/write.  Re
1fd70 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f  turn -1 if.** no
1fd80 20 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65   such database e
1fd90 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
1fda0 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
1fdb0 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  y(sqlite3 *db, c
1fdc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1fdd0 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
1fde0 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
1fdf0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1fe00 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1fe10 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1fe20 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
1fe30 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1fe40 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  T;.    return -1
1fe50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
1fe60 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  Bt = sqlite3DbNa
1fe70 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1fe80 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  bName);.  return
1fe90 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74   pBt ? sqlite3Bt
1fea0 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42  reeIsReadonly(pB
1feb0 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64  t) : -1;.}..#ifd
1fec0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1fed0 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20  _SNAPSHOT./*.** 
1fee0 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f  Obtain a snapsho
1fef0 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  t handle for the
1ff00 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74   snapshot of dat
1ff10 61 62 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e  abase zDb curren
1ff20 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65  tly .** being re
1ff30 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e  ad by handle db.
1ff40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1ff50 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20  snapshot_get(.  
1ff60 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
1ff70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
1ff80 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
1ff90 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74  hot **ppSnapshot
1ffa0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1ffb0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66  QLITE_ERROR;.#if
1ffc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ffd0 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c  _WAL..#ifdef SQL
1ffe0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1fff0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
20000 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
20010 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
20020 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
20030 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
20040 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
20050 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
20060 78 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 61  x);..  if( db->a
20070 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  utoCommit==0 ){.
20080 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
20090 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
200a0 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  db, zDb);.    if
200b0 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e  ( iDb==0 || iDb>
200c0 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  1 ){.      Btree
200d0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
200e0 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
200f0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74  if( 0==sqlite3Bt
20100 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
20110 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
20120 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
20130 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29  ginTrans(pBt, 0)
20140 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
20150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20160 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
20170 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
20180 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42 74 72  otGet(sqlite3Btr
20190 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 70  eePager(pBt), pp
201a0 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20  Snapshot);.     
201b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
201c0 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
201d0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
201e0 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66  ->mutex);.#endif
201f0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     /* SQLITE_OMI
20200 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72  T_WAL */.  retur
20210 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
20220 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  pen a read-trans
20230 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e  action on the sn
20240 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65  apshot idendifie
20250 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a  d by pSnapshot..
20260 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
20270 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20  napshot_open(.  
20280 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
20290 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
202a0 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70   .  sqlite3_snap
202b0 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a  shot *pSnapshot.
202c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
202d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e  LITE_ERROR;.#ifn
202e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
202f0 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
20300 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
20310 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
20320 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
20330 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
20340 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
20350 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
20360 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
20370 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
20380 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  );.  if( db->aut
20390 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  oCommit==0 ){.  
203a0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69    int iDb;.    i
203b0 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
203c0 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
203d0 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20  .    if( iDb==0 
203e0 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  || iDb>1 ){.    
203f0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
20400 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
20410 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
20420 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65  lite3BtreeIsInRe
20430 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  adTrans(pBt) ){.
20440 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20450 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
20460 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72  tOpen(sqlite3Btr
20470 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 53  eePager(pBt), pS
20480 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
20490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
204a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
204b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
204c0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74  eeBeginTrans(pBt
204d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
204e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
204f0 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33  shotOpen(sqlite3
20500 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c  BtreePager(pBt),
20510 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
20520 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20530 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
20540 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
20550 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  x);.#endif   /* 
20560 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
20570 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
20580 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 76 65 72  }../*.** Recover
20590 20 61 73 20 6d 61 6e 79 20 73 6e 61 70 73 68 6f   as many snapsho
205a0 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ts as possible f
205b0 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65  rom the wal file
205c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
205d0 0a 2a 2a 20 73 63 68 65 6d 61 20 7a 44 62 20 6f  .** schema zDb o
205e0 66 20 64 61 74 61 62 61 73 65 20 64 62 2e 0a 2a  f database db..*
205f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
20600 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 73  apshot_recover(s
20610 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
20620 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
20630 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20640 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62  ERROR;.  int iDb
20650 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
20660 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65  _OMIT_WAL..#ifde
20670 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20680 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
20690 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
206a0 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
206b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
206c0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
206d0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
206e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
206f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 44 62 20  ->mutex);.  iDb 
20700 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
20710 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
20720 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44  if( iDb==0 || iD
20730 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65 65  b>1 ){.    Btree
20740 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
20750 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  iDb].pBt;.    if
20760 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  ( 0==sqlite3Btre
20770 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70  eIsInReadTrans(p
20780 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
20790 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
207a0 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29  ginTrans(pBt, 0)
207b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
207c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
207d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
207e0 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 52 65  3PagerSnapshotRe
207f0 63 6f 76 65 72 28 73 71 6c 69 74 65 33 42 74 72  cover(sqlite3Btr
20800 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
20810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
20820 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  reeCommit(pBt);.
20830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20840 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
20850 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
20860 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  x);.#endif   /* 
20870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
20880 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
20890 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
208a0 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20  snapshot handle 
208b0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
208c0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
208d0 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  et()..*/.void sq
208e0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66  lite3_snapshot_f
208f0 72 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70  ree(sqlite3_snap
20900 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29  shot *pSnapshot)
20910 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
20920 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23  (pSnapshot);.}.#
20930 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
20940 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20  ENABLE_SNAPSHOT 
20950 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
20960 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f  TE_OMIT_COMPILEO
20970 50 54 49 4f 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a  PTION_DIAGS./*.*
20980 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  * Given the name
20990 20 6f 66 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69   of a compile-ti
209a0 6d 65 20 6f 70 74 69 6f 6e 2c 20 72 65 74 75 72  me option, retur
209b0 6e 20 74 72 75 65 20 69 66 20 74 68 61 74 20 6f  n true if that o
209c0 70 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65  ption.** was use
209d0 64 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e  d and false if n
209e0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61  ot..**.** The na
209f0 6d 65 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c  me can optionall
20a00 79 20 62 65 67 69 6e 20 77 69 74 68 20 22 53 51  y begin with "SQ
20a10 4c 49 54 45 5f 22 20 62 75 74 20 74 68 65 20 22  LITE_" but the "
20a20 53 51 4c 49 54 45 5f 22 20 70 72 65 66 69 78 0a  SQLITE_" prefix.
20a30 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ** is not requir
20a40 65 64 20 66 6f 72 20 61 20 6d 61 74 63 68 2e 0a  ed for a match..
20a50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
20a60 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65  ompileoption_use
20a70 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f  d(const char *zO
20a80 70 74 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  ptName){.  int i
20a90 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b  , n;.  int nOpt;
20aa0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
20ab0 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a  azCompileOpt;. .
20ac0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
20ad0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
20ae0 28 20 7a 4f 70 74 4e 61 6d 65 3d 3d 30 20 29 7b  ( zOptName==0 ){
20af0 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
20b00 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
20b10 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
20b20 0a 23 65 6e 64 69 66 0a 0a 20 20 61 7a 43 6f 6d  .#endif..  azCom
20b30 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65  pileOpt = sqlite
20b40 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28  3CompileOptions(
20b50 26 6e 4f 70 74 29 3b 0a 0a 20 20 69 66 28 20 73  &nOpt);..  if( s
20b60 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
20b70 4f 70 74 4e 61 6d 65 2c 20 22 53 51 4c 49 54 45  OptName, "SQLITE
20b80 5f 22 2c 20 37 29 3d 3d 30 20 29 20 7a 4f 70 74  _", 7)==0 ) zOpt
20b90 4e 61 6d 65 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d  Name += 7;.  n =
20ba0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
20bb0 28 7a 4f 70 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f  (zOptName);..  /
20bc0 2a 20 53 69 6e 63 65 20 6e 4f 70 74 20 69 73 20  * Since nOpt is 
20bd0 6e 6f 72 6d 61 6c 6c 79 20 69 6e 20 73 69 6e 67  normally in sing
20be0 6c 65 20 64 69 67 69 74 73 2c 20 61 20 6c 69 6e  le digits, a lin
20bf0 65 61 72 20 73 65 61 72 63 68 20 69 73 20 0a 20  ear search is . 
20c00 20 2a 2a 20 61 64 65 71 75 61 74 65 2e 20 4e 6f   ** adequate. No
20c10 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 6e 61   need for a bina
20c20 72 79 20 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20  ry search. */.  
20c30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b  for(i=0; i<nOpt;
20c40 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
20c50 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
20c60 4f 70 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70 69  OptName, azCompi
20c70 6c 65 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a  leOpt[i], n)==0.
20c80 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
20c90 73 49 64 43 68 61 72 28 28 75 6e 73 69 67 6e 65  sIdChar((unsigne
20ca0 64 20 63 68 61 72 29 61 7a 43 6f 6d 70 69 6c 65  d char)azCompile
20cb0 4f 70 74 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20  Opt[i][n])==0.  
20cc0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
20cd0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
20ce0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
20cf0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4e  .** Return the N
20d00 2d 74 68 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  -th compile-time
20d10 20 6f 70 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20   option string. 
20d20 20 49 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20   If N is out of 
20d30 72 61 6e 67 65 2c 0a 2a 2a 20 72 65 74 75 72 6e  range,.** return
20d40 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e   a NULL pointer.
20d50 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
20d60 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f  sqlite3_compileo
20d70 70 74 69 6f 6e 5f 67 65 74 28 69 6e 74 20 4e 29  ption_get(int N)
20d80 7b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20  {.  int nOpt;.  
20d90 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43  const char **azC
20da0 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 20 61 7a 43  ompileOpt;.  azC
20db0 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69  ompileOpt = sqli
20dc0 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e  te3CompileOption
20dd0 73 28 26 6e 4f 70 74 29 3b 0a 20 20 69 66 28 20  s(&nOpt);.  if( 
20de0 4e 3e 3d 30 20 26 26 20 4e 3c 6e 4f 70 74 20 29  N>=0 && N<nOpt )
20df0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 7a 43  {.    return azC
20e00 6f 6d 70 69 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20  ompileOpt[N];.  
20e10 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
20e20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
20e30 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54  _OMIT_COMPILEOPT
20e40 49 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a           ION_DIAGS */.