/ Hex Artifact Content
Login

Artifact 0ed4383f4de08ac1a808c45666743c6352dfee87adf4557e99bf2a954b31bdf6:


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 43  SQLITE_CONFIG_SC
3d40: 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f  RATCH: {.      /
3d50: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3d60: 2d 30 38 34 30 34 2d 36 30 38 38 37 20 54 68 65  -08404-60887 The
3d70: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
3d80: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
3d90: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
3da0: 5f 53 43 52 41 54 43 48 3a 20 41 20 70 6f 69 6e  _SCRATCH: A poin
3db0: 74 65 72 20 61 6e 20 38 2d 62 79 74 65 20 61 6c  ter an 8-byte al
3dc0: 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 62 75 66  igned memory buf
3dd0: 66 65 72 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  fer from.      *
3de0: 2a 20 77 68 69 63 68 20 74 68 65 20 73 63 72 61  * which the scra
3df0: 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  tch allocations 
3e00: 77 69 6c 6c 20 62 65 20 64 72 61 77 6e 2c 20 74  will be drawn, t
3e10: 68 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68 20  he size of each 
3e20: 73 63 72 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  scratch.      **
3e30: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 73 7a 29   allocation (sz)
3e40: 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  , and the maximu
3e50: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 63 72 61  m number of scra
3e60: 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  tch allocations 
3e70: 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  (N). */.      sq
3e80: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3e90: 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.pScratch = va_
3ea0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
3eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3ec0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
3ed0: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
3ee0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3ef0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3f00: 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .nScratch = va_a
3f10: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3f30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3f40: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
3f50: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
3f60: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 37 36  DENCE-OF: R-1876
3f70: 31 2d 33 36 36 30 31 20 54 68 65 72 65 20 61 72  1-36601 There ar
3f80: 65 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74  e three argument
3f90: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51  s to.      ** SQ
3fa0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
3fb0: 43 41 43 48 45 3a 20 41 20 70 6f 69 6e 74 65 72  CACHE: A pointer
3fc0: 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   to 8-byte align
3fd0: 65 64 20 6d 65 6d 6f 72 79 20 28 70 4d 65 6d 29  ed memory (pMem)
3fe0: 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  ,.      ** the s
3ff0: 69 7a 65 20 6f 66 20 65 61 63 68 20 70 61 67 65  ize of each page
4000: 20 63 61 63 68 65 20 6c 69 6e 65 20 28 73 7a 29   cache line (sz)
4010: 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  , and the number
4020: 20 6f 66 20 63 61 63 68 65 20 6c 69 6e 65 73 0a   of cache lines.
4030: 20 20 20 20 20 20 2a 2a 20 28 4e 29 2e 20 2a 2f        ** (N). */
4040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4050: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
4060: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
4070: 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  id*);.      sqli
4080: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4090: 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28  szPage = va_arg(
40a0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
40b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
40c0: 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61  fig.nPage = va_a
40d0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
40e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
40f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4100: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44  CONFIG_PCACHE_HD
4110: 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  RSZ: {.      /* 
4120: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
4130: 39 31 30 30 2d 32 37 33 31 37 20 54 68 65 20 53  9100-27317 The S
4140: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
4150: 43 48 45 5f 48 44 52 53 5a 20 6f 70 74 69 6f 6e  CHE_HDRSZ option
4160: 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20   takes.      ** 
4170: 61 20 73 69 6e 67 6c 65 20 70 61 72 61 6d 65 74  a single paramet
4180: 65 72 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  er which is a po
4190: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65  inter to an inte
41a0: 67 65 72 20 61 6e 64 20 77 72 69 74 65 73 20 69  ger and writes i
41b0: 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  nto.      ** tha
41c0: 74 20 69 6e 74 65 67 65 72 20 74 68 65 20 6e 75  t integer the nu
41d0: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 62 79  mber of extra by
41e0: 74 65 73 20 70 65 72 20 70 61 67 65 20 72 65 71  tes per page req
41f0: 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 70  uired for each p
4200: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  age.      ** in 
4210: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41  SQLITE_CONFIG_PA
4220: 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20 20 20 20  GECACHE. */.    
4230: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 69 6e    *va_arg(ap, in
4240: 74 2a 29 20 3d 20 0a 20 20 20 20 20 20 20 20 20  t*) = .         
4250: 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69   sqlite3HeaderSi
4260: 7a 65 42 74 72 65 65 28 29 20 2b 0a 20 20 20 20  zeBtree() +.    
4270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65 61        sqlite3Hea
4280: 64 65 72 53 69 7a 65 50 63 61 63 68 65 28 29 20  derSizePcache() 
4290: 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  +.          sqli
42a0: 74 65 33 48 65 61 64 65 72 53 69 7a 65 50 63 61  te3HeaderSizePca
42b0: 63 68 65 31 28 29 3b 0a 20 20 20 20 20 20 62 72  che1();.      br
42c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
42d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
42e0: 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20  IG_PCACHE: {.   
42f0: 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
4300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4310: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
4320: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43  E_CONFIG_GETPCAC
4330: 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  HE: {.      /* n
4340: 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  ow an error */. 
4350: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4360: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
4370: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4380: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
4390: 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20 20  IG_PCACHE2: {.  
43a0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
43b0: 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34 38 33 37  OF: R-63325-4837
43c0: 38 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  8 The SQLITE_CON
43d0: 46 49 47 5f 50 43 41 43 48 45 32 20 6f 70 74 69  FIG_PCACHE2 opti
43e0: 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20  on takes a.     
43f0: 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d   ** single argum
4400: 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70  ent which is a p
4410: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
4420: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
4430: 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62  ods2.      ** ob
4440: 6a 65 63 74 2e 20 54 68 69 73 20 6f 62 6a 65 63  ject. This objec
4450: 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  t specifies the 
4460: 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 20 63  interface to a c
4470: 75 73 74 6f 6d 20 70 61 67 65 20 63 61 63 68 65  ustom page cache
4480: 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  .      ** implem
4490: 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  entation. */.   
44a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
44b0: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20 3d  Config.pcache2 =
44c0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
44d0: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
44e0: 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62 72  ods2*);.      br
44f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4500: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
4510: 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b 0a  G_GETPCACHE2: {.
4520: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
4530: 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35 2d 34 36  E-OF: R-22035-46
4540: 31 38 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43  182 The SQLITE_C
4550: 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32  ONFIG_GETPCACHE2
4560: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a   option takes a.
4570: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
4580: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
4590: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
45a0: 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  n sqlite3_pcache
45b0: 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20  _methods2.      
45c0: 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51 4c 69 74  ** object. SQLit
45d0: 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
45e0: 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 61 63  current page cac
45f0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
4600: 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  n into.      ** 
4610: 74 68 61 74 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  that object. */.
4620: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4630: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
4640: 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29  ache2.xInit==0 )
4650: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4660: 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75 6c  3PCacheSetDefaul
4670: 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t();.      }.   
4680: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
4690: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
46a0: 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69 74  thods2*) = sqlit
46b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
46c0: 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62 72  cache2;.      br
46d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f 2a 20 45  eak;.    }../* E
46e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
46f0: 36 32 36 2d 31 32 39 31 31 20 54 68 65 20 53 51  626-12911 The SQ
4700: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50  LITE_CONFIG_HEAP
4710: 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 0a   option is only.
4720: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 66 20  ** available if 
4730: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
4740: 65 64 20 77 69 74 68 20 65 69 74 68 65 72 20 53  ed with either S
4750: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
4760: 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  SYS3 or.** SQLIT
4770: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
4780: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c   and returns SQL
4790: 49 54 45 5f 45 52 52 4f 52 20 69 66 20 69 6e 76  ITE_ERROR if inv
47a0: 6f 6b 65 64 20 6f 74 68 65 72 77 69 73 65 2e 20  oked otherwise. 
47b0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
47c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
47d0: 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SYS3) || defined
47e0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
47f0: 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73 65  EMSYS5).    case
4800: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
4810: 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAP: {.      /* 
4820: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
4830: 39 38 35 34 2d 34 32 31 32 36 20 54 68 65 72 65  9854-42126 There
4840: 20 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d   are three argum
4850: 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ents to.      **
4860: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
4870: 45 41 50 3a 20 41 6e 20 38 2d 62 79 74 65 20 61  EAP: An 8-byte a
4880: 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65 72 20 74  ligned pointer t
4890: 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68  o the memory, th
48a0: 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65  e.      ** numbe
48b0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
48c0: 65 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2c  e memory buffer,
48d0: 20 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   and the minimum
48e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
48f0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
4900: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4910: 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76 61 5f  nfig.pHeap = va_
4920: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
4930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4940: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
4950: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4960: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4970: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4980: 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  eq = va_arg(ap, 
4990: 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  int);..      if(
49a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
49b0: 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a  nfig.mnReq<1 ){.
49c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
49d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
49e0: 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  q = 1;.      }el
49f0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  se if( sqlite3Gl
4a00: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
4a10: 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20  >(1<<12) ){.    
4a20: 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72      /* cap min r
4a30: 65 71 75 65 73 74 20 73 69 7a 65 20 61 74 20 32  equest size at 2
4a40: 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ^12 */.        s
4a50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4a60: 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31  ig.mnReq = (1<<1
4a70: 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  2);.      }..   
4a80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
4a90: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70  obalConfig.pHeap
4aa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
4ab0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4ac0: 2d 34 39 39 32 30 2d 36 30 31 38 39 20 49 66 20  -49920-60189 If 
4ad0: 74 68 65 20 66 69 72 73 74 20 70 6f 69 6e 74 65  the first pointe
4ae0: 72 20 28 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f  r (the memory po
4af0: 69 6e 74 65 72 29 0a 20 20 20 20 20 20 20 20 2a  inter).        *
4b00: 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  * is NULL, then 
4b10: 53 51 4c 69 74 65 20 72 65 76 65 72 74 73 20 74  SQLite reverts t
4b20: 6f 20 75 73 69 6e 67 20 69 74 73 20 64 65 66 61  o using its defa
4b30: 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ult memory alloc
4b40: 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ator.        ** 
4b50: 28 74 68 65 20 73 79 73 74 65 6d 20 6d 61 6c 6c  (the system mall
4b60: 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74  oc() implementat
4b70: 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  ion), undoing an
4b80: 79 20 70 72 69 6f 72 20 69 6e 76 6f 63 61 74 69  y prior invocati
4b90: 6f 6e 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  on of.        **
4ba0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
4bb0: 41 4c 4c 4f 43 2e 0a 20 20 20 20 20 20 20 20 2a  ALLOC..        *
4bc0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 65 74  *.        ** Set
4bd0: 74 69 6e 67 20 73 71 6c 69 74 65 33 47 6c 6f 62  ting sqlite3Glob
4be0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f 20 61 6c  alConfig.m to al
4bf0: 6c 20 7a 65 72 6f 73 20 77 69 6c 6c 20 63 61 75  l zeros will cau
4c00: 73 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a 20 20 20  se malloc to.   
4c10: 20 20 20 20 20 2a 2a 20 72 65 76 65 72 74 20 74       ** revert t
4c20: 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 69 6d  o its default im
4c30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65  plementation whe
4c40: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  n sqlite3_initia
4c50: 6c 69 7a 65 28 29 20 69 73 20 72 75 6e 0a 20 20  lize() is run.  
4c60: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
4c70: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
4c80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20  GlobalConfig.m, 
4c90: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
4ca0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29  3GlobalConfig.m)
4cb0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
4cc0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
4cd0: 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 30 30 36 2d  NCE-OF: R-61006-
4ce0: 30 38 39 31 38 20 49 66 20 74 68 65 20 6d 65 6d  08918 If the mem
4cf0: 6f 72 79 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  ory pointer is n
4d00: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65  ot NULL then the
4d10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 74 65  .        ** alte
4d20: 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72 79 20 61  rnative memory a
4d30: 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6e 67 61  llocator is enga
4d40: 67 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 61 6c  ged to handle al
4d50: 6c 20 6f 66 20 53 51 4c 69 74 65 73 0a 20 20 20  l of SQLites.   
4d60: 20 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61       ** memory a
4d70: 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65 64 73 2e  llocation needs.
4d80: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
4d90: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
4da0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4db0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
4dc0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
4dd0: 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66  emsys3();.#endif
4de0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4df0: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20  NABLE_MEMSYS5.  
4e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4e10: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73  balConfig.m = *s
4e20: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
4e30: 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ys5();.#endif.  
4e40: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
4e50: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
4e60: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4e70: 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  _CONFIG_LOOKASID
4e80: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4e90: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
4ea0: 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  zLookaside = va_
4eb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4ec0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4ed0: 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  lConfig.nLookasi
4ee0: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
4ef0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
4f00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  k;.    }.    .  
4f10: 20 20 2f 2a 20 52 65 63 6f 72 64 20 61 20 70 6f    /* Record a po
4f20: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 6f 67  inter to the log
4f30: 67 65 72 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  ger function and
4f40: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
4f50: 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ent..    ** The 
4f60: 64 65 66 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e  default is NULL.
4f70: 20 20 4c 6f 67 67 69 6e 67 20 69 73 20 64 69 73    Logging is dis
4f80: 61 62 6c 65 64 20 69 66 20 74 68 65 20 66 75 6e  abled if the fun
4f90: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73  ction pointer is
4fa0: 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20  .    ** NULL..  
4fb0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
4fc0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a  LITE_CONFIG_LOG:
4fd0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43   {.      /* MSVC
4fe0: 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20   is picky about 
4ff0: 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72  pulling func ptr
5000: 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e  s from va lists.
5010: 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f  .      ** http:/
5020: 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f  /support.microso
5030: 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a  ft.com/kb/47961.
5040: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
5050: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
5060: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
5070: 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74  oid(*)(void*,int
5080: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a  ,const char*));.
5090: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
50a0: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47  ypedef void(*LOG
50b0: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e  FUNC_t)(void*,in
50c0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  t,const char*);.
50d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50e0: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d  balConfig.xLog =
50f0: 20 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46   va_arg(ap, LOGF
5100: 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71  UNC_t);.      sq
5110: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5120: 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61  g.pLogArg = va_a
5130: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
5140: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5150: 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  }..    /* EVIDEN
5160: 43 45 2d 4f 46 3a 20 52 2d 35 35 35 34 38 2d 33  CE-OF: R-55548-3
5170: 33 38 31 37 20 54 68 65 20 63 6f 6d 70 69 6c 65  3817 The compile
5180: 2d 74 69 6d 65 20 73 65 74 74 69 6e 67 20 66 6f  -time setting fo
5190: 72 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 0a  r URI filenames.
51a0: 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 63 68      ** can be ch
51b0: 61 6e 67 65 64 20 61 74 20 73 74 61 72 74 2d 74  anged at start-t
51c0: 69 6d 65 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ime using the.  
51d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    ** sqlite3_con
51e0: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
51f0: 47 5f 55 52 49 2c 31 29 20 6f 72 0a 20 20 20 20  G_URI,1) or.    
5200: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  ** sqlite3_confi
5210: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
5220: 55 52 49 2c 30 29 20 63 6f 6e 66 69 67 75 72 61  URI,0) configura
5230: 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20 20 20 20  tion calls..    
5240: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
5250: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b  TE_CONFIG_URI: {
5260: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
5270: 43 45 2d 4f 46 3a 20 52 2d 32 35 34 35 31 2d 36  CE-OF: R-25451-6
5280: 31 31 32 35 20 54 68 65 20 53 51 4c 49 54 45 5f  1125 The SQLITE_
5290: 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70 74 69 6f  CONFIG_URI optio
52a0: 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  n takes a single
52b0: 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  .      ** argume
52c0: 6e 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2e 20  nt of type int. 
52d0: 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  If non-zero, the
52e0: 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 20 69  n URI handling i
52f0: 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20  s globally.     
5300: 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
5310: 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
5320: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20   zero, then URI 
5330: 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62  handling is glob
5340: 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 64 69  ally.      ** di
5350: 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20  sabled. */.     
5360: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5370: 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20  nfig.bOpenUri = 
5380: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
5390: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
53a0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51    }..    case SQ
53b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45  LITE_CONFIG_COVE
53c0: 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a  RING_INDEX_SCAN:
53d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
53e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 35 39 32  ENCE-OF: R-36592
53f0: 2d 30 32 37 37 32 20 54 68 65 20 53 51 4c 49 54  -02772 The SQLIT
5400: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
5410: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 0a 20 20 20  G_INDEX_SCAN.   
5420: 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 74 61 6b     ** option tak
5430: 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  es a single inte
5440: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ger argument whi
5450: 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
5460: 64 20 61 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  d as a.      ** 
5470: 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72 64 65 72  boolean in order
5480: 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20 64 69   to enable or di
5490: 73 61 62 6c 65 20 74 68 65 20 75 73 65 20 6f 66  sable the use of
54a0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 69 63 65   covering indice
54b0: 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 66  s for.      ** f
54c0: 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 20  ull table scans 
54d0: 69 6e 20 74 68 65 20 71 75 65 72 79 20 6f 70 74  in the query opt
54e0: 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20 20 20 20  imizer. */.     
54f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5500: 6e 66 69 67 2e 62 55 73 65 43 69 73 20 3d 20 76  nfig.bUseCis = v
5510: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5530: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
5540: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
5550: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5560: 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b  CONFIG_SQLLOG: {
5570: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
5580: 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f  oid(*SQLLOGFUNC_
5590: 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65  t)(void*, sqlite
55a0: 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
55b0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
55c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
55d0: 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61 5f 61 72  .xSqllog = va_ar
55e0: 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46 55 4e 43  g(ap, SQLLOGFUNC
55f0: 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _t);.      sqlit
5600: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
5610: 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76 61 5f 61  SqllogArg = va_a
5620: 72 67 28 61 70 2c 20 76 6f 69 64 20 2a 29 3b 0a  rg(ap, void *);.
5630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5640: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
5650: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5660: 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  G_MMAP_SIZE: {. 
5670: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5680: 2d 4f 46 3a 20 52 2d 35 38 30 36 33 2d 33 38 32  -OF: R-58063-382
5690: 35 38 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  58 SQLITE_CONFIG
56a0: 5f 4d 4d 41 50 5f 53 49 5a 45 20 74 61 6b 65 73  _MMAP_SIZE takes
56b0: 20 74 77 6f 20 36 34 2d 62 69 74 0a 20 20 20 20   two 64-bit.    
56c0: 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 28 73 71    ** integer (sq
56d0: 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 76 61 6c  lite3_int64) val
56e0: 75 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ues that are the
56f0: 20 64 65 66 61 75 6c 74 20 6d 6d 61 70 20 73 69   default mmap si
5700: 7a 65 20 6c 69 6d 69 74 0a 20 20 20 20 20 20 2a  ze limit.      *
5710: 2a 20 28 74 68 65 20 64 65 66 61 75 6c 74 20 73  * (the default s
5720: 65 74 74 69 6e 67 20 66 6f 72 20 50 52 41 47 4d  etting for PRAGM
5730: 41 20 6d 6d 61 70 5f 73 69 7a 65 29 20 61 6e 64  A mmap_size) and
5740: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   the maximum all
5750: 6f 77 65 64 0a 20 20 20 20 20 20 2a 2a 20 6d 6d  owed.      ** mm
5760: 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 2e 20 2a  ap size limit. *
5770: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
5780: 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d 20 76  int64 szMmap = v
5790: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
57a0: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
57b0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78  sqlite3_int64 mx
57c0: 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
57d0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
57e0: 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  ;.      /* EVIDE
57f0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 33 36 37 2d  NCE-OF: R-53367-
5800: 34 33 31 39 30 20 49 66 20 65 69 74 68 65 72 20  43190 If either 
5810: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
5820: 20 6f 70 74 69 6f 6e 20 69 73 0a 20 20 20 20 20   option is.     
5830: 20 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 74 68   ** negative, th
5840: 65 6e 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  en that argument
5850: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 69   is changed to i
5860: 74 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ts compile-time 
5870: 64 65 66 61 75 6c 74 2e 0a 20 20 20 20 20 20 2a  default..      *
5880: 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
5890: 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 39 33 2d  NCE-OF: R-34993-
58a0: 34 35 30 33 31 20 54 68 65 20 6d 61 78 69 6d 75  45031 The maximu
58b0: 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d 61 70 20 73  m allowed mmap s
58c0: 69 7a 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ize will be.    
58d0: 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79 20 74 72    ** silently tr
58e0: 75 6e 63 61 74 65 64 20 69 66 20 6e 65 63 65 73  uncated if neces
58f0: 73 61 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  sary so that it 
5900: 64 6f 65 73 20 6e 6f 74 20 65 78 63 65 65 64 20  does not exceed 
5910: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  the.      ** com
5920: 70 69 6c 65 2d 74 69 6d 65 20 6d 61 78 69 6d 75  pile-time maximu
5930: 6d 20 6d 6d 61 70 20 73 69 7a 65 20 73 65 74 20  m mmap size set 
5940: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  by the SQLITE_MA
5950: 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20 20 20 20  X_MMAP_SIZE.    
5960: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
5970: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  e option..      
5980: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d 78 4d  */.      if( mxM
5990: 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e  map<0 || mxMmap>
59a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
59b0: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
59c0: 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f  mxMmap = SQLITE_
59d0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20  MAX_MMAP_SIZE;. 
59e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
59f0: 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73 7a 4d 6d   szMmap<0 ) szMm
5a00: 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ap = SQLITE_DEFA
5a10: 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20  ULT_MMAP_SIZE;. 
5a20: 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3e       if( szMmap>
5a30: 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61 70 20 3d  mxMmap) szMmap =
5a40: 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73   mxMmap;.      s
5a50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5a60: 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d  ig.mxMmap = mxMm
5a70: 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ap;.      sqlite
5a80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
5a90: 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20  Mmap = szMmap;. 
5aa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5ab0: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
5ac0: 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64 28  _WIN && defined(
5ad0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
5ae0: 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 30  LOC) /* IMP: R-0
5af0: 34 37 38 30 2d 35 35 38 31 35 20 2a 2f 0a 20 20  4780-55815 */.  
5b00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5b10: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5b20: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IZE: {.      /* 
5b30: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
5b40: 34 39 32 36 2d 30 33 33 36 30 20 53 51 4c 49 54  4926-03360 SQLIT
5b50: 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48  E_CONFIG_WIN32_H
5b60: 45 41 50 53 49 5a 45 20 74 61 6b 65 73 20 61 20  EAPSIZE takes a 
5b70: 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  32-bit.      ** 
5b80: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
5b90: 20 76 61 6c 75 65 20 74 68 61 74 20 73 70 65 63   value that spec
5ba0: 69 66 69 65 73 20 74 68 65 20 6d 61 78 69 6d 75  ifies the maximu
5bb0: 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 72  m size of the cr
5bc0: 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 68  eated.      ** h
5bd0: 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  eap. */.      sq
5be0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5bf0: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
5c00: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
5c10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5c20: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
5c30: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 4d 41  QLITE_CONFIG_PMA
5c40: 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SZ: {.      sqli
5c50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5c60: 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72 67 28 61  szPma = va_arg(a
5c70: 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  p, unsigned int)
5c80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5c90: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
5ca0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 54 4d  QLITE_CONFIG_STM
5cb0: 54 4a 52 4e 4c 5f 53 50 49 4c 4c 3a 20 7b 0a 20  TJRNL_SPILL: {. 
5cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5cd0: 61 6c 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70  alConfig.nStmtSp
5ce0: 69 6c 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ill = va_arg(ap,
5cf0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5d00: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  ak;.    }..    d
5d10: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5d20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5d30: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
5d40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
5d50: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
5d60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
5d70: 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69  t up the lookasi
5d80: 64 65 20 62 75 66 66 65 72 73 20 66 6f 72 20 61  de buffers for a
5d90: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5da0: 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  tion..** Return 
5db0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
5dc0: 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f  cess.  .** If lo
5dd0: 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65 61  okaside is alrea
5de0: 64 79 20 61 63 74 69 76 65 2c 20 72 65 74 75 72  dy active, retur
5df0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a  n SQLITE_BUSY..*
5e00: 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61  *.** The sz para
5e10: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5e20: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
5e30: 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73  each lookaside s
5e40: 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20  lot..** The cnt 
5e50: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
5e60: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
5e70: 2e 20 20 49 66 20 70 53 74 61 72 74 20 69 73 20  .  If pStart is 
5e80: 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63  NULL the.** spac
5e90: 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73  e for the lookas
5ea0: 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62  ide memory is ob
5eb0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5ec0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
5ed0: 20 49 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f   If pStart is no
5ee0: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69  t NULL then it i
5ef0: 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f  s sz*cnt bytes o
5f00: 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20  f memory to use 
5f10: 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61  for.** the looka
5f20: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  side memory..*/.
5f30: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 75 70  static int setup
5f40: 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65  Lookaside(sqlite
5f50: 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75  3 *db, void *pBu
5f60: 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63  f, int sz, int c
5f70: 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nt){.#ifndef SQL
5f80: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49  ITE_OMIT_LOOKASI
5f90: 44 45 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72  DE.  void *pStar
5fa0: 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  t;.  if( db->loo
5fb0: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20  kaside.nOut ){. 
5fc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5fd0: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
5fe0: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
5ff0: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
6000: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
6010: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
6020: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
6030: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
6040: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
6050: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
6060: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
6070: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
6080: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6090: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
60a0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
60b0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
60c0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
60d0: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
60e0: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
60f0: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
6100: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
6110: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
6120: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
6130: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
6140: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
6150: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
6160: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
6170: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6180: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6190: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
61a0: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
61b0: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
61c0: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
61d0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
61e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
61f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6200: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
6210: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
6220: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6230: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
6240: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
6250: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
6260: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
6270: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
6280: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
6290: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
62a0: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
62b0: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
62c0: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
62d0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
62e0: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
62f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
6300: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
6310: 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29  aside.sz = (u16)
6320: 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74  sz;.  if( pStart
6330: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
6340: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
6350: 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
6360: 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f   sz > (int)sizeo
6370: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
6380: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f  ) );.    p = (Lo
6390: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74  okasideSlot*)pSt
63a0: 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63  art;.    for(i=c
63b0: 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  nt-1; i>=0; i--)
63c0: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
63d0: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
63e0: 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62  .pFree;.      db
63f0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
6400: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d  e = p;.      p =
6410: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
6420: 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a  )&((u8*)p)[sz];.
6430: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f      }.    db->lo
6440: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70  okaside.pEnd = p
6450: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
6460: 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 30  ide.bDisable = 0
6470: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
6480: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
6490: 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20  pBuf==0 ?1:0;.  
64a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
64b0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
64c0: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
64d0: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64  okaside.pEnd = d
64e0: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
64f0: 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20  side.bDisable = 
6500: 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
6510: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
6520: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
6530: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
6540: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
6550: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6560: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6570: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
6580: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
6590: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
65a0: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
65b0: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
65c0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
65d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
65e0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
65f0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6600: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6610: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6620: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6630: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6640: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
6650: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
6660: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
6670: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
6680: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
6690: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
66a0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
66b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
66c0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
66d0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
66e0: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
66f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6700: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6710: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6720: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
6730: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
6740: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
6750: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
6760: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
6770: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
6780: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6790: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
67a0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
67b0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
67c0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
67d0: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
67e0: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
67f0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6800: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6810: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6820: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
6830: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6840: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6850: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6860: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
6890: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
68a0: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
68b0: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
68c0: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
68d0: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
68e0: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
68f0: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6900: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6910: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6920: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
6930: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
6940: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
6950: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
6960: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
6970: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
6980: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6990: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
69a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
69b0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
69c0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
69d0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
69e0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
69f0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6a00: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6a10: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6a20: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6a30: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
6a40: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
6a50: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
6a60: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6a70: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6a80: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6a90: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6aa0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6ab0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6ac0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6ad0: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6ae0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6af0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6b00: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6b10: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6b20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6b30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6b40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6b50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6b60: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6b70: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6b90: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6ba0: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6bb0: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6bc0: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6bd0: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6be0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6bf0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6c00: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6c10: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6c20: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6c30: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6c40: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6c50: 4d 41 49 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20  MAINDBNAME: {.  
6c60: 20 20 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a      db->aDb[0].z
6c70: 44 62 53 4e 61 6d 65 20 3d 20 76 61 5f 61 72 67  DbSName = va_arg
6c80: 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20  (ap,char*);.    
6c90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
6ca0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6cb0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
6cc0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f  LITE_DBCONFIG_LO
6cd0: 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20  OKASIDE: {.     
6ce0: 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61   void *pBuf = va
6cf0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
6d00: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35   /* IMP: R-26835
6d10: 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20  -10964 */.      
6d20: 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
6d30: 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20  ap, int);       
6d40: 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d  /* IMP: R-47871-
6d50: 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69  25994 */.      i
6d60: 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28  nt cnt = va_arg(
6d70: 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f  ap, int);      /
6d80: 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35  * IMP: R-04460-5
6d90: 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63  3386 */.      rc
6da0: 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64   = setupLookasid
6db0: 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20  e(db, pBuf, sz, 
6dc0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  cnt);.      brea
6dd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
6de0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74  ault: {.      st
6df0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
6e00: 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t {.        int 
6e10: 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  op;      /* The 
6e20: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  opcode */.      
6e30: 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f    u32 mask;    /
6e40: 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69  * Mask of the bi
6e50: 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61  t in sqlite3.fla
6e60: 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20  gs to set/clear 
6e70: 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67  */.      } aFlag
6e80: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  Op[] = {.       
6e90: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
6ea0: 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20  IG_ENABLE_FKEY, 
6eb0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
6ec0: 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20  _ForeignKeys    
6ed0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
6ee0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
6ef0: 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20  BLE_TRIGGER,    
6f00: 20 20 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c      SQLITE_Enabl
6f10: 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20  eTrigger  },.   
6f20: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
6f30: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54  CONFIG_ENABLE_FT
6f40: 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51  S3_TOKENIZER, SQ
6f50: 4c 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a  LITE_Fts3Tokeniz
6f60: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b  er  },.        {
6f70: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
6f80: 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
6f90: 45 4e 53 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c  ENSION, SQLITE_L
6fa0: 6f 61 64 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c  oadExtension  },
6fb0: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6fc0: 45 5f 44 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b  E_DBCONFIG_NO_CK
6fd0: 50 54 5f 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20  PT_ON_CLOSE,    
6fe0: 20 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f    SQLITE_NoCkptO
6ff0: 6e 43 6c 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20  nClose  },.     
7000: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
7010: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47  NFIG_ENABLE_QPSG
7020: 2c 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ,           SQLI
7030: 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 20 20 20  TE_EnableQPSG   
7040: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
7050: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
7060: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
7070: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
7080: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
7090: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
70a0: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
70b0: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
70c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
70d0: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
70e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
70f0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
7100: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
7110: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
7120: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
7130: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
7140: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
7150: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
7160: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
7170: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
7180: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
7190: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
71a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
71b0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
71c0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
71d0: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
71e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
71f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
7200: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
7210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7220: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
7230: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
7240: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
7250: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
7260: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
7270: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
7280: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
7290: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
72a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
72b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
72c0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
72d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
72e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
72f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
7300: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
7310: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
7320: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
7330: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
7340: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
7350: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
7360: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
7370: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
7380: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
7390: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
73a0: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
73b0: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
73c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
73d0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
73e0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
73f0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
7400: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
7410: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
7420: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
7430: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
7440: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
7450: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
7460: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
7470: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
7480: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
7490: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
74a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
74b0: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
74c0: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
74d0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
74e0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
74f0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
7500: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
7510: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
7520: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
7530: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
7540: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
7550: 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34  OF: R-65033-2844
7560: 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42  9 The built-in B
7570: 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
7580: 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74  compares.  ** st
7590: 72 69 6e 67 73 20 62 79 74 65 20 62 79 20 62 79  rings byte by by
75a0: 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d  te using the mem
75b0: 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  cmp() function f
75c0: 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
75d0: 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e   C.  ** library.
75e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4b   */.  assert( pK
75f0: 65 79 31 20 26 26 20 70 4b 65 79 32 20 29 3b 0a  ey1 && pKey2 );.
7600: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
7610: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
7620: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
7630: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
7640: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
7650: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
7660: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
7670: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7680: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
7690: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
76a0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
76b0: 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34  E-OF: R-31624-24
76c0: 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b  737 RTRIM is lik
76d0: 65 20 42 49 4e 41 52 59 20 65 78 63 65 70 74 20  e BINARY except 
76e0: 74 68 61 74 20 65 78 74 72 61 0a 20 20 20 20 20  that extra.     
76f0: 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74 68   ** spaces at th
7700: 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20  e end of either 
7710: 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68  string do not ch
7720: 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e  ange the result.
7730: 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20   In other.      
7740: 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67  ** words, string
7750: 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65  s will compare e
7760: 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  qual to one anot
7770: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  her as long as t
7780: 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66  hey.      ** dif
7790: 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20  fer only in the 
77a0: 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73  number of spaces
77b0: 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20   at the end..   
77c0: 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
77d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
77e0: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
77f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
7810: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
7820: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
7830: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
7840: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
7850: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
7860: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
7870: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
7880: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
7890: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
78a0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
78b0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
78c0: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
78d0: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
78e0: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
78f0: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
7900: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
7910: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
7920: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
7930: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
7940: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
7950: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
7960: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
7970: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
7980: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7990: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
79a0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
79b0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
79c0: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
79d0: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
79e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
79f0: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
7a00: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
7a10: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
7a20: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
7a30: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
7a40: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
7a50: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
7a60: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
7a70: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
7a80: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
7a90: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7aa0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
7ab0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
7ac0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7ad0: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
7ae0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7af0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
7b00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7b10: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
7b20: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
7b30: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
7b40: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7b50: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
7b60: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
7b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
7b80: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7b90: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
7ba0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7bb0: 69 64 28 29 20 41 50 49 20 66 75 6e 63 74 69 6f  id() API functio
7bc0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
7bd0: 65 33 5f 73 65 74 5f 6c 61 73 74 5f 69 6e 73 65  e3_set_last_inse
7be0: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
7bf0: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *db, sqlite3_in
7c00: 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 23 69 66  t64 iRowid){.#if
7c10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7c20: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
7c30: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
7c40: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
7c50: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
7c60: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
7c70: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7c80: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
7c90: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7ca0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6c 61 73 74  tex);.  db->last
7cb0: 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
7cc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7cd0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7cf0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7d00: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
7d10: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
7d20: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
7d30: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
7d40: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
7d50: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7d60: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
7d70: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
7d80: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
7d90: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
7da0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
7db0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
7dc0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7dd0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
7de0: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
7df0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7e00: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
7e10: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
7e20: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
7e30: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7e40: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
7e50: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7e60: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7e70: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7e80: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7e90: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7ea0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7eb0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7ec0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7ed0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7ee0: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
7ef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7f00: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
7f10: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
7f20: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
7f30: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
7f40: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
7f50: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
7f60: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
7f70: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
7f80: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
7f90: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
7fa0: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
7fb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
7fc0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
7fd0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
7fe0: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
7ff0: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
8000: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
8010: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
8020: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
8030: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
8040: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8050: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
8060: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
8070: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
8080: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
8090: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
80a0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
80b0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
80c0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
80d0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
80e0: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
80f0: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
8100: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
8110: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
8120: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
8130: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
8140: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
8150: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
8160: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
8170: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
8180: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
8190: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
81a0: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
81b0: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
81c0: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
81d0: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
81e0: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
81f0: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
8200: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
8210: 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73 74 72  or = p->u.pDestr
8220: 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65  uctor;.  if( pDe
8230: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
8240: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
8250: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  f--;.    if( pDe
8260: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d  structor->nRef==
8270: 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74  0 ){.      pDest
8280: 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79  ructor->xDestroy
8290: 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55  (pDestructor->pU
82a0: 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
82b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
82c0: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
82d0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
82e0: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c  ** Disconnect al
82f0: 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  l sqlite3_vtab o
8300: 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f  bjects that belo
8310: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
8320: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e  onnection.** db.
8330: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
8340: 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67  when db is being
8350: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
8360: 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65  ic void disconne
8370: 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65  ctAllVtab(sqlite
8380: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
8390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
83a0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69  UALTABLE.  int i
83b0: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b  ;.  HashElem *p;
83c0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
83d0: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
83e0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
83f0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68  b; i++){.    Sch
8400: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
8410: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
8420: 61 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  a;.    if( db->a
8430: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[i].pSchema ){
8440: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
8450: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
8460: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
8470: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
8480: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
8490: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
84a0: 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48  (Table *)sqliteH
84b0: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
84c0: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
84d0: 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65  l(pTab) ) sqlite
84e0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
84f0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
8500: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
8510: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
8520: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
8530: 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48  e); p; p=sqliteH
8540: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
8550: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
8560: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
8570: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
8580: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54   if( pMod->pEpoT
8590: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
85a0: 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  te3VtabDisconnec
85b0: 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f  t(db, pMod->pEpo
85c0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
85d0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
85e0: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
85f0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
8600: 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20  All(db);.#else. 
8610: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8620: 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  R(db);.#endif.}.
8630: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
8640: 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20 63  UE if database c
8650: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73  onnection db has
8660: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
8670: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
8680: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
8690: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
86a0: 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73   objects.  .*/.s
86b0: 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63  tatic int connec
86c0: 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74  tionIsBusy(sqlit
86d0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a  e3 *db){.  int j
86e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
86f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
8700: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
8710: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72  f( db->pVdbe ) r
8720: 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a  eturn 1;.  for(j
8730: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
8740: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
8750: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  pBt = db->aDb[j]
8760: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
8770: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
8780: 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29  eIsInBackup(pBt)
8790: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
87a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
87b0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
87c0: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
87d0: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
87e0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f  c int sqlite3Clo
87f0: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  se(sqlite3 *db, 
8800: 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29  int forceZombie)
8810: 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  {.  if( !db ){. 
8820: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
8830: 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30  F: R-63257-11740
8840: 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   Calling sqlite3
8850: 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20  _close() or.    
8860: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  ** sqlite3_close
8870: 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c  _v2() with a NUL
8880: 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65  L pointer argume
8890: 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  nt is a harmless
88a0: 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72   no-op. */.    r
88b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
88c0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
88d0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
88e0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
88f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8900: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
8910: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8920: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8930: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 54 72  );.  if( db->mTr
8940: 61 63 65 20 26 20 53 51 4c 49 54 45 5f 54 52 41  ace & SQLITE_TRA
8950: 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  CE_CLOSE ){.    
8960: 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c 49 54  db->xTrace(SQLIT
8970: 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 2c 20 64  E_TRACE_CLOSE, d
8980: 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20 64 62  b->pTraceArg, db
8990: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
89a0: 46 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e 65 63  Force xDisconnec
89b0: 74 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76  t calls on all v
89c0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f  irtual tables */
89d0: 0a 20 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  .  disconnectAll
89e0: 56 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  Vtab(db);..  /* 
89f0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
8a00: 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 64 69   is open, the di
8a10: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
8a20: 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a  ) call above.  *
8a30: 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20  * will not have 
8a40: 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63  called the xDisc
8a50: 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20  onnect() method 
8a60: 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20  on any virtual. 
8a70: 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68   ** tables in th
8a80: 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20  e db->aVTrans[] 
8a90: 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f  array. The follo
8aa0: 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62  wing sqlite3Vtab
8ab0: 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20  Rollback().  ** 
8ac0: 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e  call will do so.
8ad0: 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74   We need to do t
8ae0: 68 69 73 20 62 65 66 6f 72 65 20 74 68 65 20 63  his before the c
8af0: 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a  heck for active.
8b00: 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
8b10: 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68  nts below, as th
8b20: 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d  e v-table implem
8b30: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  entation may be 
8b40: 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d  storing.  ** som
8b50: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
8b60: 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ments internally
8b70: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
8b80: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
8b90: 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20 62  ;..  /* Legacy b
8ba0: 65 68 61 76 69 6f 72 20 28 73 71 6c 69 74 65 33  ehavior (sqlite3
8bb0: 5f 63 6c 6f 73 65 28 29 20 62 65 68 61 76 69 6f  _close() behavio
8bc0: 72 29 20 69 73 20 74 6f 20 72 65 74 75 72 6e 0a  r) is to return.
8bd0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
8be0: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
8bf0: 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c  on can not be cl
8c00: 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  osed immediately
8c10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f  ..  */.  if( !fo
8c20: 72 63 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e  rceZombie && con
8c30: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62  nectionIsBusy(db
8c40: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8c50: 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
8c60: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75   SQLITE_BUSY, "u
8c70: 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64  nable to close d
8c80: 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65  ue to unfinalize
8c90: 64 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74  d ".       "stat
8ca0: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
8cb0: 73 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a  shed backups");.
8cc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
8cd0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8ce0: 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  x);.    return S
8cf0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
8d00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8d10: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69  NABLE_SQLLOG.  i
8d20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
8d30: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29  Config.xSqllog )
8d40: 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67  {.    /* Closing
8d50: 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75   the handle. Fou
8d60: 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73  rth parameter is
8d70: 20 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75   passed the valu
8d80: 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  e 2. */.    sqli
8d90: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
8da0: 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47  xSqllog(sqlite3G
8db0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
8dc0: 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32  logArg, db, 0, 2
8dd0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
8de0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
8df0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20  connection into 
8e00: 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65  a zombie and the
8e10: 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f  n close it..  */
8e20: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
8e30: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42  QLITE_MAGIC_ZOMB
8e40: 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61  IE;.  sqlite3Lea
8e50: 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a  veMutexAndCloseZ
8e60: 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74  ombie(db);.  ret
8e70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8e80: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69  ../*.** Two vari
8e90: 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75  ations on the pu
8ea0: 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66  blic interface f
8eb0: 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74  or closing a dat
8ec0: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
8ed0: 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33  ion. The sqlite3
8ee0: 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e  _close() version
8ef0: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
8f00: 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76  BUSY and.** leav
8f10: 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  es the connectio
8f20: 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72  n option if ther
8f30: 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65  e are unfinalize
8f40: 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  d prepared.** st
8f50: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
8f60: 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62  nished sqlite3_b
8f70: 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c  ackups.  The sql
8f80: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a  ite3_close_v2().
8f90: 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65  ** version force
8fa0: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
8fb0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d   to become a zom
8fc0: 62 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65  bie if there are
8fd0: 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73  .** unclosed res
8fe0: 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61  ources, and arra
8ff0: 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63  nges for dealloc
9000: 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c  ation when the l
9010: 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73  ast.** prepare s
9020: 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69  tatement or sqli
9030: 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65  te3_backup close
9040: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9050: 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  3_close(sqlite3 
9060: 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c  *db){ return sql
9070: 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b  ite3Close(db,0);
9080: 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63   }.int sqlite3_c
9090: 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20  lose_v2(sqlite3 
90a0: 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c  *db){ return sql
90b0: 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b  ite3Close(db,1);
90c0: 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65   }.../*.** Close
90d0: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   the mutex on da
90e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
90f0: 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74  n db..**.** Furt
9100: 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61  hermore, if data
9110: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9120: 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28  db is a zombie (
9130: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
9140: 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61  re.** has been a
9150: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
9160: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
9170: 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   or sqlite3_clos
9180: 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a  e_v2(db)) and.**
9190: 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73   every sqlite3_s
91a0: 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e  tmt has now been
91b0: 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65   finalized and e
91c0: 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63  very sqlite3_bac
91d0: 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73  kup has.** finis
91e0: 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61  hed, then free a
91f0: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f  ll resources..*/
9200: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61  .void sqlite3Lea
9210: 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a  veMutexAndCloseZ
9220: 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64  ombie(sqlite3 *d
9230: 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  b){.  HashElem *
9240: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9250: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
9260: 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  ble iterator */.
9270: 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49    int j;..  /* I
9280: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
9290: 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f  tanding sqlite3_
92a0: 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f  stmt or sqlite3_
92b0: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20  backup objects. 
92c0: 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f   ** or if the co
92d0: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nnection has not
92e0: 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64   yet been closed
92f0: 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   by sqlite3_clos
9300: 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65  e_v2(),.  ** the
9310: 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65  n just leave the
9320: 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72   mutex and retur
9330: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  n..  */.  if( db
9340: 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f  ->magic!=SQLITE_
9350: 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20  MAGIC_ZOMBIE || 
9360: 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79  connectionIsBusy
9370: 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  (db) ){.    sqli
9380: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9390: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
93a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
93b0: 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
93c0: 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
93d0: 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ns that the data
93e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
93f0: 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20  has.  ** closed 
9400: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  all sqlite3_stmt
9410: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63   and sqlite3_bac
9420: 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20  kup objects and 
9430: 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61  has been.  ** pa
9440: 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f  ssed to sqlite3_
9450: 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74  close (meaning t
9460: 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62  hat it is a zomb
9470: 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  ie).  Therefore,
9480: 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61  .  ** go ahead a
9490: 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  nd free all reso
94a0: 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  urces..  */..  /
94b0: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
94c0: 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c  on is open, roll
94d0: 20 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61   it back. This a
94e0: 6c 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74  lso ensures that
94f0: 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74   if.  ** any dat
9500: 61 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61  abase schemas ha
9510: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
9520: 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74   by an uncommitt
9530: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ed transaction. 
9540: 20 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73   ** they are res
9550: 65 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65  et. And that the
9560: 20 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65   required b-tree
9570: 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74   mutex is held t
9580: 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20  o make.  ** the 
9590: 70 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61  pager rollback a
95a0: 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20  nd schema reset 
95b0: 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74  an atomic operat
95c0: 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ion. */.  sqlite
95d0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
95e0: 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20   SQLITE_OK);..  
95f0: 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73  /* Free any outs
9600: 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e  tanding Savepoin
9610: 74 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f  t structures. */
9620: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  .  sqlite3CloseS
9630: 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a  avepoints(db);..
9640: 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64    /* Close all d
9650: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9660: 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30  ons */.  for(j=0
9670: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
9680: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
9690: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
96a0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [j];.    if( pDb
96b0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73  ->pBt ){.      s
96c0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
96d0: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
96e0: 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a    pDb->pBt = 0;.
96f0: 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29        if( j!=1 )
9700: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70  {.        pDb->p
9710: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
9720: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9730: 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d  /* Clear the TEM
9740: 50 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74  P schema separat
9750: 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a  ely and last */.
9760: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d    if( db->aDb[1]
9770: 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
9780: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
9790: 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  ar(db->aDb[1].pS
97a0: 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71  chema);.  }.  sq
97b0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
97c0: 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46  ist(db);..  /* F
97d0: 72 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79  ree up the array
97e0: 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61   of auxiliary da
97f0: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c  tabases */.  sql
9800: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
9810: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20  baseArray(db);. 
9820: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62   assert( db->nDb
9830: 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=2 );.  assert(
9840: 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44   db->aDb==db->aD
9850: 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a  bStatic );..  /*
9860: 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69   Tell the code i
9870: 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20  n notify.c that 
9880: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e  the connection n
9890: 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61  o longer holds a
98a0: 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e  ny.  ** locks an
98b0: 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  d does not requi
98c0: 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75  re any further u
98d0: 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
98e0: 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73  lbacks..  */.  s
98f0: 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
9900: 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66  Closed(db);..  f
9910: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9920: 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e 63 29  irst(&db->aFunc)
9930: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9940: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 46  hNext(i)){.    F
9950: 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a  uncDef *pNext, *
9960: 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  p;.    p = sqlit
9970: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
9980: 20 20 64 6f 7b 0a 20 20 20 20 20 20 66 75 6e 63    do{.      func
9990: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
99a0: 70 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  p);.      pNext 
99b0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
99c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
99d0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 20  db, p);.      p 
99e0: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 77 68  = pNext;.    }wh
99f0: 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a 20 20  ile( p );.  }.  
9a00: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
9a10: 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a 20 20  (&db->aFunc);.  
9a20: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
9a30: 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  First(&db->aColl
9a40: 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  Seq); i; i=sqlit
9a50: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
9a60: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9a70: 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73  l = (CollSeq *)s
9a80: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
9a90: 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  ;.    /* Invoke 
9aa0: 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73 20  any destructors 
9ab0: 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 63  registered for c
9ac0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9ad0: 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a  e user data. */.
9ae0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
9af0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
9b00: 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20  ( pColl[j].xDel 
9b10: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
9b20: 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a  [j].xDel(pColl[j
9b30: 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20  ].pUser);.      
9b40: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
9b50: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
9b60: 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  oll);.  }.  sqli
9b70: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
9b80: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66  ->aCollSeq);.#if
9b90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9ba0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
9bb0: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
9bc0: 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75  First(&db->aModu
9bd0: 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  le); i; i=sqlite
9be0: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9bf0: 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d    Module *pMod =
9c00: 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74   (Module *)sqlit
9c10: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
9c20: 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73    if( pMod->xDes
9c30: 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d  troy ){.      pM
9c40: 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f  od->xDestroy(pMo
9c50: 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a  d->pAux);.    }.
9c60: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 45      sqlite3VtabE
9c70: 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c 65  ponymousTableCle
9c80: 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20  ar(db, pMod);.  
9c90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9ca0: 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20  db, pMod);.  }. 
9cb0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
9cc0: 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  r(&db->aModule);
9cd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
9ce0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
9cf0: 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c  TE_OK); /* Deall
9d00: 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65  ocates any cache
9d10: 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e  d error strings.
9d20: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   */.  sqlite3Val
9d30: 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29  ueFree(db->pErr)
9d40: 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  ;.  sqlite3Close
9d50: 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
9d60: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
9d70: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
9d80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
9d90: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72  ->auth.zAuthUser
9da0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9db0: 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68  e(db->auth.zAuth
9dc0: 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  PW);.#endif..  d
9dd0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
9de0: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a  E_MAGIC_ERROR;..
9df0: 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61    /* The temp-da
9e00: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
9e10: 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65   allocated diffe
9e20: 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rently from the 
9e30: 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a  other schema.  *
9e40: 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67  * objects (using
9e50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
9e60: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
9e70: 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  d of sqlite3Btre
9e80: 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a  eSchema())..  **
9e90: 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   So it needs to 
9ea0: 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54  be freed here. T
9eb0: 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c  odo: Why not rol
9ec0: 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d  l the temp schem
9ed0: 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  a into.  ** the 
9ee0: 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  same sqliteMallo
9ef0: 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74  c() as the one t
9f00: 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68  hat allocates th
9f10: 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a  e database .  **
9f20: 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f   structure?.  */
9f30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
9f40: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  (db, db->aDb[1].
9f50: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
9f60: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9f70: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
9f80: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
9f90: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
9fa0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
9fb0: 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ree(db->mutex);.
9fc0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
9fd0: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20  okaside.nOut==0 
9fe0: 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20  );  /* Fails on 
9ff0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  a lookaside memo
a000: 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28  ry leak */.  if(
a010: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
a020: 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20  Malloced ){.    
a030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
a040: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
a050: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
a060: 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  3_free(db);.}../
a070: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
a080: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
a090: 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  .  If tripCode i
a0a0: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
a0b0: 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69   then.** any wri
a0c0: 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  te cursors are i
a0d0: 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69  nvalidated ("tri
a0e0: 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74  pped" - as in "t
a0f0: 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69  ripping a circui
a100: 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61  t.** breaker") a
a110: 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72  nd made to retur
a120: 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68  n tripCode if th
a130: 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74  ere are any furt
a140: 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  her.** attempts 
a150: 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73  to use that curs
a160: 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72  or.  Read cursor
a170: 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e  s remain open an
a180: 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61  d valid.** but a
a190: 72 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61  re "saved" in ca
a1a0: 73 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67  se the table pag
a1b0: 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f  es are moved aro
a1c0: 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  und..*/.void sql
a1d0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
a1e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
a1f0: 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e   tripCode){.  in
a200: 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61  t i;.  int inTra
a210: 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63  ns = 0;.  int sc
a220: 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73  hemaChange;.  as
a230: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a240: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
a250: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
a260: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
a270: 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  c();..  /* Obtai
a280: 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74  n all b-tree mut
a290: 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69  exes before maki
a2a0: 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20  ng any calls to 
a2b0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e  BtreeRollback().
a2c0: 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69   .  ** This is i
a2d0: 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65  mportant in case
a2e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
a2f0: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
a300: 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69  ck has.  ** modi
a310: 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
a320: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65  e schema. If the
a330: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20   b-tree mutexes 
a340: 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20  are not taken.  
a350: 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e  ** here, then an
a360: 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
a370: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69  he connection mi
a380: 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74  ght sneak in bet
a390: 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61  ween.  ** the da
a3a0: 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20  tabase rollback 
a3b0: 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74  and schema reset
a3c0: 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73  , which can caus
a3d0: 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72  e false.  ** cor
a3e0: 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20  ruption reports 
a3f0: 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20  in some cases.  
a400: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
a410: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
a420: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20   schemaChange = 
a430: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
a440: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
a450: 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69  s)!=0 && db->ini
a460: 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f  t.busy==0;..  fo
a470: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; i++){.    Btre
a490: 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69  e *p = db->aDb[i
a4a0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
a4b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
a4c0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
a4d0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
a4e0: 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20    inTrans = 1;. 
a4f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a500: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
a510: 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21  k(p, tripCode, !
a520: 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20  schemaChange);. 
a530: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
a540: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64  e3VtabRollback(d
a550: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  b);.  sqlite3End
a560: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a570: 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67  .  if( (db->flag
a580: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
a590: 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62  hanges)!=0 && db
a5a0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
a5b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
a5c0: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
a5d0: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73  ments(db);.    s
a5e0: 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
a5f0: 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
a600: 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  n(db);.  }.  sql
a610: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
a620: 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79  l(db);..  /* Any
a630: 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
a640: 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20  aint violations 
a650: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
a660: 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d  solved. */.  db-
a670: 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
a680: 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72   0;.  db->nDefer
a690: 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
a6a0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
a6b0: 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
a6c0: 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61  ..  /* If one ha
a6d0: 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  s been configure
a6e0: 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f  d, invoke the ro
a6f0: 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c  llback-hook call
a700: 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62  back */.  if( db
a710: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
a720: 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20  ack && (inTrans 
a730: 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  || !db->autoComm
a740: 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  it) ){.    db->x
a750: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
a760: 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72  (db->pRollbackAr
a770: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  g);.  }.}../*.**
a780: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
a790: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
a7a0: 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72  ng the name corr
a7b0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
a7c0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73   error code.** s
a7d0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
a7e0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66  argument..*/.#if
a7f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a800: 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63  NEED_ERR_NAME).c
a810: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
a820: 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63  e3ErrName(int rc
a830: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
a840: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *zName = 0;.  in
a850: 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63  t i, origRc = rc
a860: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  ;.  for(i=0; i<2
a870: 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b   && zName==0; i+
a880: 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a  +, rc &= 0xff){.
a890: 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29      switch( rc )
a8a0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  {.      case SQL
a8b0: 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20  ITE_OK:         
a8c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a8d0: 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20  "SQLITE_OK";    
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a8f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a900: 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20  LITE_ERROR:     
a910: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a920: 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b   "SQLITE_ERROR";
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a940: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a950: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20  QLITE_INTERNAL: 
a960: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a970: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  = "SQLITE_INTERN
a980: 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  AL";          br
a990: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a9a0: 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20  SQLITE_PERM:    
a9b0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a9c0: 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22   = "SQLITE_PERM"
a9d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
a9e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a9f0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20   SQLITE_ABORT:  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
aa10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
aa20: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  T";             
aa30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aa40: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  e SQLITE_ABORT_R
aa50: 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61  OLLBACK:     zNa
aa60: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
aa70: 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20  RT_ROLLBACK";   
aa80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aa90: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20  se SQLITE_BUSY: 
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
aab0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
aac0: 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SY";            
aad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aae0: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
aaf0: 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a  RECOVERY:      z
ab00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
ab10: 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20  USY_RECOVERY";  
ab20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ab30: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
ab40: 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20  _SNAPSHOT:      
ab50: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ab60: 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20  BUSY_SNAPSHOT"; 
ab70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ab80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
ab90: 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20  KED:            
aba0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
abb0: 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20  _LOCKED";       
abc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
abd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
abe0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
abf0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
ac00: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
ac10: 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20  ACHE";break;.   
ac20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
ac30: 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20  OMEM:           
ac40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ac50: 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  TE_NOMEM";      
ac60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ac70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ac80: 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20  READONLY:       
ac90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aca0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20  ITE_READONLY";  
acb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
acc0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
acd0: 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45  _READONLY_RECOVE
ace0: 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  RY:  zName = "SQ
acf0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45  LITE_READONLY_RE
ad00: 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a  COVERY"; break;.
ad10: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad20: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c  E_READONLY_CANTL
ad30: 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  OCK:  zName = "S
ad40: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
ad50: 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b  ANTLOCK"; break;
ad60: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ad70: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
ad80: 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  BACK:  zName = "
ad90: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
ada0: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
adb0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
adc0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
add0: 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OVED:   zName = 
ade0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
adf0: 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61  _DBMOVED";  brea
ae00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae10: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20  LITE_INTERRUPT: 
ae20: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ae30: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55   "SQLITE_INTERRU
ae40: 50 54 22 3b 20 20 20 20 20 20 20 20 20 62 72 65  PT";         bre
ae50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae60: 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20  QLITE_IOERR:    
ae70: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ae80: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22  = "SQLITE_IOERR"
ae90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
aea0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aeb0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
aec0: 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  D:         zName
aed0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
aee0: 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20 20 62  _READ";        b
aef0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
af00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
af10: 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d  ORT_READ:   zNam
af20: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
af30: 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20  R_SHORT_READ";  
af40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
af50: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  e SQLITE_IOERR_W
af60: 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61  RITE:        zNa
af70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
af80: 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20  RR_WRITE";      
af90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
afa0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
afb0: 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e  FSYNC:        zN
afc0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
afd0: 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20  ERR_FSYNC";     
afe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aff0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b000: 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a  _DIR_FSYNC:    z
b010: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b020: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b  OERR_DIR_FSYNC";
b030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b040: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b050: 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20  R_TRUNCATE:     
b060: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b070: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b  IOERR_TRUNCATE";
b080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b090: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b0a0: 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20  RR_FSTAT:       
b0b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b0c0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20  _IOERR_FSTAT";  
b0d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b0e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b0f0: 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20  ERR_UNLOCK:     
b100: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b110: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b  E_IOERR_UNLOCK";
b120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b130: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b140: 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20  OERR_RDLOCK:    
b150: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b160: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22  TE_IOERR_RDLOCK"
b170: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b180: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b190: 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20  IOERR_DELETE:   
b1a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b1b0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b1c0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b1d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b1e0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20  _IOERR_NOMEM:   
b1f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b200: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
b210: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b220: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b230: 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20  E_IOERR_ACCESS: 
b240: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b250: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
b260: 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  SS";      break;
b270: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b280: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
b290: 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20  SERVEDLOCK:.    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b2c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b2d0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
b2e0: 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OCK"; break;.   
b2f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b300: 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20  OERR_LOCK:      
b310: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b320: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20  TE_IOERR_LOCK"; 
b330: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b340: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b350: 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20  IOERR_CLOSE:    
b360: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b370: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22  ITE_IOERR_CLOSE"
b380: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b390: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b3a0: 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
b3b0: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
b3c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
b3d0: 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a  LOSE";   break;.
b3e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b3f0: 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a  E_IOERR_SHMOPEN:
b400: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b410: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
b420: 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  PEN";     break;
b430: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b440: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
b450: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b460: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b470: 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b  SIZE";     break
b480: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b490: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43  ITE_IOERR_SHMLOC
b4a0: 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  K:      zName = 
b4b0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b4c0: 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61  MLOCK";     brea
b4d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b4e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
b4f0: 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  P:       zName =
b500: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b510: 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65  HMMAP";      bre
b520: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b530: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
b540: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
b550: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b560: 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72  SEEK";        br
b570: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b580: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
b590: 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65  ETE_NOENT: zName
b5a0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b5b0: 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62  _DELETE_NOENT";b
b5c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b5d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d   SQLITE_IOERR_MM
b5e0: 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AP:         zNam
b5f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b600: 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20  R_MMAP";        
b610: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b620: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  e SQLITE_IOERR_G
b630: 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61  ETTEMPPATH:  zNa
b640: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b650: 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b  RR_GETTEMPPATH";
b660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b670: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b680: 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e  CONVPATH:     zN
b690: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b6a0: 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20  ERR_CONVPATH";  
b6b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b6c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
b6d0: 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  PT:            z
b6e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b6f0: 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ORRUPT";        
b700: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b710: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
b720: 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20  UPT_VTAB:       
b730: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b740: 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20  CORRUPT_VTAB";  
b750: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b760: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
b770: 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20  FOUND:          
b780: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b790: 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20  _NOTFOUND";     
b7a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b7b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
b7c0: 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
b7d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b7e0: 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20  E_FULL";        
b7f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b800: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b810: 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20  ANTOPEN:        
b820: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b830: 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20  TE_CANTOPEN";   
b840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b850: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b860: 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44  CANTOPEN_NOTEMPD
b870: 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  IR: zName = "SQL
b880: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54  ITE_CANTOPEN_NOT
b890: 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20  EMPDIR";break;. 
b8a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b8b0: 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a  _CANTOPEN_ISDIR:
b8c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b8d0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
b8e0: 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  DIR";    break;.
b8f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b900: 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
b910: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
b920: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
b930: 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  ULLPATH"; break;
b940: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b950: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56  TE_CANTOPEN_CONV
b960: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
b970: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b980: 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b  CONVPATH"; break
b990: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b9a0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20  ITE_PROTOCOL:   
b9b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b9c0: 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  "SQLITE_PROTOCOL
b9d0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
b9e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b9f0: 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20  LITE_EMPTY:     
ba00: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
ba10: 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b   "SQLITE_EMPTY";
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
ba30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ba40: 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20  QLITE_SCHEMA:   
ba50: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ba60: 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  = "SQLITE_SCHEMA
ba70: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
ba80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba90: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20  SQLITE_TOOBIG:  
baa0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bab0: 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49   = "SQLITE_TOOBI
bac0: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  G";            b
bad0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bae0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
baf0: 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  NT:         zNam
bb00: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
bb10: 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20  TRAINT";        
bb20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bb30: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
bb40: 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61  INT_UNIQUE:  zNa
bb50: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
bb60: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b  STRAINT_UNIQUE";
bb70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bb80: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
bb90: 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e  AINT_TRIGGER: zN
bba0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
bbb0: 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
bbc0: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
bbd0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bbe0: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
bbf0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bc20: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
bc30: 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61  EIGNKEY";   brea
bc40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bc50: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bc60: 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d  CHECK:   zName =
bc70: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bc80: 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65  INT_CHECK";  bre
bc90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bca0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bcb0: 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20  _PRIMARYKEY:.   
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bce0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
bcf0: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
bd00: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
bd10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bd20: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
bd30: 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  LL: zName = "SQL
bd40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
bd50: 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20  OTNULL";break;. 
bd60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bd70: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
bd80: 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20  ITHOOK:.        
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bdb0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
bdc0: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20  NT_COMMITHOOK"; 
bdd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bde0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bdf0: 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a  RAINT_VTAB:    z
be00: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
be10: 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b  ONSTRAINT_VTAB";
be20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
be30: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
be40: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a  TRAINT_FUNCTION:
be50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
be80: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
be90: 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  TION";     break
bea0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
beb0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
bec0: 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  OWID:   zName = 
bed0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
bee0: 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61  NT_ROWID";  brea
bef0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bf00: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20  LITE_MISMATCH:  
bf10: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bf20: 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43   "SQLITE_MISMATC
bf30: 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  H";          bre
bf40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bf50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20  QLITE_MISUSE:   
bf60: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bf70: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  = "SQLITE_MISUSE
bf80: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
bf90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bfa0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20  SQLITE_NOLFS:   
bfb0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bfc0: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   = "SQLITE_NOLFS
bfd0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
bfe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bff0: 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20   SQLITE_AUTH:   
c000: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c010: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48  e = "SQLITE_AUTH
c020: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
c030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c040: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c060: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52  me = "SQLITE_FOR
c070: 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  MAT";           
c080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c090: 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a  se SQLITE_RANGE:
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c0b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41  ame = "SQLITE_RA
c0c0: 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  NGE";           
c0d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c0e0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  ase SQLITE_NOTAD
c0f0: 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  B:             z
c100: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c110: 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20  OTADB";         
c120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c130: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a  case SQLITE_ROW:
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c160: 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROW";           
c170: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c180: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
c190: 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ICE:            
c1a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c1b0: 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20  _NOTICE";       
c1c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c1d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c1e0: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c  TICE_RECOVER_WAL
c1f0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
c200: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
c210: 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20  _WAL";break;.   
c220: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c230: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
c240: 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20  LLBACK:.        
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c270: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
c280: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22  ECOVER_ROLLBACK"
c290: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
c2a0: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
c2b0: 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  NG:            z
c2c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
c2d0: 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20  ARNING";        
c2e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c2f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
c300: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20  ING_AUTOINDEX:  
c310: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c320: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
c330: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  X"; break;.     
c340: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e   case SQLITE_DON
c350: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
c360: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c370: 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20  _DONE";         
c380: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c390: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  }.  }.  if( zNam
c3a0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e==0 ){.    stat
c3b0: 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  ic char zBuf[50]
c3c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
c3d0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
c3e0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49  uf), zBuf, "SQLI
c3f0: 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c  TE_UNKNOWN(%d)",
c400: 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e   origRc);.    zN
c410: 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a  ame = zBuf;.  }.
c420: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
c430: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c440: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
c450: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
c460: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
c470: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
c480: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
c490: 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ment..*/.const c
c4a0: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53  har *sqlite3ErrS
c4b0: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74  tr(int rc){.  st
c4c0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a  atic const char*
c4d0: 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20   const aMsg[] = 
c4e0: 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  {.    /* SQLITE_
c4f0: 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22  OK          */ "
c500: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20  not an error",. 
c510: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52     /* SQLITE_ERR
c520: 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c  OR       */ "SQL
c530: 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20   logic error or 
c540: 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65  missing database
c550: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c560: 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20  _INTERNAL    */ 
c570: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
c580: 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20  _PERM        */ 
c590: 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69  "access permissi
c5a0: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
c5b0: 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  /* SQLITE_ABORT 
c5c0: 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61        */ "callba
c5d0: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
c5e0: 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f  ry abort",.    /
c5f0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20  * SQLITE_BUSY   
c600: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
c610: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
c620: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b    /* SQLITE_LOCK
c630: 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  ED      */ "data
c640: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
c650: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
c660: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20  LITE_NOMEM      
c670: 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f   */ "out of memo
c680: 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ry",.    /* SQLI
c690: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a  TE_READONLY    *
c6a0: 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72  / "attempt to wr
c6b0: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
c6c0: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
c6d0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
c6e0: 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70  T   */ "interrup
c6f0: 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ted",.    /* SQL
c700: 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20  ITE_IOERR       
c710: 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72  */ "disk I/O err
c720: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
c730: 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a  TE_CORRUPT     *
c740: 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b  / "database disk
c750: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
c760: 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  med",.    /* SQL
c770: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20  ITE_NOTFOUND    
c780: 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72  */ "unknown oper
c790: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53  ation",.    /* S
c7a0: 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20  QLITE_FULL      
c7b0: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f    */ "database o
c7c0: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c  r disk is full",
c7d0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
c7e0: 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75  ANTOPEN    */ "u
c7f0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
c800: 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20  tabase file",.  
c810: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54    /* SQLITE_PROT
c820: 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b  OCOL    */ "lock
c830: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20  ing protocol",. 
c840: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50     /* SQLITE_EMP
c850: 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62  TY       */ "tab
c860: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  le contains no d
c870: 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ata",.    /* SQL
c880: 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20  ITE_SCHEMA      
c890: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68  */ "database sch
c8a0: 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
c8b0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c8c0: 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22  TOOBIG      */ "
c8d0: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74  string or blob t
c8e0: 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20  oo big",.    /* 
c8f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c900: 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e  T  */ "constrain
c910: 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f  t failed",.    /
c920: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  * SQLITE_MISMATC
c930: 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70  H    */ "datatyp
c940: 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20  e mismatch",.   
c950: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53   /* SQLITE_MISUS
c960: 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61  E      */ "libra
c970: 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65  ry routine calle
c980: 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63  d out of sequenc
c990: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
c9a0: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
c9b0: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
c9c0: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
c9d0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c9e0: 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20  _AUTH        */ 
c9f0: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64  "authorization d
ca00: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
ca10: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20  QLITE_FORMAT    
ca20: 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20    */ "auxiliary 
ca30: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
ca40: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
ca50: 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20  QLITE_RANGE     
ca60: 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f    */ "bind or co
ca70: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
ca80: 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a  f range",.    /*
ca90: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20   SQLITE_NOTADB  
caa0: 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20      */ "file is 
cab0: 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20  encrypted or is 
cac0: 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c  not a database",
cad0: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
cae0: 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e  ar *zErr = "unkn
caf0: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77  own error";.  sw
cb00: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
cb10: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
cb20: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20  T_ROLLBACK: {.  
cb30: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72      zErr = "abor
cb40: 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43  t due to ROLLBAC
cb50: 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  K";.      break;
cb60: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
cb70: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26  lt: {.      rc &
cb80: 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66  = 0xff;.      if
cb90: 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20  ( ALWAYS(rc>=0) 
cba0: 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28  && rc<ArraySize(
cbb0: 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63  aMsg) && aMsg[rc
cbc0: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
cbd0: 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b  zErr = aMsg[rc];
cbe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
cbf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
cc00: 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d    return zErr;.}
cc10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
cc20: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
cc30: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
cc40: 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20  that sleeps and 
cc50: 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75  tries.** again u
cc60: 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76  ntil a timeout v
cc70: 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e  alue is reached.
cc80: 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61    The timeout va
cc90: 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74  lue is.** an int
cca0: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d  eger number of m
ccb0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73  illiseconds pass
ccc0: 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72  ed in as the fir
ccd0: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  st.** argument..
cce0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
ccf0: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
cd00: 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a  allback(. void *
cd10: 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
cd20: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
cd30: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e  onnection */. in
cd40: 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20  t count         
cd50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cd60: 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20   of times table 
cd70: 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f  has been busy */
cd80: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
cd90: 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53  S_WIN || HAVE_US
cda0: 4c 45 45 50 0a 20 20 73 74 61 74 69 63 20 63 6f  LEEP.  static co
cdb0: 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20  nst u8 delays[] 
cdc0: 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35  =.     { 1, 2, 5
cdd0: 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35  , 10, 15, 20, 25
cde0: 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20  , 25,  25,  50, 
cdf0: 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74   50, 100 };.  st
ce00: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f  atic const u8 to
ce10: 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  tals[] =.     { 
ce20: 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c  0, 1, 3,  8, 18,
ce30: 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33   33, 53, 78, 103
ce40: 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20  , 128, 178, 228 
ce50: 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c  };.# define NDEL
ce60: 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c  AY ArraySize(del
ce70: 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  ays).  sqlite3 *
ce80: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
ce90: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
cea0: 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d  ut = db->busyTim
ceb0: 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61  eout;.  int dela
cec0: 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73  y, prior;..  ass
ced0: 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b  ert( count>=0 );
cee0: 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e  .  if( count < N
cef0: 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c  DELAY ){.    del
cf00: 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e  ay = delays[coun
cf10: 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  t];.    prior = 
cf20: 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20  totals[count];. 
cf30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61   }else{.    dela
cf40: 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41  y = delays[NDELA
cf50: 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  Y-1];.    prior 
cf60: 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d  = totals[NDELAY-
cf70: 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e  1] + delay*(coun
cf80: 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20  t-(NDELAY-1));. 
cf90: 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b   }.  if( prior +
cfa0: 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74   delay > timeout
cfb0: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
cfc0: 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b  timeout - prior;
cfd0: 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d  .    if( delay<=
cfe0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
cff0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
d000: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c  ep(db->pVfs, del
d010: 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75  ay*1000);.  retu
d020: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71  rn 1;.#else.  sq
d030: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
d040: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
d050: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71  t timeout = ((sq
d060: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
d070: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28  syTimeout;.  if(
d080: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
d090: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
d0a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d0b0: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
d0c0: 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30  db->pVfs, 100000
d0d0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
d0e0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
d0f0: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
d100: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a   busy handler..*
d110: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d120: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
d130: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61   an operation fa
d140: 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b  iled with a lock
d150: 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  ..** If this rou
d160: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
d170: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
d180: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
d190: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
d1a0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
d1b0: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
d1c0: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
d1d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
d1e0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
d1f0: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29  (BusyHandler *p)
d200: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
d210: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c  ( NEVER(p==0) ||
d220: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20   p->xFunc==0 || 
d230: 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74  p->nBusy<0 ) ret
d240: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d  urn 0;.  rc = p-
d250: 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20  >xFunc(p->pArg, 
d260: 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28  p->nBusy);.  if(
d270: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d   rc==0 ){.    p-
d280: 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d  >nBusy = -1;.  }
d290: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  else{.    p->nBu
d2a0: 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sy++;.  }.  retu
d2b0: 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn rc; .}../*.**
d2c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
d2d0: 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ts the busy call
d2e0: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
d2f0: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
d300: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
d310: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
d320: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
d330: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
d340: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
d350: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
d360: 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  b,.  int (*xBusy
d370: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20  )(void*,int),.  
d380: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69  void *pArg.){.#i
d390: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d3a0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
d3b0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
d3c0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
d3d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
d3e0: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
d3f0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d400: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
d410: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
d420: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
d430: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
d440: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
d450: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
d460: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
d470: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
d480: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
d490: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
d4a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
d4b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d4c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d4d0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
d4e0: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
d4f0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
d500: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
d510: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
d520: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
d530: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
d540: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
d550: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
d560: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
d570: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
d580: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
d590: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
d5a0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
d5b0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
d5c0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
d5d0: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
d5e0: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
d5f0: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
d600: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66  oid *pArg.){.#if
d610: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d620: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
d630: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
d640: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
d650: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
d660: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
d670: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
d680: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
d690: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d6a0: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
d6b0: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
d6c0: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
d6d0: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
d6e0: 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73  ogressOps = (uns
d6f0: 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20  igned)nOps;.    
d700: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
d710: 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65   = pArg;.  }else
d720: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
d730: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ess = 0;.    db-
d740: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
d750: 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  0;.    db->pProg
d760: 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d  ressArg = 0;.  }
d770: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d780: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
d790: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
d7a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d7b0: 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61   installs a defa
d7c0: 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ult busy handler
d7d0: 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20   that waits for 
d7e0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
d7f0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
d800: 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72  seconds before r
d810: 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69  eturning 0..*/.i
d820: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
d830: 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20  timeout(sqlite3 
d840: 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69  *db, int ms){.#i
d850: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d860: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
d870: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
d880: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
d890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
d8a0: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
d8b0: 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20  .  if( ms>0 ){. 
d8c0: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
d8d0: 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69  handler(db, sqli
d8e0: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
d8f0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62  lback, (void*)db
d900: 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54  );.    db->busyT
d910: 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d  imeout = ms;.  }
d920: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
d930: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
d940: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  b, 0, 0);.  }.  
d950: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d960: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65  ;.}../*.** Cause
d970: 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65   any pending ope
d980: 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61  ration to stop a
d990: 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f  t its earliest o
d9a0: 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76  pportunity..*/.v
d9b0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  oid sqlite3_inte
d9c0: 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64  rrupt(sqlite3 *d
d9d0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
d9e0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
d9f0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
da00: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
da10: 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20  b) && (db==0 || 
da20: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
da30: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20  E_MAGIC_ZOMBIE) 
da40: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
da50: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
da60: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
da70: 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31  .#endif.  db->u1
da80: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
da90: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
daa0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
dab0: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
dac0: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
dad0: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
dae0: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
daf0: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
db00: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
db10: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
db20: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
db30: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
db40: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
db50: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
db60: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
db70: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
db80: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
db90: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
dba0: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
dbb0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
dbc0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
dbd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
dbe0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
dbf0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
dc00: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
dc10: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
dc20: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
dc30: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
dc40: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
dc50: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
dc60: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
dc70: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
dc80: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
dc90: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
dca0: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46  3_context*),.  F
dcb0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
dcc0: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
dcd0: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
dce0: 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65  t nName;.  int e
dcf0: 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73  xtraFlags;..  as
dd00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
dd10: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
dd20: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75  ex) );.  if( zFu
dd30: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c  nctionName==0 ||
dd40: 0a 20 20 20 20 20 20 28 78 53 46 75 6e 63 20 26  .      (xSFunc &
dd50: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
dd60: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
dd70: 21 78 53 46 75 6e 63 20 26 26 20 28 78 46 69 6e  !xSFunc && (xFin
dd80: 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c  al && !xStep)) |
dd90: 7c 0a 20 20 20 20 20 20 28 21 78 53 46 75 6e 63  |.      (!xSFunc
dda0: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
ddb0: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
ddc0: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
ddd0: 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  g>SQLITE_MAX_FUN
dde0: 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20  CTION_ARG) ||.  
ddf0: 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20      (255<(nName 
de00: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
de10: 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  0( zFunctionName
de20: 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ))) ){.    retur
de30: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
de40: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  BKPT;.  }..  ass
de50: 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
de60: 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54  _CONSTANT==SQLIT
de70: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
de80: 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20  );.  extraFlags 
de90: 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f  = enc &  SQLITE_
dea0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20  DETERMINISTIC;. 
deb0: 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f   enc &= (SQLITE_
dec0: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c  FUNC_ENCMASK|SQL
ded0: 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66  ITE_ANY);.  .#if
dee0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
def0: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
df00: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
df10: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
df20: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
df30: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
df40: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
df50: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
df60: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
df70: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
df80: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
df90: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
dfa0: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
dfb0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
dfc0: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
dfd0: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
dfe0: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
dff0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
e000: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
e010: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
e020: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
e030: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
e040: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
e050: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
e060: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
e070: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
e080: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
e090: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
e0a0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
e0b0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
e0c0: 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73  _UTF8|extraFlags
e0d0: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
e0e0: 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53  Data, xSFunc, xS
e0f0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
e100: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69  structor);.    i
e110: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e120: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
e130: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
e140: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
e150: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
e160: 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c  _UTF16LE|extraFl
e170: 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ags,.          p
e180: 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63  UserData, xSFunc
e190: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
e1a0: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
e1b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
e1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e1d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e1e0: 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53     }.    enc = S
e1f0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
e200: 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d   }.#else.  enc =
e210: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
e220: 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ndif.  .  /* Che
e230: 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ck if an existin
e240: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  g function is be
e250: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f  ing overridden o
e260: 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f  r deleted. If so
e270: 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65  ,.  ** and there
e280: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
e290: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   then return SQL
e2a0: 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66  ITE_BUSY. If a f
e2b0: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
e2c0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
e2d0: 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65  /deleted but the
e2e0: 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
e2f0: 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a   VMs, allow the.
e300: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74    ** operation t
e310: 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69  o continue but i
e320: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
e330: 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
e340: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  ents..  */.  p =
e350: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
e360: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
e370: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75  onName, nArg, (u
e380: 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  8)enc, 0);.  if(
e390: 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c   p && (p->funcFl
e3a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
e3b0: 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20  C_ENCMASK)==enc 
e3c0: 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  && p->nArg==nArg
e3d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
e3e0: 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20  nVdbeActive ){. 
e3f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e400: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
e410: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
e420: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
e430: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72  lete/modify user
e440: 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f  -function due to
e450: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
e460: 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ts");.      asse
e470: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
e480: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
e490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
e4a0: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
e4b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
e4c0: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
e4d0: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  nts(db);.    }. 
e4e0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
e4f0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
e500: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
e510: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
e520: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c  1);.  assert(p |
e530: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e540: 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  ed);.  if( !p ){
e550: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e560: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
e570: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f   }..  /* If an o
e580: 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20  lder version of 
e590: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  the function wit
e5a0: 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20 64  h a configured d
e5b0: 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20 2a  estructor is.  *
e5c0: 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  * being replaced
e5d0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
e5e0: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
e5f0: 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74  here. */.  funct
e600: 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70  ionDestroy(db, p
e610: 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 72  );..  if( pDestr
e620: 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65  uctor ){.    pDe
e630: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b  structor->nRef++
e640: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70 44 65  ;.  }.  p->u.pDe
e650: 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74  structor = pDest
e660: 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e  ructor;.  p->fun
e670: 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e  cFlags = (p->fun
e680: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
e690: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20  FUNC_ENCMASK) | 
e6a0: 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74 65  extraFlags;.  te
e6b0: 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63 46  stcase( p->funcF
e6c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45  lags & SQLITE_DE
e6d0: 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20  TERMINISTIC );. 
e6e0: 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78 53 46   p->xSFunc = xSF
e6f0: 75 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a 20 78  unc ? xSFunc : x
e700: 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61  Step;.  p->xFina
e710: 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20  lize = xFinal;. 
e720: 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20   p->pUserData = 
e730: 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e  pUserData;.  p->
e740: 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67  nArg = (u16)nArg
e750: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e760: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
e770: 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20 66  reate new user f
e780: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  unctions..*/.int
e790: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
e7a0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
e7b0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
e7c0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
e7d0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
e7e0: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
e7f0: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
e800: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e810: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e820: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e830: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
e840: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e850: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e860: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
e870: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e880: 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  t*).){.  return 
e890: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e8a0: 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  unction_v2(db, z
e8b0: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
e8c0: 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65   p, xSFunc, xSte
e8d0: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30         xFinal, 0
e900: 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  );.}..int sqlite
e910: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
e920: 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  n_v2(.  sqlite3 
e930: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
e940: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
e950: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
e960: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
e970: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
e980: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
e990: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
e9a0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
e9b0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
e9c0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e9d0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
e9e0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
e9f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
ea00: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
ea10: 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20  oy)(void *).){. 
ea20: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ea30: 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65  _ERROR;.  FuncDe
ea40: 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d  structor *pArg =
ea50: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
ea60: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
ea70: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
ea80: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
ea90: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
eaa0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
eab0: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
eac0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ead0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
eae0: 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f  );.  if( xDestro
eaf0: 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20  y ){.    pArg = 
eb00: 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20  (FuncDestructor 
eb10: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
eb20: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
eb30: 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29  (FuncDestructor)
eb40: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72 67  );.    if( !pArg
eb50: 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73 74 72   ){.      xDestr
eb60: 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74  oy(p);.      got
eb70: 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  o out;.    }.   
eb80: 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20   pArg->xDestroy 
eb90: 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20  = xDestroy;.    
eba0: 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20  pArg->pUserData 
ebb0: 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = p;.  }.  rc = 
ebc0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
ebd0: 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  c(db, zFunc, nAr
ebe0: 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e  g, enc, p, xSFun
ebf0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
ec00: 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70  , pArg);.  if( p
ec10: 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65  Arg && pArg->nRe
ec20: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
ec30: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
ec40: 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f  K );.    xDestro
ec50: 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  y(p);.    sqlite
ec60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 72 67  3DbFree(db, pArg
ec70: 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20  );.  }.. out:.  
ec80: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
ec90: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
eca0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ecb0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
ecc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
ecd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ece0: 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c  IT_UTF16.int sql
ecf0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
ed00: 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
ed10: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76  3 *db,.  const v
ed20: 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  oid *zFunctionNa
ed30: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
ed40: 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
ed50: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
ed60: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
ed70: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
ed80: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
ed90: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
eda0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
edb0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
edc0: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
edd0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
ede0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
edf0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
ee00: 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65   *zFunc8;..#ifde
ee10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ee20: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
ee30: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
ee40: 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75  eckOk(db) || zFu
ee50: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20  nctionName==0 ) 
ee60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
ee70: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
ee80: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
ee90: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
eea0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
eeb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
eec0: 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71  );.  zFunc8 = sq
eed0: 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
eee0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
eef0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31   -1, SQLITE_UTF1
ef00: 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d  6NATIVE);.  rc =
ef10: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
ef20: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e  nc(db, zFunc8, n
ef30: 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70  Arg, eTextRep, p
ef40: 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c 78  , xSFunc,xStep,x
ef50: 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69  Final,0);.  sqli
ef60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46  te3DbFree(db, zF
ef70: 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71  unc8);.  rc = sq
ef80: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
ef90: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
efa0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
efb0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
efc0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a   rc;.}.#endif...
efd0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68  /*.** Declare th
efe0: 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  at a function ha
eff0: 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65  s been overloade
f000: 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74  d by a virtual t
f010: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
f020: 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65  he function alre
f030: 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20  ady exists as a 
f040: 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66  regular global f
f050: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a  unction, then.**
f060: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
f070: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68   a no-op.  If th
f080: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
f090: 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
f0a0: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
f0b0: 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20  one that always 
f0c0: 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d  throws a run-tim
f0d0: 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a  e error.  .**.**
f0e0: 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61   When virtual ta
f0f0: 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70  bles intend to p
f100: 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f  rovide an overlo
f110: 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74  aded function, t
f120: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61  hey.** should ca
f130: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
f140: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
f150: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
f160: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c   exists..** A gl
f170: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75  obal function mu
f180: 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65  st exist in orde
f190: 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c  r for name resol
f1a0: 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a  ution to work.**
f1b0: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e   properly..*/.in
f1c0: 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  t sqlite3_overlo
f1d0: 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ad_function(.  s
f1e0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
f1f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
f200: 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20  .  int nArg.){. 
f210: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f220: 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  _OK;..#ifdef SQL
f230: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f240: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f250: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f260: 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30  (db) || zName==0
f270: 20 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20   || nArg<-2 ){. 
f280: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f290: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f2a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
f2b0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f2c0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
f2d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
f2e0: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
f2f0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
f300: 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  8, 0)==0 ){.    
f310: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
f320: 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65  teFunc(db, zName
f330: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
f340: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TF8,.           
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  0, sqlite3Invali
f370: 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  dFunction, 0, 0,
f380: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   0);.  }.  rc = 
f390: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
f3a0: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
f3b0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
f3c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
f3d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
f3e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
f3f0: 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ACE./*.** Regist
f400: 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74  er a trace funct
f410: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
f420: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
f430: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72  ly registered tr
f440: 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ace.** is return
f450: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
f460: 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f  LL trace functio
f470: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
f480: 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75  tracing is execu
f490: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
f4a0: 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70  .** trace is a p
f4b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
f4c0: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
f4d0: 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72  oked at the star
f4e0: 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c  t of each.** SQL
f4f0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 23   statement..*/.#
f500: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f510: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 76 6f  IT_DEPRECATED.vo
f520: 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63  id *sqlite3_trac
f530: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
f540: 6f 69 64 28 2a 78 54 72 61 63 65 29 28 76 6f 69  oid(*xTrace)(voi
f550: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c  d*,const char*),
f560: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
f570: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66  void *pOld;..#if
f580: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f590: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f5a0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f5b0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
f5c0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
f5d0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
f5e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
f5f0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f600: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f610: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
f620: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a   db->pTraceArg;.
f630: 20 20 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 78    db->mTrace = x
f640: 54 72 61 63 65 20 3f 20 53 51 4c 49 54 45 5f 54  Trace ? SQLITE_T
f650: 52 41 43 45 5f 4c 45 47 41 43 59 20 3a 20 30 3b  RACE_LEGACY : 0;
f660: 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
f670: 28 69 6e 74 28 2a 29 28 75 33 32 2c 76 6f 69 64  (int(*)(u32,void
f680: 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 29 78  *,void*,void*))x
f690: 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72  Trace;.  db->pTr
f6a0: 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  aceArg = pArg;. 
f6b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f6c0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
f6d0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
f6e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f6f0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
f700: 45 44 20 2a 2f 0a 0a 2f 2a 20 52 65 67 69 73 74  ED */../* Regist
f710: 65 72 20 61 20 74 72 61 63 65 20 63 61 6c 6c 62  er a trace callb
f720: 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20 76 65  ack using the ve
f730: 72 73 69 6f 6e 2d 32 20 69 6e 74 65 72 66 61 63  rsion-2 interfac
f740: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
f750: 33 5f 74 72 61 63 65 5f 76 32 28 0a 20 20 73 71  3_trace_v2(.  sq
f760: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 63           /* Trac
f790: 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
f7a0: 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  n */.  unsigned 
f7b0: 6d 54 72 61 63 65 2c 20 20 20 20 20 20 20 20 20  mTrace,         
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 76 65    /* Mask of eve
f7e0: 6e 74 73 20 74 6f 20 62 65 20 74 72 61 63 65 64  nts to be traced
f7f0: 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 54 72 61 63   */.  int(*xTrac
f800: 65 29 28 75 6e 73 69 67 6e 65 64 2c 76 6f 69 64  e)(unsigned,void
f810: 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 29 2c 20  *,void*,void*), 
f820: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20   /* Callback to 
f830: 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 76 6f 69 64  invoke */.  void
f840: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
f870: 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  t */.){.#ifdef S
f880: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f890: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f8a0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f8b0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
f8c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
f8d0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
f8e0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f8f0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f900: 74 65 78 29 3b 0a 20 20 69 66 28 20 6d 54 72 61  tex);.  if( mTra
f910: 63 65 3d 3d 30 20 29 20 78 54 72 61 63 65 20 3d  ce==0 ) xTrace =
f920: 20 30 3b 0a 20 20 69 66 28 20 78 54 72 61 63 65   0;.  if( xTrace
f930: 3d 3d 30 20 29 20 6d 54 72 61 63 65 20 3d 20 30  ==0 ) mTrace = 0
f940: 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65 20 3d  ;.  db->mTrace =
f950: 20 6d 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 78   mTrace;.  db->x
f960: 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a  Trace = xTrace;.
f970: 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20    db->pTraceArg 
f980: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
f990: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
f9a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
f9b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f9c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f9d0: 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
f9e0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
f9f0: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
fa00: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
fa10: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
fa20: 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20   registered .** 
fa30: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
fa40: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
fa50: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f  **.** A NULL pro
fa60: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  file function me
fa70: 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66  ans that no prof
fa80: 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  iling is execute
fa90: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
faa0: 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70  * profile is a p
fab0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
fac0: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
fad0: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
fae0: 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63  lusion of.** eac
faf0: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
fb00: 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  that is run..*/.
fb10: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
fb20: 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  ofile(.  sqlite3
fb30: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78   *db,.  void (*x
fb40: 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63  Profile)(void*,c
fb50: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
fb60: 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e_uint64),.  voi
fb70: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69  d *pArg.){.  voi
fb80: 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
fb90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
fba0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
fbb0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
fbc0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
fbd0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
fbe0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
fbf0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
fc00: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
fc10: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
fc20: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
fc30: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20  ->pProfileArg;. 
fc40: 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20   db->xProfile = 
fc50: 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e  xProfile;.  db->
fc60: 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41  pProfileArg = pA
fc70: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
fc80: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
fc90: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
fca0: 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Old;.}.#endif /*
fcb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
fcc0: 52 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69  RECATED */.#endi
fcd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
fce0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
fcf0: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
fd00: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
fd10: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
fd20: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
fd30: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
fd40: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
fd50: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
fd60: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
fd70: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
fd80: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
fd90: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
fda0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdc0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
fdd0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
fde0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
fdf0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
fe00: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
fe10: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
fe20: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
fe30: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
fe40: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
fe50: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
fe60: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
fe70: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
fe80: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
fe90: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
fea0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
feb0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
fec0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
fed0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
fee0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
fef0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ff00: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
ff10: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f    pOld = db->pCo
ff20: 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78  mmitArg;.  db->x
ff30: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d  CommitCallback =
ff40: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
ff50: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70  ->pCommitArg = p
ff60: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
ff70: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ff80: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
ff90: 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pOld;.}../*.** R
ffa0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
ffb0: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
ffc0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
ffd0: 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
ffe0: 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
fff0: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
10000 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
10010 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
10020 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
10030 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10050 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
10060 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
10070 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
10080 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
10090 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c  nt,char const *,
100a0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c  char const *,sql
100b0 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  ite_int64),.  vo
100c0 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
100d0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
100e0 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
100f0 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
10100 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20   *pRet;..#ifdef 
10110 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
10120 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
10130 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10140 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
10150 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
10160 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
10170 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
10180 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
10190 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
101a0 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
101b0 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  >pUpdateArg;.  d
101c0 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
101d0 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
101e0 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67    db->pUpdateArg
101f0 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
10200 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10210 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10220 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
10230 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
10240 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
10250 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
10260 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10270 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62  rolled.** back b
10280 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
10290 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
102a0 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c  oid *sqlite3_rol
102b0 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71  lback_hook(.  sq
102c0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
102d0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
102e0 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
102f0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
10300 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
10310 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61  k)(void*), /* Ca
10320 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
10330 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10350 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
10360 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
10370 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a  .  void *pRet;..
10380 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10390 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
103a0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
103b0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
103c0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
103d0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
103e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
103f0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
10400 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10410 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
10420 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
10430 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
10440 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
10450 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
10460 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
10470 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
10480 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10490 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
104a0 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66   pRet;.}..#ifdef
104b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
104c0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
104d0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
104e0 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
104f0 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
10500 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
10510 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
10520 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
10530 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
10540 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
10550 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64   *sqlite3_preupd
10560 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
10570 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
10580 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
10590 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
105a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
105b0 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  oid(*xCallback)(
105c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
105d0 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
105e0 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74  .    void*,sqlit
105f0 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  e3*,int,char con
10600 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c  st*,char const*,
10610 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71  sqlite3_int64,sq
10620 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20  lite3_int64),.  
10630 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
10640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
10650 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75  st callback argu
10660 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  ment */.){.  voi
10670 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
10680 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10690 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
106a0 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61  t = db->pPreUpda
106b0 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  teArg;.  db->xPr
106c0 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  eUpdateCallback 
106d0 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
106e0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
106f0 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
10700 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10710 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10720 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
10730 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
10740 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
10750 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  OK */..#ifndef S
10760 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
10770 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
10780 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
10790 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
107a0 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  by sqlite3_wal_a
107b0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e  utocheckpoint().
107c0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  .** Invoke sqlit
107d0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
107e0 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t if the number 
107f0 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
10800 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20   log file.** is 
10810 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c  greater than sql
10820 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73  ite3.pWalArg cas
10830 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  t to an integer 
10840 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69  (the value confi
10850 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f  gured by.** wal_
10860 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
10870 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  )..*/ .int sqlit
10880 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
10890 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e  (.  void *pClien
108a0 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72  tData,     /* Ar
108b0 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  gument */.  sqli
108c0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
108d0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
108e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
108f0 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20   *zDb,       /* 
10900 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  Database */.  in
10910 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20  t nFrame        
10920 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10930 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  WAL */.){.  if( 
10940 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50  nFrame>=SQLITE_P
10950 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e  TR_TO_INT(pClien
10960 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71  tData) ){.    sq
10970 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
10980 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
10990 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
109a0 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
109b0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
109c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d  ignMalloc();.  }
109d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
109e0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
109f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
10a00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69   */../*.** Confi
10a10 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  gure an sqlite3_
10a20 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
10a30 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  ack to automatic
10a40 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a  ally checkpoint.
10a50 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66  ** a database af
10a60 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
10a70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
10a80 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65  there are nFrame
10a90 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d   or.** more fram
10aa0 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
10ab0 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f  le. Passing zero
10ac0 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76   or a negative v
10ad0 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e  alue as the.** n
10ae0 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20  Frame parameter 
10af0 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74  disables automat
10b00 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65  ic checkpoints e
10b10 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  ntirely..**.** T
10b20 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  he callback regi
10b30 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  stered by this f
10b40 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73  unction replaces
10b50 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61   any existing ca
10b60 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74  llback.** regist
10b70 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ered using sqlit
10b80 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c  e3_wal_hook(). L
10b90 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65  ikewise, registe
10ba0 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a  ring a callback.
10bb0 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
10bc0 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61  _wal_hook() disa
10bd0 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74  bles the automat
10be0 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65  ic checkpoint me
10bf0 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69  chanism.** confi
10c00 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75  gured by this fu
10c10 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
10c20 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
10c30 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
10c40 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d  3 *db, int nFram
10c50 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e){.#ifdef SQLIT
10c60 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55  E_OMIT_WAL.  UNU
10c70 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
10c80 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10c90 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23  METER(nFrame);.#
10ca0 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49  else.#ifdef SQLI
10cb0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10cc0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10cd0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10ce0 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
10cf0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10d00 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46  .#endif.  if( nF
10d10 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71  rame>0 ){.    sq
10d20 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
10d30 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  b, sqlite3WalDef
10d40 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45  aultHook, SQLITE
10d50 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61  _INT_TO_PTR(nFra
10d60 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  me));.  }else{. 
10d70 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
10d80 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ook(db, 0, 0);. 
10d90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
10da0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10db0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
10dc0 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
10dd0 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
10de0 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
10df0 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
10e00 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68  nto the write-ah
10e10 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20  ead-log by this 
10e20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
10e30 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
10e40 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a  lite3_wal_hook(.
10e50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e70 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
10e80 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20  hook to this db 
10e90 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28  handle */.  int(
10ea0 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
10eb0 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f   *, sqlite3*, co
10ec0 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c  nst char*, int),
10ed0 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
10f00 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78  ment passed to x
10f10 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b  Callback() */.){
10f20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10f30 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20  OMIT_WAL.  void 
10f40 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51  *pRet;.#ifdef SQ
10f50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
10f60 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
10f70 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
10f80 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
10f90 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
10fa0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
10fb0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
10fc0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10fd0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10fe0 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
10ff0 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
11000 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
11010 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
11020 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
11030 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
11040 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
11050 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
11060 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
11070 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
11080 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
11090 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
110a0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
110b0 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
110c0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
110e0 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
110f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11100 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
11110 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
11120 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
11130 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
11140 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
11170 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
11180 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
111b0 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
111c0 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
111d0 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
111e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
111f0 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
11200 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
11210 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
11220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11230 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
11240 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
11250 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
11280 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
11290 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
112a0 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
112b0 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
112c0 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
112d0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
112e0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
112f0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
11300 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
11310 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
11320 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
11330 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74  endif..  /* Init
11340 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75  ialize the outpu
11350 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d  t variables to -
11360 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  1 in case an err
11370 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
11380 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c  if( pnLog ) *pnL
11390 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  og = -1;.  if( p
113a0 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20  nCkpt ) *pnCkpt 
113b0 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  = -1;..  assert(
113c0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
113d0 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b  NT_PASSIVE==0 );
113e0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
113f0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
11400 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  L==1 );.  assert
11410 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
11420 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29  INT_RESTART==2 )
11430 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
11440 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
11450 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69  UNCATE==3 );.  i
11460 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f  f( eMode<SQLITE_
11470 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
11480 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49  VE || eMode>SQLI
11490 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
114a0 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a  UNCATE ){.    /*
114b0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
114c0 30 33 39 39 36 2d 31 32 30 38 38 20 54 68 65 20  03996-12088 The 
114d0 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  M parameter must
114e0 20 62 65 20 61 20 76 61 6c 69 64 20 63 68 65 63   be a valid chec
114f0 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f  kpoint.    ** mo
11500 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  de: */.    retur
11510 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
11520 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
11530 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
11540 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44  mutex);.  if( zD
11550 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20  b && zDb[0] ){. 
11560 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
11570 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
11580 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  Db);.  }.  if( i
11590 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  Db<0 ){.    rc =
115a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
115b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
115c0 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
115d0 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77  E_ERROR, "unknow
115e0 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c  n database: %s",
115f0 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   zDb);.  }else{.
11600 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64      db->busyHand
11610 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
11620 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
11630 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44  heckpoint(db, iD
11640 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  b, eMode, pnLog,
11650 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71   pnCkpt);.    sq
11660 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
11670 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  c);.  }.  rc = s
11680 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
11690 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  , rc);..  /* If 
116a0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
116b0 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2c 20  ive statements, 
116c0 63 6c 65 61 72 20 74 68 65 20 69 6e 74 65 72 72  clear the interr
116d0 75 70 74 20 66 6c 61 67 20 61 74 20 74 68 69 73  upt flag at this
116e0 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f  .  ** point.  */
116f0 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65  .  if( db->nVdbe
11700 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20  Active==0 ){.   
11710 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
11720 75 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a  upted = 0;.  }..
11730 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11740 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
11750 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
11760 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
11770 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
11780 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20  ase zDb. If zDb 
11790 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74  is NULL, or if t
117a0 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f  he buffer zDb po
117b0 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61  ints.** to conta
117c0 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  ins a zero-lengt
117d0 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74  h string, all at
117e0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
117f0 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f   are .** checkpo
11800 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inted..*/.int sq
11810 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
11820 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
11830 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
11840 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  b){.  /* EVIDENC
11850 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30  E-OF: R-41613-20
11860 35 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f  553 The sqlite3_
11870 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44  wal_checkpoint(D
11880 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ,X) is equivalen
11890 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  t to.  ** sqlite
118a0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
118b0 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43  _v2(D,X,SQLITE_C
118c0 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
118d0 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74  E,0,0). */.  ret
118e0 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  urn sqlite3_wal_
118f0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62  checkpoint_v2(db
11900 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43  ,zDb,SQLITE_CHEC
11910 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30  KPOINT_PASSIVE,0
11920 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ,0);.}..#ifndef 
11930 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
11940 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63  /*.** Run a chec
11950 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61  kpoint on databa
11960 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20  se iDb. This is 
11970 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62  a no-op if datab
11980 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f  ase iDb is.** no
11990 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
119a0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a   in WAL mode..**
119b0 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
119c0 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20  tion is open on 
119d0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
119e0 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c  ng checkpointed,
119f0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
11a00 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
11a10 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63  E_LOCKED and a c
11a20 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74  heckpoint is not
11a30 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a   attempted. If .
11a40 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
11a50 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67  rs while running
11a60 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c   the checkpoint,
11a70 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
11a80 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
11a90 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49  urned (i.e. SQLI
11aa0 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72  TE_IOERR). Other
11ab0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
11ac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
11ad0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
11ae0 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65  dle db should be
11af0 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c   held by the cal
11b00 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a  ler. The mutex.*
11b10 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
11b20 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62  h the specific b
11b30 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63  -tree being chec
11b40 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65  kpointed is take
11b50 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e  n by.** this fun
11b60 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20  ction while the 
11b70 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75  checkpoint is ru
11b80 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nning..**.** If 
11b90 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51  iDb is passed SQ
11ba0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
11bb0 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61  D, then all atta
11bc0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
11bd0 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  re.** checkpoint
11be0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
11bf0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
11c00 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d  t is returned im
11c10 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e  mediately -.** n
11c20 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
11c30 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  e to checkpoint 
11c40 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61  any remaining da
11c50 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50  tabases..**.** P
11c60 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69  arameter eMode i
11c70 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  s one of SQLITE_
11c80 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
11c90 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54  VE, FULL or REST
11ca0 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ART..*/.int sqli
11cb0 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71  te3Checkpoint(sq
11cc0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
11cd0 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69  Db, int eMode, i
11ce0 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a  nt *pnLog, int *
11cf0 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72  pnCkpt){.  int r
11d00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11d20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
11d30 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d50 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
11d60 65 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68  e through attach
11d70 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20  ed dbs */.  int 
11d80 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20  bBusy = 0;      
11d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11da0 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55  rue if SQLITE_BU
11db0 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f  SY has been enco
11dc0 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73  untered */..  as
11dd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11de0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
11df0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11e00 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f   !pnLog || *pnLo
11e10 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72  g==-1 );.  asser
11e20 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70  t( !pnCkpt || *p
11e30 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20  nCkpt==-1 );..  
11e40 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
11e50 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  Db && rc==SQLITE
11e60 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  _OK; i++){.    i
11e70 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62  f( i==iDb || iDb
11e80 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
11e90 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72  ACHED ){.      r
11ea0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11eb0 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61  Checkpoint(db->a
11ec0 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65  Db[i].pBt, eMode
11ed0 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
11ee0 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20  ;.      pnLog = 
11ef0 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20  0;.      pnCkpt 
11f00 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
11f10 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
11f20 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20  {.        bBusy 
11f30 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
11f40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
11f50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
11f60 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
11f70 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79  LITE_OK && bBusy
11f80 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ) ? SQLITE_BUSY 
11f90 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  : rc;.}.#endif /
11fa0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
11fb0 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  L */../*.** This
11fc0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
11fd0 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d  s true if main-m
11fe0 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  emory should be 
11ff0 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  used instead of.
12000 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
12010 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e  ile for transien
12020 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e  t pager files an
12030 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  d statement jour
12040 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  nals..** The val
12050 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65  ue returned depe
12060 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
12070 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f   of db->temp_sto
12080 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70  re (runtime.** p
12090 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68  arameter) and th
120a0 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76  e compile time v
120b0 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54  alue of SQLITE_T
120c0 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a  EMP_STORE. The.*
120d0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  * following tabl
120e0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
120f0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74  relationship bet
12100 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76  ween these two v
12110 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69  alues.** and thi
12120 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  s functions retu
12130 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  rn value..**.** 
12140 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54    SQLITE_TEMP_ST
12150 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70  ORE     db->temp
12160 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74  _store     Locat
12170 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  ion of temporary
12180 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d   database.**   -
12190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121a0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
121b0 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
121c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
121d0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
12200 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
12210 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
12240 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
12250 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
12260 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
12270 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
12280 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
12290 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
122a0 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
122b0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
122d0 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
122e0 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
12320 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
12350 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
12360 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20  eturn 1).**   2 
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
12390 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
123a0 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
123b0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
123c0 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20         any      
123d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
123e0 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
123f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d  /.int sqlite3Tem
12400 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20  pInMemory(const 
12410 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
12420 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
12430 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20  ORE==1.  return 
12440 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
12450 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==2 );.#endif.#i
12460 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
12470 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20  ORE==2.  return 
12480 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
12490 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  !=1 );.#endif.#i
124a0 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
124b0 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f  ORE==3.  UNUSED_
124c0 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
124d0 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
124e0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
124f0 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c  P_STORE<1 || SQL
12500 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33  ITE_TEMP_STORE>3
12510 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12520 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72  TER(db);.  retur
12530 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
12540 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
12550 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  8 encoded Englis
12560 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
12570 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
12580 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
12590 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  or..*/.const cha
125a0 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  r *sqlite3_errms
125b0 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  g(sqlite3 *db){.
125c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
125d0 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
125e0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
125f0 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
12600 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  MEM_BKPT);.  }. 
12610 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
12620 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
12630 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
12640 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
12650 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  (SQLITE_MISUSE_B
12660 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  KPT);.  }.  sqli
12670 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
12680 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
12690 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
126a0 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71  ed ){.    z = sq
126b0 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
126c0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
126d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73    }else{.    tes
126e0 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d  tcase( db->pErr=
126f0 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63  =0 );.    z = (c
12700 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
12710 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72  ue_text(db->pErr
12720 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
12730 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12740 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30   );.    if( z==0
12750 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
12760 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
12770 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  errCode);.    }.
12780 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
12790 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
127a0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
127b0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
127c0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
127d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
127e0 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  16 encoded Engli
127f0 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
12800 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
12810 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
12820 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  ror..*/.const vo
12830 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  id *sqlite3_errm
12840 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62  sg16(sqlite3 *db
12850 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
12860 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d  t u16 outOfMem[]
12870 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75   = {.    'o', 'u
12880 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27  ', 't', ' ', 'o'
12890 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c  , 'f', ' ', 'm',
128a0 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20   'e', 'm', 'o', 
128b0 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b  'r', 'y', 0.  };
128c0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
128d0 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b  u16 misuse[] = {
128e0 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27  .    'l', 'i', '
128f0 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72  b', 'r', 'a', 'r
12900 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'y', ' ', .  
12910 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c    'r', 'o', 'u',
12920 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20   't', 'i', 'n', 
12930 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'e', ' ', .    '
12940 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c  c', 'a', 'l', 'l
12950 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27  ', 'e', 'd', ' '
12960 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c  , .    'o', 'u',
12970 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   't', ' ', .    
12980 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a  'o', 'f', ' ', .
12990 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71      's', 'e', 'q
129a0 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27  ', 'u', 'e', 'n'
129b0 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20  , 'c', 'e', 0.  
129c0 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  };..  const void
129d0 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
129e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
129f0 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
12a00 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
12a10 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
12a20 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
12a30 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d  return (void *)m
12a40 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  isuse;.  }.  sql
12a50 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12a60 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
12a70 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
12a80 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28  led ){.    z = (
12a90 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
12aa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
12ab0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
12ac0 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
12ad0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
12ae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
12af0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
12b00 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c  db->errCode, sql
12b10 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
12b20 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  rrCode));.      
12b30 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
12b40 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
12b50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  r);.    }.    /*
12b60 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
12b70 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
12b80 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
12b90 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12ba0 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  t16().    ** abo
12bb0 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ve. If this is t
12bc0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
12bd0 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
12be0 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f  ed flag needs to
12bf0 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72  .    ** be clear
12c00 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
12c10 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72  ing. Do this dir
12c20 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
12c30 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c  f via.    ** sql
12c40 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74  ite3ApiExit(), t
12c50 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20  o avoid setting 
12c60 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
12c70 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  dle error messag
12c80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
12c90 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72 28 64 62  lite3OomClear(db
12ca0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12cb0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12cc0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
12cd0 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
12ce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
12cf0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  16 */../*.** Ret
12d00 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
12d10 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67  ent error code g
12d20 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53  enerated by an S
12d30 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49  QLite routine. I
12d40 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73  f NULL is.** pas
12d50 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
12d60 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20  tion, we assume 
12d70 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  a malloc() faile
12d80 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  d during sqlite3
12d90 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _open()..*/.int 
12da0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
12db0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
12dc0 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
12dd0 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
12de0 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
12df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
12e00 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
12e10 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
12e20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12e30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12e40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
12e50 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
12e60 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72  errCode & db->er
12e70 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rMask;.}.int sql
12e80 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
12e90 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
12ea0 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
12eb0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
12ec0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
12ed0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12ee0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12ef0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
12f00 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
12f10 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
12f20 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12f30 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
12f40 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  n db->errCode;.}
12f50 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 73  .int sqlite3_sys
12f60 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c 69 74 65  tem_errno(sqlite
12f70 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
12f80 20 64 62 20 3f 20 64 62 2d 3e 69 53 79 73 45 72   db ? db->iSysEr
12f90 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a 2f 2a  rno : 0;.}  ../*
12fa0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
12fb0 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
12fc0 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
12fd0 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
12fe0 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
12ff0 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69  t.  For now, thi
13000 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74  s simply calls t
13010 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69  he internal sqli
13020 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66  te3ErrStr().** f
13030 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  unction..*/.cons
13040 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
13050 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a  errstr(int rc){.
13060 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
13070 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f  ErrStr(rc);.}../
13080 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
13090 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  w collating func
130a0 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73  tion for databas
130b0 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d  e "db".  The nam
130c0 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e  e is zName.** an
130d0 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  d the encoding i
130e0 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  s enc..*/.static
130f0 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61   int createColla
13100 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
13110 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   db,.  const cha
13120 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20  r *zName, .  u8 
13130 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74  enc,.  void* pCt
13140 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
13150 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
13160 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
13170 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
13180 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
13190 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
131a0 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32  Coll;.  int enc2
131b0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
131c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
131d0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
131e0 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
131f0 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
13200 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
13210 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
13220 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
13230 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
13240 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
13250 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
13260 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
13270 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
13280 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
13290 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
132a0 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63  ally..  */.  enc
132b0 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63  2 = enc;.  testc
132c0 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
132d0 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73  E_UTF16 );.  tes
132e0 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
132f0 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
13300 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  D );.  if( enc2=
13310 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c  =SQLITE_UTF16 ||
13320 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
13330 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20  F16_ALIGNED ){. 
13340 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45     enc2 = SQLITE
13350 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
13360 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c  }.  if( enc2<SQL
13370 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32  ITE_UTF8 || enc2
13380 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  >SQLITE_UTF16BE 
13390 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
133a0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
133b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
133c0 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
133d0 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
133e0 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
133f0 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
13400 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
13410 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
13420 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
13430 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
13440 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
13450 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
13460 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
13470 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
13480 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
13490 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
134a0 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
134b0 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  nc2, zName, 0);.
134c0 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
134d0 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
134e0 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
134f0 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
13500 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
13510 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
13520 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
13530 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
13540 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
13550 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
13560 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
13570 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
13580 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
13590 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
135a0 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
135b0 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
135c0 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
135d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
135e0 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
135f0 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
13600 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
13610 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
13620 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
13630 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
13640 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
13650 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
13660 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
13670 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
13680 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
13690 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
136a0 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
136b0 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
136c0 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
136d0 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
136e0 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
136f0 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
13700 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
13710 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
13720 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
13730 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
13740 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
13750 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
13760 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  zName);.      in
13770 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
13780 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
13790 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
137a0 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
137b0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
137c0 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
137d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
137e0 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
137f0 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
13800 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
13810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
13820 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
13830 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13840 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
13850 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
13860 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
13870 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
13880 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
13890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
138a0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 43 6f 6c  MEM_BKPT;.  pCol
138b0 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61  l->xCmp = xCompa
138c0 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73  re;.  pColl->pUs
138d0 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f  er = pCtx;.  pCo
138e0 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b  ll->xDel = xDel;
138f0 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20  .  pColl->enc = 
13900 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63  (u8)(enc2 | (enc
13910 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f   & SQLITE_UTF16_
13920 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c  ALIGNED));.  sql
13930 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
13940 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75  LITE_OK);.  retu
13950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13960 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
13970 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
13980 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
13990 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
139a0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
139b0 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
139c0 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
139d0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
139e0 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
139f0 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
13a00 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
13a10 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
13a20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13a30 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
13a40 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
13a50 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
13a60 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
13a70 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
13a80 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
13a90 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
13aa0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
13ab0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
13ac0 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
13ad0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
13ae0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
13af0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
13b00 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
13b10 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20  ARIABLE_NUMBER, 
13b20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
13b30 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20  8091-32352 */.  
13b40 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
13b50 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  ER_DEPTH,.  SQLI
13b60 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
13b70 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  READS,.};../*.**
13b80 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68   Make sure the h
13b90 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73  ard limits are s
13ba0 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65  et to reasonable
13bb0 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53   values.*/.#if S
13bc0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13bd0 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
13be0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d  ITE_MAX_LENGTH m
13bf0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
13c00 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
13c10 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
13c20 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
13c30 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
13c40 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
13c50 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
13c60 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13c70 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c  X_SQL_LENGTH>SQL
13c80 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
13c90 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13ca0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
13cb0 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72  t not be greater
13cc0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58   than SQLITE_MAX
13cd0 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23  _LENGTH.#endif.#
13ce0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
13cf0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a  MPOUND_SELECT<2.
13d00 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13d10 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
13d20 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  CT must be at le
13d30 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66  ast 2.#endif.#if
13d40 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
13d50 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53  _OP<40.# error S
13d60 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
13d70 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  P must be at lea
13d80 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66  st 40.#endif.#if
13d90 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
13da0 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51  TION_ARG<0 || SQ
13db0 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
13dc0 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65 72 72 6f  N_ARG>127.# erro
13dd0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
13de0 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
13df0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
13e00 31 32 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  127.#endif.#if S
13e10 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13e20 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
13e30 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a  AX_ATTACHED>125.
13e40 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13e50 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
13e60 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
13e70 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66  d 125.#endif.#if
13e80 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
13e90 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c  _PATTERN_LENGTH<
13ea0 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
13eb0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
13ec0 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  N_LENGTH must be
13ed0 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
13ee0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13ef0 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23  X_COLUMN>32767.#
13f00 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13f10 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f  X_COLUMN must no
13f20 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23  t exceed 32767.#
13f30 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13f40 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
13f50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
13f60 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
13f70 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74  DEPTH must be at
13f80 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
13f90 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
13fa0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20  ORKER_THREADS<0 
13fb0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  || SQLITE_MAX_WO
13fc0 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a  RKER_THREADS>50.
13fd0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13fe0 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
13ff0 53 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  S must be betwee
14000 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69  n 0 and 50.#endi
14010 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
14020 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
14030 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74  limit.  Report t
14040 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a  he old value..**
14050 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c   If an invalid l
14060 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75  imit index is su
14070 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d  pplied, report -
14080 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  1..** Make no ch
14090 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20  anges but still 
140a0 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  report the old v
140b0 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  alue if the.** n
140c0 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  ew limit is nega
140d0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  tive..**.** A ne
140e0 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f  w lower limit do
140f0 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78  es not shrink ex
14100 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74  isting construct
14110 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  s..** It merely 
14120 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e  prevents new con
14130 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63  structs that exc
14140 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a  eed the limit.**
14150 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a   from forming..*
14160 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  /.int sqlite3_li
14170 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
14180 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e   int limitId, in
14190 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69  t newLimit){.  i
141a0 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69  nt oldLimit;..#i
141b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
141c0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
141d0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
141e0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
141f0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
14200 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
14210 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
14220 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56  .#endif..  /* EV
14230 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31  IDENCE-OF: R-301
14240 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63  89-54097 For eac
14250 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79  h limit category
14260 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41   SQLITE_LIMIT_NA
14270 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ME.  ** there is
14280 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f   a hard upper bo
14290 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69  und set at compi
142a0 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70  le-time by a C p
142b0 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a  reprocessor.  **
142c0 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51   macro called SQ
142d0 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28  LITE_MAX_NAME. (
142e0 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e  The "_LIMIT_" in
142f0 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61   the name is cha
14300 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d  nged to.  ** "_M
14310 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73  AX_".).  */.  as
14320 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
14330 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
14340 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
14350 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  X_LENGTH );.  as
14360 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
14370 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  [SQLITE_LIMIT_SQ
14380 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  L_LENGTH]==SQLIT
14390 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
143a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
143b0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
143c0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53  LIMIT_COLUMN]==S
143d0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
143e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
143f0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
14400 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
14410 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  ]==SQLITE_MAX_EX
14420 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  PR_DEPTH );.  as
14430 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
14440 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
14450 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d  MPOUND_SELECT]==
14460 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
14470 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61  UND_SELECT);.  a
14480 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
14490 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
144a0 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f  DBE_OP]==SQLITE_
144b0 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20  MAX_VDBE_OP );. 
144c0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
144d0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
144e0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d  _FUNCTION_ARG]==
144f0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
14500 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73  ION_ARG );.  ass
14510 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14520 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
14530 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ACHED]==SQLITE_M
14540 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20  AX_ATTACHED );. 
14550 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14560 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14570 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
14580 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20  NGTH]==.        
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
145c0 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
145d0 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
145e0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
145f0 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
14600 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c  BLE_NUMBER]==SQL
14610 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
14620 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65  _NUMBER);.  asse
14630 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
14640 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
14650 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  GER_DEPTH]==SQLI
14660 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
14670 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
14680 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
14690 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
146a0 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54  _THREADS]==SQLIT
146b0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
146c0 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74  EADS );.  assert
146d0 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  ( SQLITE_LIMIT_W
146e0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28  ORKER_THREADS==(
146f0 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31  SQLITE_N_LIMIT-1
14700 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d  ) );...  if( lim
14710 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49  itId<0 || limitI
14720 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  d>=SQLITE_N_LIMI
14730 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
14740 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d  -1;.  }.  oldLim
14750 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  it = db->aLimit[
14760 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20  limitId];.  if( 
14770 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20  newLimit>=0 ){  
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36   /* IMP: R-52476
147a0 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66  -28732 */.    if
147b0 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64  ( newLimit>aHard
147c0 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29  Limit[limitId] )
147d0 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74  {.      newLimit
147e0 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69   = aHardLimit[li
147f0 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a  mitId];  /* IMP:
14800 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a   R-51463-25634 *
14810 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  /.    }.    db->
14820 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
14830 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
14840 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
14850 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
14860 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
14870 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a  -53341-35419 */.
14880 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
14890 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
148a0 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49  o parse both URI
148b0 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69  s and non-URI fi
148c0 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62  lenames passed b
148d0 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f  y the.** user to
148e0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73   API functions s
148f0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72  qlite3_open() or
14900 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
14910 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61  (), and for data
14920 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65  base.** URIs spe
14930 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f  cified as part o
14940 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65  f ATTACH stateme
14950 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nts..**.** The f
14960 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
14970 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
14980 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
14990 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72  e VFS to use (or
149a0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69  .** a NULL to si
149b0 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c  gnify the defaul
149c0 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52  t VFS) if the UR
149d0 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  I does not conta
149e0 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a  in a "vfs=xxx".*
149f0 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
14a00 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  r. The second ar
14a10 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  gument contains 
14a20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d  the URI (or non-
14a30 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a  URI filename).**
14a40 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68   itself. When th
14a50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14a60 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67  alled the *pFlag
14a70 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c  s variable shoul
14a80 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65  d contain.** the
14a90 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74   default flags t
14aa0 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
14ab0 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e  ase handle with.
14ac0 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   The value store
14ad0 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20  d in.** *pFlags 
14ae0 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62  may be updated b
14af0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
14b00 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e  if the URI filen
14b10 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  ame contains .**
14b20 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20   "cache=xxx" or 
14b30 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79  "mode=xxx" query
14b40 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a   parameters..**.
14b50 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
14b60 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
14b70 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
14b80 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20   case *ppVfs is 
14b90 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
14ba0 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20  ** the VFS that 
14bb0 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74  should be used t
14bc0 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
14bd0 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c  ase file. *pzFil
14be0 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70  e is set to.** p
14bf0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
14c00 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
14c10 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
14c20 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20   to open. It is 
14c30 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
14c40 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
14c50 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14c60 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ly call sqlite3_
14c70 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73  free() to releas
14c80 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
14c90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
14ca0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
14cb0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
14cc0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
14cd0 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a  d and *pzErrMsg.
14ce0 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  ** may be set to
14cf0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14d00 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
14d10 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
14d20 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  e error .** mess
14d30 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
14d40 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14d50 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
14d60 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
14d70 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
14d80 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
14d90 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69  te3_free()..*/.i
14da0 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  nt sqlite3ParseU
14db0 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ri(.  const char
14dc0 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20   *zDefaultVfs,  
14dd0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
14de0 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78  use if no "vfs=x
14df0 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e  xx" query option
14e00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
14e10 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20   *zUri,         
14e20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
14e30 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70  minated URI to p
14e40 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  arse */.  unsign
14e50 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20  ed int *pFlags, 
14e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
14e70 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e  OUT: SQLITE_OPEN
14e80 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
14e90 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70  sqlite3_vfs **pp
14ea0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
14eb0 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75  /* OUT: VFS to u
14ec0 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a  se */ .  char **
14ed0 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  pzFile,         
14ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
14ef0 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e   Filename compon
14f00 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20  ent of URI */.  
14f10 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65  /* OUT: Error me
14f40 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51  ssage (if rc!=SQ
14f50 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20  LITE_OK) */.){. 
14f60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14f70 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  _OK;.  unsigned 
14f80 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c  int flags = *pFl
14f90 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ags;.  const cha
14fa0 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75  r *zVfs = zDefau
14fb0 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a  ltVfs;.  char *z
14fc0 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a  File;.  char c;.
14fd0 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c    int nUri = sql
14fe0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72  ite3Strlen30(zUr
14ff0 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  i);..  assert( *
15000 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a  pzErrMsg==0 );..
15010 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20    if( ((flags & 
15020 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15040 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33 32 32  IMP: R-48725-322
15050 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  06 */.          
15060 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62    || sqlite3Glob
15070 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72  alConfig.bOpenUr
15080 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36  i) /* IMP: R-516
15090 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20 26  89-46548 */.   &
150a0 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d  & nUri>=5 && mem
150b0 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a  cmp(zUri, "file:
150c0 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a  ", 5)==0 /* IMP:
150d0 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20 2a   R-57884-37496 *
150e0 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20  /.  ){.    char 
150f0 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65  *zOpt;.    int e
15100 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
15110 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
15120 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61  er state when pa
15130 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20  rsing URI */.   
15140 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20   int iIn;       
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15160 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65  * Input characte
15170 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
15180 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20  nt iOut = 0;    
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
151a0 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72  Output character
151b0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75 36   index */.    u6
151c0 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32  4 nByte = nUri+2
151d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
151e0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
151f0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
15200 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
15210 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  he SQLITE_OPEN_U
15220 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  RI flag is set t
15230 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68  o indicate to th
15240 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20  e VFS xOpen .   
15250 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20   ** method that 
15260 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74  there may be ext
15270 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  ra parameters fo
15280 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  llowing the file
15290 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66  -name.  */.    f
152a0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
152b0 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f  PEN_URI;..    fo
152c0 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72  r(iIn=0; iIn<nUr
152d0 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20  i; iIn++) nByte 
152e0 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27  += (zUri[iIn]=='
152f0 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  &');.    zFile =
15300 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
15310 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  4(nByte);.    if
15320 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
15330 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
15340 4b 50 54 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20  KPT;..    iIn = 
15350 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  5;.#ifdef SQLITE
15360 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f  _ALLOW_URI_AUTHO
15370 52 49 54 59 0a 20 20 20 20 69 66 28 20 73 74 72  RITY.    if( str
15380 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f  ncmp(zUri+5, "//
15390 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  /", 3)==0 ){.   
153a0 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
153b0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
153c0 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61 75  ng condition cau
153d0 73 65 73 20 55 52 49 73 20 77 69 74 68 20 66 69  ses URIs with fi
153e0 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61  ve leading / cha
153f0 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a  racters.      **
15400 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f 2f   like file://///
15410 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65 20  host/path to be 
15420 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 55  converted into U
15430 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74 2f  NCs like //host/
15440 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 54  path..      ** T
15450 68 65 20 63 6f 72 72 65 63 74 20 55 52 49 20 66  he correct URI f
15460 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61 73 20  or that UNC has 
15470 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75 72  only two or four
15480 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72 61   leading / chara
15490 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66  cters.      ** f
154a0 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68 20  ile://host/path 
154b0 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73 74  or file:////host
154c0 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c 65  /path.  But 5 le
154d0 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69 73  ading slashes is
154e0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d   a .      ** com
154f0 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61 72  mon error, we ar
15500 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68 61  e told, so we ha
15510 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73 70 65  ndle it as a spe
15520 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20  cial case. */.  
15530 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
15540 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20 33  zUri+7, "///", 3
15550 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20 7d  )==0 ){ iIn++; }
15560 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
15570 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22  trncmp(zUri+5, "
15580 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20 31  //localhost/", 1
15590 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  2)==0 ){.      i
155a0 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a 23  In = 16;.    }.#
155b0 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69 73 63  else.    /* Disc
155c0 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61  ard the scheme a
155d0 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67  nd authority seg
155e0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49  ments of the URI
155f0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72  . */.    if( zUr
15600 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72  i[5]=='/' && zUr
15610 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i[6]=='/' ){.   
15620 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
15630 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
15640 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
15650 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='/' ) iIn++;.  
15660 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26      if( iIn!=7 &
15670 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65  & (iIn!=16 || me
15680 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22  mcmp("localhost"
15690 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20  , &zUri[7], 9)) 
156a0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
156b0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
156c0 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
156d0 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25  uri authority: %
156e0 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .*s", .         
156f0 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b     iIn-7, &zUri[
15700 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  7]);.        rc 
15710 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
15720 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
15730 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
15740 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
15750 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
15760 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61  e filename and a
15770 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ny query paramet
15780 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69  ers into the zFi
15790 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  le buffer. .    
157a0 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73  ** Decode %HH es
157b0 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67  cape codes along
157c0 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a   the way. .    *
157d0 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20  *.    ** Within 
157e0 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61  this loop, varia
157f0 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62  ble eState may b
15800 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72  e set to 0, 1 or
15810 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20   2, depending.  
15820 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73    ** on the pars
15830 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20  ing context. As 
15840 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a  follows:.    **.
15850 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73      **   0: Pars
15860 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20  ing file-name.. 
15870 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69     **   1: Parsi
15880 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20  ng name section 
15890 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20  of a name=value 
158a0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
158b0 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72  .    **   2: Par
158c0 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69  sing value secti
158d0 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
158e0 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
158f0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65  er..    */.    e
15900 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77  State = 0;.    w
15910 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
15920 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
15930 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b  #' ){.      iIn+
15940 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
15950 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73  '%' .       && s
15960 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
15970 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20  Uri[iIn]) .     
15980 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
15990 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d  igit(zUri[iIn+1]
159a0 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
159b0 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20      int octet = 
159c0 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74  (sqlite3HexToInt
159d0 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c  (zUri[iIn++]) <<
159e0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74   4);.        oct
159f0 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78  et += sqlite3Hex
15a00 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
15a10 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  ]);..        ass
15a20 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26  ert( octet>=0 &&
15a30 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20   octet<256 );.  
15a40 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d        if( octet=
15a50 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
15a60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 52 49 5f  LITE_ENABLE_URI_
15a70 30 30 5f 45 52 52 4f 52 0a 20 20 20 20 20 20 20  00_ERROR.       
15a80 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
15a90 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
15aa0 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69  "%00" appears wi
15ab0 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e  thin the URI. In
15ac0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
15ad0 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72  ** case we ignor
15ae0 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68  e all text in th
15af0 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
15b00 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72  he path, name or
15b10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
15b20 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  lue currently be
15b30 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69  ing parsed. So i
15b40 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  gnore the curren
15b50 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20  t character.    
15b60 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69        ** and ski
15b70 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f  p to the next "?
15b80 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61  ", "=" or "&", a
15b90 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a  s appropriate. *
15ba0 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  /.          whil
15bb0 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e  e( (c = zUri[iIn
15bc0 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20  ])!=0 && c!='#' 
15bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
15be0 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20  & (eState!=0 || 
15bf0 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20  c!='?').        
15c00 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
15c10 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26  !=1 || (c!='=' &
15c20 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20  & c!='&')).     
15c30 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
15c40 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27  ate!=2 || c!='&'
15c50 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
15c60 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b             iIn++
15c70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15c80 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15c90 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
15ca0 20 20 2f 2a 20 49 66 20 45 4e 41 42 4c 45 5f 55    /* If ENABLE_U
15cb0 52 49 5f 30 30 5f 45 52 52 4f 52 20 69 73 20 64  RI_00_ERROR is d
15cc0 65 66 69 6e 65 64 2c 20 22 25 30 30 22 20 69 6e  efined, "%00" in
15cd0 20 61 20 55 52 49 20 69 73 20 61 6e 20 65 72 72   a URI is an err
15ce0 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  or. */.         
15cf0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
15d00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e  ite3_mprintf("un
15d10 65 78 70 65 63 74 65 64 20 25 25 30 30 20 69 6e  expected %%00 in
15d20 20 75 72 69 22 29 3b 0a 20 20 20 20 20 20 20 20   uri");.        
15d30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
15d40 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ROR;.          g
15d50 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
15d60 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t;.#endif.      
15d70 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
15d80 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c  octet;.      }el
15d90 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31  se if( eState==1
15da0 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63   && (c=='&' || c
15db0 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  =='=') ){.      
15dc0 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74    if( zFile[iOut
15dd0 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1]==0 ){.      
15de0 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20      /* An empty 
15df0 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e  option name. Ign
15e00 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ore this option 
15e10 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20  altogether. */. 
15e20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
15e30 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
15e40 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a  i[iIn]!='#' && z
15e50 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20  Uri[iIn-1]!='&' 
15e60 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ) iIn++;.       
15e70 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
15e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15e90 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20  f( c=='&' ){.   
15ea0 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75         zFile[iOu
15eb0 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
15ec0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15ed0 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32        eState = 2
15ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15ef0 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
15f00 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61   }else if( (eSta
15f10 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29  te==0 && c=='?')
15f20 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26   || (eState==2 &
15f30 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20  & c=='&') ){.   
15f40 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
15f50 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a      eState = 1;.
15f60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
15f70 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b  ile[iOut++] = c;
15f80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
15f90 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65  State==1 ) zFile
15fa0 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
15fb0 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
15fc0 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
15fd0 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
15fe0 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  \0';..    /* Che
15ff0 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ck if there were
16000 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65   any options spe
16010 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75  cified that shou
16020 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  ld be interprete
16030 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20  d .    ** here. 
16040 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  Options that are
16050 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72   interpreted her
16060 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20  e include "vfs" 
16070 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20  and those that. 
16080 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
16090 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d   to flags that m
160a0 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ay be passed to 
160b0 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  the sqlite3_open
160c0 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74  _v2().    ** met
160d0 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74  hod. */.    zOpt
160e0 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65   = &zFile[sqlite
160f0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
16100 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
16110 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zOpt[0] ){.     
16120 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69   int nOpt = sqli
16130 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
16140 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
16150 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74  Val = &zOpt[nOpt
16160 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  +1];.      int n
16170 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Val = sqlite3Str
16180 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20  len30(zVal);..  
16190 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20      if( nOpt==3 
161a0 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c  && memcmp("vfs",
161b0 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a   zOpt, 3)==0 ){.
161c0 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a          zVfs = z
161d0 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Val;.      }else
161e0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
161f0 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20   OpenMode {.    
16200 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
16210 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69   *z;.          i
16220 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  nt mode;.       
16230 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20   } *aMode = 0;. 
16240 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f         char *zMo
16250 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  deType = 0;.    
16260 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30      int mask = 0
16270 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69  ;.        int li
16280 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  mit = 0;..      
16290 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26    if( nOpt==5 &&
162a0 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c   memcmp("cache",
162b0 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a   zOpt, 5)==0 ){.
162c0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
162d0 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
162e0 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20   aCacheMode[] = 
162f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
16300 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54  "shared",  SQLIT
16310 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
16320 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
16330 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53    { "private", S
16340 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
16350 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  TECACHE },.     
16360 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
16370 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
16380 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
16390 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
163a0 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50  DCACHE|SQLITE_OP
163b0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b  EN_PRIVATECACHE;
163c0 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
163d0 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20   = aCacheMode;. 
163e0 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
163f0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20   mask;.         
16400 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61   zModeType = "ca
16410 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  che";.        }.
16420 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
16430 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d  ==4 && memcmp("m
16440 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d  ode", zOpt, 4)==
16450 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
16460 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
16470 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b  nMode aOpenMode[
16480 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
16490 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54    { "ro",  SQLIT
164a0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
164b0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
164c0 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "rw",  SQLITE_O
164d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c  PEN_READWRITE },
164e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
164f0 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50  "rwc", SQLITE_OP
16500 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
16510 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16520 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
16530 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c   { "memory", SQL
16540 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20  ITE_OPEN_MEMORY 
16550 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
16560 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
16570 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
16580 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
16590 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51  EN_READONLY | SQ
165a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
165b0 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ITE.            
165c0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
165d0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
165e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
165f0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
16600 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20  e = aOpenMode;. 
16610 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
16620 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20   mask & flags;. 
16630 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
16640 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20  pe = "access";. 
16650 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
16660 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20    if( aMode ){. 
16670 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
16680 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
16690 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
166a0 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65    for(i=0; aMode
166b0 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20  [i].z; i++){.   
166c0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
166d0 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69  har *z = aMode[i
166e0 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ].z;.           
166f0 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74   if( nVal==sqlit
16700 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26  e3Strlen30(z) &&
16710 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c   0==memcmp(zVal,
16720 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20   z, nVal) ){.   
16730 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20             mode 
16740 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b  = aMode[i].mode;
16750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
16760 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
16770 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
16780 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f            if( mo
16790 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
167a0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
167b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
167c0 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64  ("no such %s mod
167d0 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70  e: %s", zModeTyp
167e0 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
167f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16800 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
16810 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
16820 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
16830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
16840 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49  f( (mode & ~SQLI
16850 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e  TE_OPEN_MEMORY)>
16860 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  limit ){.       
16870 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
16880 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
16890 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c  ("%s mode not al
168a0 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20  lowed: %s",.    
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a      zModeType, z
168e0 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
168f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45    rc = SQLITE_PE
16900 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RM;.            
16910 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
16920 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
16930 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
16940 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b  = (flags & ~mask
16950 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  ) | mode;.      
16960 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
16970 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b     zOpt = &zVal[
16980 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a  nVal+1];.    }..
16990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69    }else{.    zFi
169a0 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
169b0 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20  loc64(nUri+2);. 
169c0 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
169d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
169e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66  MEM_BKPT;.    if
169f0 28 20 6e 55 72 69 20 29 7b 0a 20 20 20 20 20 20  ( nUri ){.      
16a00 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55  memcpy(zFile, zU
16a10 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7d  ri, nUri);.    }
16a20 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d  .    zFile[nUri]
16a30 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
16a40 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30  le[nUri+1] = '\0
16a50 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ';.    flags &= 
16a60 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  ~SQLITE_OPEN_URI
16a70 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20  ;.  }..  *ppVfs 
16a80 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
16a90 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
16aa0 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20  *ppVfs==0 ){.   
16ab0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
16ac0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
16ad0 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
16ae0 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  zVfs);.    rc = 
16af0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16b00 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  }. parse_uri_out
16b10 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
16b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
16b30 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29  ite3_free(zFile)
16b40 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b  ;.    zFile = 0;
16b50 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d  .  }.  *pFlags =
16b60 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c   flags;.  *pzFil
16b70 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74  e = zFile;.  ret
16b80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
16b90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
16ba0 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
16bb0 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61  opening a databa
16bc0 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a  se on behalf of.
16bd0 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
16be0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70  ) and sqlite3_op
16bf0 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61  en16(). The data
16c00 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a  base filename "z
16c10 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69  Filename"  .** i
16c20 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e  s UTF-8 encoded.
16c30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
16c40 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63  penDatabase(.  c
16c50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
16c60 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73  name, /* Databas
16c70 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38  e filename UTF-8
16c80 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71   encoded */.  sq
16c90 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
16ca0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
16cb0 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68  urned database h
16cc0 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67  andle */.  unsig
16cd0 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  ned int flags,  
16ce0 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c    /* Operational
16cf0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
16d00 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
16d10 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
16d20 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  e VFS to use */.
16d30 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
16d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16d50 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c       /* Store al
16d60 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68  located handle h
16d70 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ere */.  int rc;
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
16da0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
16db0 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20   isThreadsafe;  
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16dd0 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73  True for threads
16de0 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  afe connections 
16df0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e  */.  char *zOpen
16e00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16e10 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
16e20 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   argument to pas
16e30 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29  s to BtreeOpen()
16e40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   */.  char *zErr
16e50 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Msg = 0;        
16e60 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
16e70 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69  essage from sqli
16e80 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f  te3ParseUri() */
16e90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
16ea0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
16eb0 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29  .  if( ppDb==0 )
16ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
16ed0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
16ee0 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  if.  *ppDb = 0;.
16ef0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16f00 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
16f10 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
16f20 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
16f30 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
16f40 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c  #endif..  /* Onl
16f50 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65  y allow sensible
16f60 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
16f70 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61   bits in the fla
16f80 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20  gs argument.  . 
16f90 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72   ** Throw an err
16fa0 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65  or if any non-se
16fb0 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  nse combination 
16fc0 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a  is used.  If we.
16fd0 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63    ** do not bloc
16fe0 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e  k illegal combin
16ff0 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20  ations here, it 
17000 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20  could trigger.  
17010 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ** assert() stat
17020 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72  ements in deeper
17030 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62   layers.  Sensib
17040 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a  le combinations.
17050 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20    ** are:.  **. 
17060 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f   **  1:  SQLITE_
17070 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  OPEN_READONLY.  
17080 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f  **  2:  SQLITE_O
17090 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
170a0 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f  **  6:  SQLITE_O
170b0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
170c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
170d0 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  TE.  */.  assert
170e0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
170f0 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20  ADONLY  == 0x01 
17100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
17110 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
17120 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20  TE == 0x02 );.  
17130 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
17140 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d  PEN_CREATE    ==
17150 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63   0x04 );.  testc
17160 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
17170 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20  7))==0x02 ); /* 
17180 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65  READONLY */.  te
17190 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
171a0 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20  gs&7))==0x04 ); 
171b0 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a  /* READWRITE */.
171c0 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
171d0 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30  (flags&7))==0x40
171e0 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
171f0 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69   | CREATE */.  i
17200 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37  f( ((1<<(flags&7
17210 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b  )) & 0x46)==0 ){
17220 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17230 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20  TE_MISUSE_BKPT; 
17240 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37   /* IMP: R-65497
17250 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20  -44594 */.  }.. 
17260 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
17270 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
17280 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
17290 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
172a0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
172b0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
172c0 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
172d0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
172e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
172f0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
17300 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
17310 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
17320 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
17330 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
17340 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17350 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
17360 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
17370 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  & SQLITE_OPEN_PR
17380 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20  IVATECACHE ){.  
17390 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
173a0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
173b0 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CHE;.  }else if(
173c0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
173d0 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
173e0 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66  Enabled ){.    f
173f0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
17400 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
17410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
17420 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66  e harmful bits f
17430 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61  rom the flags pa
17440 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a  rameter.  **.  *
17450 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  * The SQLITE_OPE
17460 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51  N_NOMUTEX and SQ
17470 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
17480 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20  TEX flags were. 
17490 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69   ** dealt with i
174a0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
174b0 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69  ode block.  Besi
174c0 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f  des these, the o
174d0 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69  nly.  ** valid i
174e0 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73  nput flags for s
174f0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
17500 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   are SQLITE_OPEN
17510 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20  _READONLY,.  ** 
17520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17530 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  WRITE, SQLITE_OP
17540 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54  EN_CREATE, SQLIT
17550 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
17560 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  HE,.  ** SQLITE_
17570 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
17580 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65  E, and some rese
17590 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65  rved bits.  Sile
175a0 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
175b0 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
175c0 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
175d0 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
175e0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
175f0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
17600 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
17610 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
17620 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17630 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17650 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
17660 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
17670 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17680 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
17690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
176a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
176b0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
176c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
176d0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
176e0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
176f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17700 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17720 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
17730 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
17740 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17750 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
17760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17770 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
17780 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
17790 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
177a0 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
177b0 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
177c0 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
177d0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
177e0 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
177f0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
17800 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
17810 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
17820 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17830 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
17840 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74  e ){.    db->mut
17850 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
17860 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
17870 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
17880 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65      if( db->mute
17890 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x==0 ){.      sq
178a0 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
178b0 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20        db = 0;.  
178c0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
178d0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
178e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
178f0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
17900 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
17910 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62   0xff;.  db->nDb
17920 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69   = 2;.  db->magi
17930 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
17940 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62  _BUSY;.  db->aDb
17950 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
17960 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ;..  assert( siz
17970 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d  eof(db->aLimit)=
17980 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d  =sizeof(aHardLim
17990 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  it) );.  memcpy(
179a0 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72  db->aLimit, aHar
179b0 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64  dLimit, sizeof(d
179c0 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64  b->aLimit));.  d
179d0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
179e0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
179f0 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f  READS] = SQLITE_
17a00 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54  DEFAULT_WORKER_T
17a10 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75  HREADS;.  db->au
17a20 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
17a30 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
17a40 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d  = -1;.  db->szMm
17a50 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ap = sqlite3Glob
17a60 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
17a70 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  .  db->nextPages
17a80 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  ize = 0;.  db->n
17a90 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
17aa0 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62  0x7FFFFFFF;.  db
17ab0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
17ac0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20  E_ShortColNames 
17ad0 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
17ae0 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f  rigger | SQLITE_
17af0 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21  CacheSpill.#if !
17b00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
17b10 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
17b20 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54  _INDEX) || SQLIT
17b30 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
17b40 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20  TIC_INDEX.      
17b50 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
17b60 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65  ITE_AutoIndex.#e
17b70 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
17b80 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c  DEFAULT_CKPTFULL
17b90 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20  FSYNC.          
17ba0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
17bb0 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65  CkptFullFSync.#e
17bc0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
17bd0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
17be0 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
17bf0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
17c00 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
17c10 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
17c20 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
17c30 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
17c40 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17c50 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
17c60 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
17c70 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
17c80 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17ca0 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
17cb0 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
17cc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
17cd0 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
17ce0 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
17cf0 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
17d00 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
17d10 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
17d20 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
17d30 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
17d40 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44  TE_REVERSE_UNORD
17d50 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20  ERED_SELECTS).  
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d70 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
17d80 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20  rder.#endif.#if 
17d90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
17da0 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
17db0 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20  ELL_CHECK).     
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17dd0 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a  LITE_CellSizeCk.
17de0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
17df0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
17e00 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 29  _FTS3_TOKENIZER)
17e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17e20 20 20 7c 20 53 51 4c 49 54 45 5f 46 74 73 33 54    | SQLITE_Fts3T
17e30 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64 69 66 0a  okenizer.#endif.
17e40 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
17e50 54 45 5f 45 4e 41 42 4c 45 5f 51 50 53 47 29 0a  TE_ENABLE_QPSG).
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e70 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   | SQLITE_Enable
17e80 51 50 53 47 0a 23 65 6e 64 69 66 0a 20 20 20 20  QPSG.#endif.    
17e90 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73    ;.  sqlite3Has
17ea0 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  hInit(&db->aColl
17eb0 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
17ec0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
17ed0 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
17ee0 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d  HashInit(&db->aM
17ef0 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
17f00 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66    /* Add the def
17f10 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
17f20 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20  equence BINARY. 
17f30 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72  BINARY works for
17f40 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a   both UTF-8.  **
17f50 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20   and UTF-16, so 
17f60 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f  add a version fo
17f70 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20  r each to avoid 
17f80 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a  any unnecessary.
17f90 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
17fa0 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72  . The only error
17fb0 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20   that can occur 
17fc0 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63  here is a malloc
17fd0 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2a  () failure..  **
17fe0 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  ** EVIDENCE-O
17ff0 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38 37 38  F: R-52786-44878
18000 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65 73 20   SQLite defines 
18010 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e 20 63  three built-in c
18020 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66 75  ollating.  ** fu
18030 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20  nctions:.  */.  
18040 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
18050 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49  db, sqlite3StrBI
18060 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46  NARY, SQLITE_UTF
18070 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  8, 0, binCollFun
18080 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
18090 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c  ollation(db, sql
180a0 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53  ite3StrBINARY, S
180b0 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30  QLITE_UTF16BE, 0
180c0 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
180d0 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
180e0 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33  tion(db, sqlite3
180f0 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54  StrBINARY, SQLIT
18100 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69  E_UTF16LE, 0, bi
18110 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
18120 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
18130 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53  (db, "NOCASE", S
18140 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e  QLITE_UTF8, 0, n
18150 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
18160 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
18170 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52  Collation(db, "R
18180 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54  TRIM", SQLITE_UT
18190 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69  F8, (void*)1, bi
181a0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
181b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
181c0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
181d0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
181e0 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  }.  /* EVIDENCE-
181f0 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31 37 32 32  OF: R-08308-1722
18200 34 20 54 68 65 20 64 65 66 61 75 6c 74 20 63 6f  4 The default co
18210 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
18220 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74   for all.  ** st
18230 72 69 6e 67 73 20 69 73 20 42 49 4e 41 52 59 2e  rings is BINARY.
18240 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66   .  */.  db->pDf
18250 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  ltColl = sqlite3
18260 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
18270 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c  SQLITE_UTF8, sql
18280 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 30  ite3StrBINARY, 0
18290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
182a0 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b  >pDfltColl!=0 );
182b0 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
182c0 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72   filename/URI ar
182d0 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d  gument. */.  db-
182e0 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61  >openFlags = fla
182f0 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  gs;.  rc = sqlit
18300 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c  e3ParseUri(zVfs,
18310 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61   zFilename, &fla
18320 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26  gs, &db->pVfs, &
18330 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29  zOpen, &zErrMsg)
18340 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
18360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
18370 4d 20 29 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61  M ) sqlite3OomFa
18380 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  ult(db);.    sql
18390 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
183a0 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  (db, rc, zErrMsg
183b0 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72   ? "%s" : 0, zEr
183c0 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
183d0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
183e0 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
183f0 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
18400 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
18410 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
18420 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  r */.  rc = sqli
18430 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
18440 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62  >pVfs, zOpen, db
18450 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  , &db->aDb[0].pB
18460 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
18470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c                fl
18480 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ags | SQLITE_OPE
18490 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66  N_MAIN_DB);.  if
184a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
184b0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
184c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
184d0 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
184e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
184f0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
18500 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
18510 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
18520 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71  db_out;.  }.  sq
18530 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18540 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
18550 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53  .  db->aDb[0].pS
18560 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
18570 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d  chemaGet(db, db-
18580 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
18590 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
185a0 61 69 6c 65 64 20 29 20 45 4e 43 28 64 62 29 20  ailed ) ENC(db) 
185b0 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29  = SCHEMA_ENC(db)
185c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
185d0 4c 65 61 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d  Leave(db->aDb[0]
185e0 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
185f0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
18600 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
18610 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  b, 0);..  /* The
18620 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f   default safety_
18630 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61  level for the ma
18640 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 46  in database is F
18650 55 4c 4c 3b 20 66 6f 72 20 74 68 65 20 74 65 6d  ULL; for the tem
18660 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  p.  ** database 
18670 69 74 20 69 73 20 4f 46 46 2e 20 54 68 69 73 20  it is OFF. This 
18680 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65  matches the page
18690 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73  r layer defaults
186a0 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61  .  .  */.  db->a
186b0 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d  Db[0].zDbSName =
186c0 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61   "main";.  db->a
186d0 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[0].safety_lev
186e0 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  el = SQLITE_DEFA
186f0 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b  ULT_SYNCHRONOUS+
18700 31 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  1;.  db->aDb[1].
18710 7a 44 62 53 4e 61 6d 65 20 3d 20 22 74 65 6d 70  zDbSName = "temp
18720 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ";.  db->aDb[1].
18730 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 50  safety_level = P
18740 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
18750 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67  _OFF;..  db->mag
18760 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
18770 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62  C_OPEN;.  if( db
18780 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18790 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
187a0 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
187b0 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75   Register all bu
187c0 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
187d0 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74  , but do not att
187e0 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65  empt to read the
187f0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73  .  ** database s
18800 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20  chema yet. This 
18810 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
18820 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
18830 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
18840 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20  * is accessed.. 
18850 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72   */.  sqlite3Err
18860 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
18870 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
18880 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74 69 6f  sterPerConnectio
18890 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  nBuiltinFunction
188a0 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  s(db);.  rc = sq
188b0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
188c0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
188d0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20  E_ENABLE_FTS5.  
188e0 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6e 79 20  /* Register any 
188f0 62 75 69 6c 74 2d 69 6e 20 46 54 53 35 20 6d 6f  built-in FTS5 mo
18900 64 75 6c 65 20 62 65 66 6f 72 65 20 6c 6f 61 64  dule before load
18910 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ing the automati
18920 63 0a 20 20 2a 2a 20 65 78 74 65 6e 73 69 6f 6e  c.  ** extension
18930 73 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 61  s. This allows a
18940 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
18950 6f 6e 73 20 74 6f 20 72 65 67 69 73 74 65 72 20  ons to register 
18960 46 54 53 35 20 0a 20 20 2a 2a 20 74 6f 6b 65 6e  FTS5 .  ** token
18970 69 7a 65 72 73 20 61 6e 64 20 61 75 78 69 6c 69  izers and auxili
18980 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  ary functions.  
18990 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  */.  if( !db->ma
189a0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
189b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
189c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
189d0 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts5Init(db);.  }
189e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f  .#endif..  /* Lo
189f0 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ad automatic ext
18a00 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73  ensions - extens
18a10 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  ions that have b
18a20 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20  een registered. 
18a30 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71   ** using the sq
18a40 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f  lite3_automatic_
18a50 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e  extension() API.
18a60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
18a70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18a80 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
18a90 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
18aa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18ab0 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
18ac0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18ad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
18ae0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
18af0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
18b00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
18b10 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S1.  if( !db->ma
18b20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
18b30 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
18b40 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c  ite3Fts1Init(sql
18b50 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
18b60 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
18b70 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
18b80 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18b90 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66  ENABLE_FTS2.  if
18ba0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18bb0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
18bc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65  E_OK ){.    exte
18bd0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
18be0 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s2Init(sqlite3*)
18bf0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18c00 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a  e3Fts2Init(db);.
18c10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
18c20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18c30 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f 6d 61 74  _FTS3 /* automat
18c40 69 63 61 6c 6c 79 20 64 65 66 69 6e 65 64 20 62  ically defined b
18c50 79 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  y SQLITE_ENABLE_
18c60 46 54 53 34 20 2a 2f 0a 20 20 69 66 28 20 21 64  FTS4 */.  if( !d
18c70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18c80 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18c90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
18ca0 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
18cb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
18cc0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18cd0 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
18ce0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
18cf0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
18d00 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18d10 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
18d20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
18d30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18d40 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
18d50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
18d60 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
18d70 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
18d80 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
18d90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18da0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18db0 45 5f 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20  E_DBSTAT_VTAB.  
18dc0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18dd0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
18de0 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
18df0 3d 20 73 71 6c 69 74 65 33 44 62 73 74 61 74 52  = sqlite3DbstatR
18e00 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d  egister(db);.  }
18e10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
18e20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53  SQLITE_ENABLE_JS
18e30 4f 4e 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  ON1.  if( !db->m
18e40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
18e50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
18e60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
18e70 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  son1Init(db);.  
18e80 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
18e90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18ea0 54 4d 54 56 54 41 42 0a 20 20 69 66 28 20 21 64  TMTVTAB.  if( !d
18eb0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18ec0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18ed0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18ee0 74 65 33 53 74 6d 74 56 74 61 62 49 6e 69 74 28  te3StmtVtabInit(
18ef0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
18f00 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44  .  /* -DSQLITE_D
18f10 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
18f20 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c  ODE=1 makes EXCL
18f30 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c  USIVE the defaul
18f40 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
18f50 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44  ode.  -DSQLITE_D
18f60 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
18f70 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41  ODE=0 make NORMA
18f80 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  L the default lo
18f90 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
18fa0 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20    Doing nothing 
18fb0 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65  at all also make
18fc0 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  s NORMAL the def
18fd0 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ault..  */.#ifde
18fe0 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
18ff0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20  _LOCKING_MODE.  
19000 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  db->dfltLockMode
19010 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
19020 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a  T_LOCKING_MODE;.
19030 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f    sqlite3PagerLo
19040 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65  ckingMode(sqlite
19050 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
19060 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20  aDb[0].pBt),.   
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19080 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
19090 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
190a0 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  DE);.#endif..  i
190b0 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45  f( rc ) sqlite3E
190c0 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20  rror(db, rc);.. 
190d0 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
190e0 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
190f0 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
19100 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
19110 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
19120 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
19130 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
19150 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19160 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
19170 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
19180 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
19190 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
191a0 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
191b0 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  NT);..opendb_out
191c0 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  :.  if( db ){.  
191d0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75    assert( db->mu
191e0 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65  tex!=0 || isThre
191f0 61 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20  adsafe==0.      
19200 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47       || sqlite3G
19210 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
19220 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  lMutex==0 );.   
19230 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
19240 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
19250 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
19260 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
19270 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
19280 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
19290 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63  OMEM );.  if( rc
192a0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
192b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  {.    sqlite3_cl
192c0 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20  ose(db);.    db 
192d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
192e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
192f0 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
19300 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53  = SQLITE_MAGIC_S
19310 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62  ICK;.  }.  *ppDb
19320 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51   = db;.#ifdef SQ
19330 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
19340 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  OG.  if( sqlite3
19350 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
19360 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  llog ){.    /* O
19370 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64  pening a db hand
19380 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
19390 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30  eter is passed 0
193a0 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  . */.    void *p
193b0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Arg = sqlite3Glo
193c0 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
193d0 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65  gArg;.    sqlite
193e0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
193f0 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20  qllog(pArg, db, 
19400 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
19410 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
19420 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
19430 5f 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72 63  _CODEC).  if( rc
19440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19450 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19460 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 28 7a 4b  Key;.    if( (zK
19470 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  ey = sqlite3_uri
19480 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e  _parameter(zOpen
19490 2c 20 22 68 65 78 6b 65 79 22 29 29 21 3d 30 20  , "hexkey"))!=0 
194a0 26 26 20 7a 4b 65 79 5b 30 5d 20 29 7b 0a 20 20  && zKey[0] ){.  
194b0 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20      u8 iByte;.  
194c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
194d0 20 63 68 61 72 20 7a 44 65 63 6f 64 65 64 5b 34   char zDecoded[4
194e0 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0];.      for(i=
194f0 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69  0, iByte=0; i<si
19500 7a 65 6f 66 28 7a 44 65 63 6f 64 65 64 29 2a 32  zeof(zDecoded)*2
19510 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
19520 67 69 74 28 7a 4b 65 79 5b 69 5d 29 3b 20 69 2b  git(zKey[i]); i+
19530 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74  +){.        iByt
19540 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b  e = (iByte<<4) +
19550 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
19560 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20  (zKey[i]);.     
19570 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20     if( (i&1)!=0 
19580 29 20 7a 44 65 63 6f 64 65 64 5b 69 2f 32 5d 20  ) zDecoded[i/2] 
19590 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = iByte;.      }
195a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  .      sqlite3_k
195b0 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a 44 65  ey_v2(db, 0, zDe
195c0 63 6f 64 65 64 2c 20 69 2f 32 29 3b 0a 20 20 20  coded, i/2);.   
195d0 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 4b 65 79   }else if( (zKey
195e0 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
195f0 61 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20  arameter(zOpen, 
19600 22 6b 65 79 22 29 29 21 3d 30 20 29 7b 0a 20 20  "key"))!=0 ){.  
19610 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f      sqlite3_key_
19620 76 32 28 64 62 2c 20 30 2c 20 7a 4b 65 79 2c 20  v2(db, 0, zKey, 
19630 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19640 7a 4b 65 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20  zKey));.    }.  
19650 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
19660 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a  e3_free(zOpen);.
19670 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 30 78    return rc & 0x
19680 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  ff;.}../*.** Ope
19690 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
196a0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
196b0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20  sqlite3_open(.  
196c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
196d0 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
196e0 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72  3 **ppDb .){.  r
196f0 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
19700 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70  se(zFilename, pp
19710 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
19720 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
19730 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
19740 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
19750 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  EATE, 0);.}.int 
19760 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
19770 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
19780 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61  ilename,   /* Da
19790 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
197a0 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
197b0 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
197c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
197d0 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  ite db handle */
197e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
197f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
19800 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
19810 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
19820 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
19830 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f  module to use */
19840 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
19850 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61  nDatabase(filena
19860 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67  me, ppDb, (unsig
19870 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a  ned int)flags, z
19880 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Vfs);.}..#ifndef
19890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
198a0 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  16./*.** Open a 
198b0 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
198c0 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
198d0 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f  te3_open16(.  co
198e0 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
198f0 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
19900 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72  **ppDb.){.  char
19910 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d   const *zFilenam
19920 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61  e8;   /* zFilena
19930 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  me encoded in UT
19940 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55  F-8 instead of U
19950 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-16 */.  sqlit
19960 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
19970 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65    int rc;..#ifde
19980 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19990 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
199a0 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ppDb==0 ) return
199b0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
199c0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70  KPT;.#endif.  *p
199d0 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  pDb = 0;.#ifndef
199e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
199f0 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
19a00 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
19a10 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
19a20 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
19a30 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
19a40 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  =0 ) zFilename =
19a50 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20 70   "\000\000";.  p
19a60 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
19a70 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
19a80 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
19a90 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  Val, -1, zFilena
19aa0 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  me, SQLITE_UTF16
19ab0 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53  NATIVE, SQLITE_S
19ac0 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e  TATIC);.  zFilen
19ad0 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61  ame8 = sqlite3Va
19ae0 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
19af0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66  LITE_UTF8);.  if
19b00 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a  ( zFilename8 ){.
19b10 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74      rc = openDat
19b20 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38  abase(zFilename8
19b30 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19b50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
19b60 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
19b70 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20  N_CREATE, 0);.  
19b80 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20    assert( *ppDb 
19b90 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
19ba0 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72  MEM );.    if( r
19bb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19bc0 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a  !DbHasProperty(*
19bd0 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  ppDb, 0, DB_Sche
19be0 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20  maLoaded) ){.   
19bf0 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 2a 70     SCHEMA_ENC(*p
19c00 70 44 62 29 20 3d 20 45 4e 43 28 2a 70 70 44 62  pDb) = ENC(*ppDb
19c10 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ) = SQLITE_UTF16
19c20 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20  NATIVE;.    }.  
19c30 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
19c40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
19c50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
19c60 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
19c70 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20  ..  return rc & 
19c80 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  0xff;.}.#endif /
19c90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
19ca0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
19cb0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
19cc0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19cd0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
19ce0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
19cf0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
19d00 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
19d10 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
19d20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
19d30 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
19d40 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
19d50 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
19d60 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19d70 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19d80 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72  oid*).){.  retur
19d90 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
19da0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
19db0 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43  , zName, enc, pC
19dc0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
19dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
19de0 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
19df0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
19e00 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
19e10 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
19e20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
19e30 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
19e40 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
19e50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
19e60 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
19e70 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
19e80 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
19e90 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19ea0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19eb0 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
19ec0 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
19ed0 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
19ee0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
19ef0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
19f00 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
19f10 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d  ckOk(db) || zNam
19f20 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
19f30 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
19f40 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
19f50 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
19f60 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
19f70 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
19f80 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
19f90 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
19fa0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
19fb0 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
19fc0 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63  are, xDel);.  rc
19fd0 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
19fe0 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
19ff0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1a000 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1a010 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1a020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a030 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
1a040 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
1a050 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
1a060 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1a070 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
1a080 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
1a090 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20  e_collation16(. 
1a0a0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
1a0b0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
1a0c0 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  me,.  int enc, .
1a0d0 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
1a0e0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
1a0f0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
1a100 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
1a110 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
1a120 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a130 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a   char *zName8;..
1a140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a150 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1a160 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1a170 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
1a180 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  | zName==0 ) ret
1a190 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1a1a0 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1a1b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a1c0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1a1d0 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
1a1e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a1f0 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74    zName8 = sqlit
1a200 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
1a210 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
1a220 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
1a230 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20   if( zName8 ){. 
1a240 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f     rc = createCo
1a250 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
1a260 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  e8, (u8)enc, pCt
1a270 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
1a280 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1a290 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
1a2a0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1a2b0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
1a2c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1a2d0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1a2e0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1a2f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1a300 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1a310 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
1a320 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
1a330 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
1a340 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
1a350 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1a360 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
1a370 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
1a380 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
1a390 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1a3a0 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
1a3b0 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
1a3c0 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
1a3d0 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
1a3e0 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
1a3f0 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
1a400 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
1a410 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
1a420 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
1a430 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a440 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1a450 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1a460 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1a470 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a480 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1a490 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1a4a0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1a4b0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
1a4c0 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e  lNeeded = xCollN
1a4d0 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f  eeded;.  db->xCo
1a4e0 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a  llNeeded16 = 0;.
1a4f0 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
1a500 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
1a510 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
1a520 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1a530 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1a540 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a550 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a560 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1a570 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
1a580 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
1a590 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
1a5a0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1a5b0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
1a5c0 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
1a5d0 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
1a5e0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a5f0 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
1a600 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
1a610 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20  tion_needed16(. 
1a620 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
1a630 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
1a640 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
1a650 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76  xCollNeeded16)(v
1a660 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
1a670 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
1a680 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65   void*).){.#ifde
1a690 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a6a0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1a6b0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1a6c0 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1a6d0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1a6e0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1a6f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a700 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1a710 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1a720 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f  d = 0;.  db->xCo
1a730 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f  llNeeded16 = xCo
1a740 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62  llNeeded16;.  db
1a750 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
1a760 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
1a770 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
1a780 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1a790 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
1a7a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1a7b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a7c0 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
1a7d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
1a7e0 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
1a7f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a800 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e   now an anachron
1a810 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20  ism. It used to 
1a820 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76  be used to recov
1a830 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c  er from a.** mal
1a840 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62  loc() failure, b
1a850 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f  ut SQLite now do
1a860 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69  es this automati
1a870 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cally..*/.int sq
1a880 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
1a890 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65  over(void){.  re
1a8a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a8b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a8c0 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  Test to see whet
1a8d0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64  her or not the d
1a8e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a8f0 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  on is in autocom
1a900 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65  mit.** mode.  Re
1a910 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
1a920 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  is and FALSE if 
1a930 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  not.  Autocommit
1a940 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62   mode is on.** b
1a950 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f  y default.  Auto
1a960 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c  commit is disabl
1a970 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74  ed by a BEGIN st
1a980 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e  atement and reen
1a990 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  abled.** by the 
1a9a0 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52  next COMMIT or R
1a9b0 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  OLLBACK..*/.int 
1a9c0 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1a9d0 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
1a9e0 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
1a9f0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1aa00 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1aa10 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1aa20 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
1aa30 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
1aa40 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
1aa50 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
1aa60 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
1aa70 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ommit;.}../*.** 
1aa80 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
1aa90 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 73 74  utines are subst
1aaa0 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74  itutes for const
1aab0 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  ants SQLITE_CORR
1aac0 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  UPT,.** SQLITE_M
1aad0 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41  ISUSE, SQLITE_CA
1aae0 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 4e  NTOPEN, SQLITE_N
1aaf0 4f 4d 45 4d 20 61 6e 64 20 70 6f 73 73 69 62 6c  OMEM and possibl
1ab00 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  y other error.**
1ab10 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
1ab20 79 20 73 65 72 76 65 20 74 77 6f 20 70 75 72 70  y serve two purp
1ab30 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  oses:.**.**   1.
1ab40 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e    Serve as a con
1ab50 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
1ab60 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
1ab70 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a  t in a debugger.
1ab80 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65  **       to dete
1ab90 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20  ct when version 
1aba0 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73  error conditions
1abb0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20   occurs..**.**  
1abc0 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69   2.  Invoke sqli
1abd0 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f  te3_log() to pro
1abe0 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20  vide the source 
1abf0 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68  code location wh
1ac00 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c  ere.**       a l
1ac10 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69  ow-level error i
1ac20 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
1ac30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ac40 72 65 70 6f 72 74 45 72 72 6f 72 28 69 6e 74 20  reportError(int 
1ac50 69 45 72 72 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  iErr, int lineno
1ac60 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
1ac70 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ype){.  sqlite3_
1ac80 6c 6f 67 28 69 45 72 72 2c 20 22 25 73 20 61 74  log(iErr, "%s at
1ac90 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
1aca0 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
1acb0 20 20 20 20 7a 54 79 70 65 2c 20 6c 69 6e 65 6e      zType, linen
1acc0 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
1acd0 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
1ace0 75 72 6e 20 69 45 72 72 3b 0a 7d 0a 69 6e 74 20  urn iErr;.}.int 
1acf0 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
1ad00 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1ad10 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1ad20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ad30 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1ad40 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72  turn reportError
1ad50 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c  (SQLITE_CORRUPT,
1ad60 20 6c 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61   lineno, "databa
1ad70 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b  se corruption");
1ad80 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69  .}.int sqlite3Mi
1ad90 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69  suseError(int li
1ada0 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1adb0 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1adc0 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1add0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72  ;.  return repor
1ade0 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4d 49  tError(SQLITE_MI
1adf0 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20 22 6d  SUSE, lineno, "m
1ae00 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74 20 73  isuse");.}.int s
1ae10 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72  qlite3CantopenEr
1ae20 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1ae30 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1ae40 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ae50 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1ae60 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72  turn reportError
1ae70 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
1ae80 2c 20 6c 69 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f  , lineno, "canno
1ae90 74 20 6f 70 65 6e 20 66 69 6c 65 22 29 3b 0a 7d  t open file");.}
1aea0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1aeb0 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
1aec0 43 6f 72 72 75 70 74 50 67 6e 6f 45 72 72 6f 72  CorruptPgnoError
1aed0 28 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 50 67 6e  (int lineno, Pgn
1aee0 6f 20 70 67 6e 6f 29 7b 0a 20 20 63 68 61 72 20  o pgno){.  char 
1aef0 7a 4d 73 67 5b 31 30 30 5d 3b 0a 20 20 73 71 6c  zMsg[100];.  sql
1af00 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1af10 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67  zeof(zMsg), zMsg
1af20 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72  , "database corr
1af30 75 70 74 69 6f 6e 20 70 61 67 65 20 25 64 22 2c  uption page %d",
1af40 20 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61   pgno);.  testca
1af50 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1af60 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1af70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f  );.  return repo
1af80 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  rtError(SQLITE_C
1af90 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20  ORRUPT, lineno, 
1afa0 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  zMsg);.}.int sql
1afb0 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69  ite3NomemError(i
1afc0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1afd0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1afe0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1aff0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1b000 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1b010 54 45 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f  TE_NOMEM, lineno
1b020 2c 20 22 4f 4f 4d 22 29 3b 0a 7d 0a 69 6e 74 20  , "OOM");.}.int 
1b030 73 71 6c 69 74 65 33 49 6f 65 72 72 6e 6f 6d 65  sqlite3Ioerrnome
1b040 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  mError(int linen
1b050 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1b060 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b070 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1b080 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72   return reportEr
1b090 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1b0a0 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20  _NOMEM, lineno, 
1b0b0 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29  "I/O OOM error")
1b0c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
1b0d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b0e0 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
1b0f0 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65   This is a conve
1b100 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74  nience routine t
1b110 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74  hat makes sure t
1b120 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73  hat all thread-s
1b130 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20  pecific.** data 
1b140 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20  for this thread 
1b150 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63  has been dealloc
1b160 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ated..**.** SQLi
1b170 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
1b180 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  s thread-specifi
1b190 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72  c data so this r
1b1a0 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a  outine is now a.
1b1b0 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73  ** no-op.  It is
1b1c0 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69   retained for hi
1b1d0 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69  storical compati
1b1e0 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  bility..*/.void 
1b1f0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
1b200 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a  leanup(void){.}.
1b210 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1b220 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d  turn meta inform
1b230 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70  ation about a sp
1b240 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66  ecific column of
1b250 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
1b260 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
1b270 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28  t in sqlite3.h (
1b280 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72  sqlite.h.in) for
1b290 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74   details..*/.int
1b2a0 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
1b2b0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
1b2c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b2e0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
1b2f0 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
1b300 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
1b310 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1b320 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
1b330 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1b340 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
1b350 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
1b360 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1b370 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
1b380 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
1b390 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
1b3a0 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
1b3b0 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
1b3c0 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
1b3d0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
1b3e0 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
1b3f0 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
1b400 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
1b410 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
1b420 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1b430 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1b440 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
1b450 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
1b460 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
1b470 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
1b480 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1b490 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
1b4a0 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
1b4b0 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
1b4c0 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1b4d0 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
1b4e0 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
1b4f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1b500 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
1b510 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
1b520 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
1b530 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
1b540 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63  nt iCol = 0;.  c
1b550 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61  har const *zData
1b560 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
1b570 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71   const *zCollSeq
1b580 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e   = 0;.  int notn
1b590 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ull = 0;.  int p
1b5a0 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20  rimarykey = 0;. 
1b5b0 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30   int autoinc = 0
1b5c0 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;...#ifdef SQLIT
1b5d0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1b5e0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1b5f0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1b600 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65  b) || zTableName
1b610 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1b620 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1b630 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
1b640 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68  ..  /* Ensure th
1b650 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1b660 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65  a has been loade
1b670 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  d */.  sqlite3_m
1b680 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1b690 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
1b6a0 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
1b6b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b6c0 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
1b6d0 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
1b6e0 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
1b6f0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1b700 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
1b710 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
1b720 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
1b730 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1b740 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
1b750 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
1b760 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
1b770 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
1b780 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
1b790 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1b7a0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
1b7b0 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
1b7c0 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
1b7d0 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a  ested */.  if( z
1b7e0 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b  ColumnName==0 ){
1b7f0 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f  .    /* Query fo
1b800 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74  r existance of t
1b810 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d  able only */.  }
1b820 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
1b830 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
1b840 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
1b850 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
1b860 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
1b870 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
1b880 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
1b890 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
1b8a0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
1b8b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1b8c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
1b8d0 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
1b8e0 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
1b8f0 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71  owid(pTab) && sq
1b900 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
1b910 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
1b920 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62       iCol = pTab
1b930 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
1b940 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20   pCol = iCol>=0 
1b950 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  ? &pTab->aCol[iC
1b960 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  ol] : 0;.      }
1b970 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
1b980 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
1b990 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1b9a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b9b0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1b9c0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
1b9d0 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
1b9e0 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
1b9f0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
1ba00 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
1ba10 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
1ba20 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
1ba30 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
1ba40 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
1ba50 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
1ba60 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
1ba70 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
1ba80 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
1ba90 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
1baa0 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
1bab0 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
1bac0 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
1bad0 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
1bae0 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
1baf0 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
1bb00 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
1bb10 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
1bb20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
1bb30 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
1bb40 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
1bb50 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
1bb60 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
1bb70 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
1bb80 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
1bb90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
1bba0 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
1bbb0 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
1bbc0 20 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c   zDataType = sql
1bbd0 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70  ite3ColumnType(p
1bbe0 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c  Col,0);.    zCol
1bbf0 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f  lSeq = pCol->zCo
1bc00 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20  ll;.    notnull 
1bc10 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21  = pCol->notNull!
1bc20 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  =0;.    primaryk
1bc30 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c  ey  = (pCol->col
1bc40 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
1bc50 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20  PRIMKEY)!=0;.   
1bc60 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d   autoinc = pTab-
1bc70 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20  >iPKey==iCol && 
1bc80 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1bc90 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
1bca0 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  nt)!=0;.  }else{
1bcb0 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
1bcc0 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
1bcd0 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a  primarykey = 1;.
1bce0 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c    }.  if( !zColl
1bcf0 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c  Seq ){.    zColl
1bd00 53 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Seq = sqlite3Str
1bd10 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72  BINARY;.  }..err
1bd20 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
1bd30 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
1bd40 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65  b);..  /* Whethe
1bd50 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  r the function c
1bd60 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72  all succeeded or
1bd70 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65   failed, set the
1bd80 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
1bd90 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65  rs.  ** to whate
1bda0 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20  ver their local 
1bdb0 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e  counterparts con
1bdc0 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tain. If an erro
1bdd0 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a  r did occur,.  *
1bde0 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65  * this has the e
1bdf0 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67  ffect of zeroing
1be00 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61   all output para
1be10 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  meters..  */.  i
1be20 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20  f( pzDataType ) 
1be30 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44  *pzDataType = zD
1be40 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70  ataType;.  if( p
1be50 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f  zCollSeq ) *pzCo
1be60 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71  llSeq = zCollSeq
1be70 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c  ;.  if( pNotNull
1be80 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e   ) *pNotNull = n
1be90 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50  otnull;.  if( pP
1bea0 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72  rimaryKey ) *pPr
1beb0 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61  imaryKey = prima
1bec0 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75  rykey;.  if( pAu
1bed0 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e  toinc ) *pAutoin
1bee0 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20  c = autoinc;..  
1bef0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
1bf00 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  c && !pTab ){.  
1bf10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1bf20 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1bf30 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
1bf40 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1bf50 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f  no such table co
1bf60 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54  lumn: %s.%s", zT
1bf70 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  ableName,.      
1bf80 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a    zColumnName);.
1bf90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bfa0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
1bfb0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
1bfc0 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73  (db, rc, (zErrMs
1bfd0 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d  g?"%s":0), zErrM
1bfe0 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
1bff0 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
1c000 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c010 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
1c020 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1c030 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1c040 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1c050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
1c060 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
1c070 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
1c080 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
1c090 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
1c0a0 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d  ite3_sleep(int m
1c0b0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
1c0c0 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  s *pVfs;.  int r
1c0d0 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69  c;.  pVfs = sqli
1c0e0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
1c0f0 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29  .  if( pVfs==0 )
1c100 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
1c110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1c120 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63  orks in millisec
1c130 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e  onds, but the un
1c140 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70  derlying OsSleep
1c150 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65  () .  ** API use
1c160 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  s microseconds. 
1c170 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73  Hence the 1000's
1c180 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73  ..  */.  rc = (s
1c190 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56  qlite3OsSleep(pV
1c1a0 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30  fs, 1000*ms)/100
1c1b0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
1c1c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
1c1d0 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
1c1e0 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
1c1f0 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  codes..*/.int sq
1c200 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
1c210 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69  esult_codes(sqli
1c220 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f  te3 *db, int ono
1c230 66 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ff){.#ifdef SQLI
1c240 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1c250 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1c260 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1c270 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1c280 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1c290 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1c2a0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1c2b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1c2c0 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20  errMask = onoff 
1c2d0 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
1c2e0 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  xff;.  sqlite3_m
1c2f0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1c300 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1c310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c320 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78  .** Invoke the x
1c330 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68  FileControl meth
1c340 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  od on a particul
1c350 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ar database..*/.
1c360 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  int sqlite3_file
1c370 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  _control(sqlite3
1c380 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1c390 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f   *zDbName, int o
1c3a0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1c3b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c3c0 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65  E_ERROR;.  Btree
1c3d0 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65   *pBtree;..#ifde
1c3e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c3f0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1c400 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1c410 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1c420 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1c430 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1c440 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c450 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1c460 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74    pBtree = sqlit
1c470 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1c480 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
1c490 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1c4a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1c4b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
1c4c0 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74  e *fd;.    sqlit
1c4d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1c4e0 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ree);.    pPager
1c4f0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1c500 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  ager(pBtree);.  
1c510 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c520 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20  !=0 );.    fd = 
1c530 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1c540 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
1c550 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20  sert( fd!=0 );. 
1c560 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54     if( op==SQLIT
1c570 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
1c580 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28  NTER ){.      *(
1c590 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70  sqlite3_file**)p
1c5a0 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  Arg = fd;.      
1c5b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c5c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1c5d0 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  ==SQLITE_FCNTL_V
1c5e0 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  FS_POINTER ){.  
1c5f0 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66      *(sqlite3_vf
1c600 73 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  s**)pArg = sqlit
1c610 65 33 50 61 67 65 72 56 66 73 28 70 50 61 67 65  e3PagerVfs(pPage
1c620 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1c630 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1c640 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  lse if( op==SQLI
1c650 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c  TE_FCNTL_JOURNAL
1c660 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1c670 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
1c680 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1c690 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70  3PagerJrnlFile(p
1c6a0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1c6b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c6c0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e    }else if( fd->
1c6d0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1c6e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1c6f0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
1c700 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  op, pArg);.    }
1c710 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1c720 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
1c730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1c740 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1c750 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tree);.  }.  sql
1c760 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1c770 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1c780 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c790 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
1c7a0 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
1c7b0 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
1c7c0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
1c7d0 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
1c7e0 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65  nt rc = 0;.#ifde
1c7f0 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41  f SQLITE_UNTESTA
1c800 42 4c 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BLE.  UNUSED_PAR
1c810 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65 6c 73  AMETER(op);.#els
1c820 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  e.  va_list ap;.
1c830 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
1c840 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
1c850 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   ){..    /*.    
1c860 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
1c870 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1c880 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20   PRNG..    */.  
1c890 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1c8a0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
1c8b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c8c0 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29  3PrngSaveState()
1c8d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c8e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1c8f0 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   ** Restore the 
1c900 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1c910 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74  G to the last st
1c920 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a  ate saved using.
1c930 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45      ** PRNG_SAVE
1c940 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20  .  If PRNG_SAVE 
1c950 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
1c960 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
1c970 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76  en.    ** this v
1c980 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52  erb acts like PR
1c990 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f  NG_RESET..    */
1c9a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c9b0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
1c9c0 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20  ESTORE: {.      
1c9d0 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f  sqlite3PrngResto
1c9e0 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  reState();.     
1c9f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1ca00 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
1ca10 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b  et the PRNG back
1ca20 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61   to its uninitia
1ca30 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68  lized state.  Th
1ca40 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20  e next call.    
1ca50 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61  ** to sqlite3_ra
1ca60 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20  ndomness() will 
1ca70 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20  reseed the PRNG 
1ca80 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63  using a single c
1ca90 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  all.    ** to th
1caa0 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65  e xRandomness me
1cab0 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61  thod of the defa
1cac0 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a  ult VFS..    */.
1cad0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1cae0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
1caf0 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  SET: {.      sql
1cb00 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1cb10 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  0,0);.      brea
1cb20 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1cb30 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1cb40 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49  _test_control(BI
1cb50 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c  TVEC_TEST, size,
1cb60 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a   program).    **
1cb70 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65  .    ** Run a te
1cb80 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74  st against a Bit
1cb90 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69  vec object of si
1cba0 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d  ze.  The program
1cbb0 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
1cbc0 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
1cbd0 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
1cbe0 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20  fines the test. 
1cbf0 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a   Return -1 on a.
1cc00 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
1cc10 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20  location error, 
1cc20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72  0 on success, or
1cc30 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e   non-zero for an
1cc40 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53   error..    ** S
1cc50 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69  ee the sqlite3Bi
1cc60 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
1cc70 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
1cc80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
1cc90 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1cca0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
1ccb0 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20  TVEC_TEST: {.   
1ccc0 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
1ccd0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1cce0 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20     int *aProg = 
1ccf0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
1cd00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1cd10 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
1cd20 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29  nTest(sz, aProg)
1cd30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1cd40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1cd50 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1cd60 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f  t_control(FAULT_
1cd70 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61  INSTALL, xCallba
1cd80 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck).    **.    *
1cd90 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69 6e 76  * Arrange to inv
1cda0 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28 29 20  oke xCallback() 
1cdb0 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33  whenever sqlite3
1cdc0 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20 63 61  FaultSim() is ca
1cdd0 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20  lled,.    ** if 
1cde0 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74  xCallback is not
1cdf0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20   NULL..    **.  
1ce00 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74 20 6f    ** As a test o
1ce10 66 20 74 68 65 20 66 61 75 6c 74 20 73 69 6d 75  f the fault simu
1ce20 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20  lator mechanism 
1ce30 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65 33 46  itself, sqlite3F
1ce40 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20 20 2a  aultSim(0).    *
1ce50 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65  * is called imme
1ce60 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 69 6e  diately after in
1ce70 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77  stalling the new
1ce80 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   callback and th
1ce90 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  e return.    ** 
1cea0 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69 74  value from sqlit
1ceb0 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20 62 65  e3FaultSim(0) be
1cec0 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75 72 6e  comes the return
1ced0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
1cee0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1cef0 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  l()..    */.    
1cf00 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1cf10 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41  CTRL_FAULT_INSTA
1cf20 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d  LL: {.      /* M
1cf30 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f  SVC is picky abo
1cf40 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20  ut pulling func 
1cf50 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73  ptrs from va lis
1cf60 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74  ts..      ** htt
1cf70 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72  p://support.micr
1cf80 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39  osoft.com/kb/479
1cf90 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  61.      ** sqli
1cfa0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cfb0 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20  xTestCallback = 
1cfc0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 28 2a  va_arg(ap, int(*
1cfd0 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a  )(int));.      *
1cfe0 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
1cff0 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42 41 43  int(*TESTCALLBAC
1d000 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20  KFUNC_t)(int);. 
1d010 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1d020 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61  alConfig.xTestCa
1d030 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28  llback = va_arg(
1d040 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41 43 4b  ap, TESTCALLBACK
1d050 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 72  FUNC_t);.      r
1d060 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  c = sqlite3Fault
1d070 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20 62 72  Sim(0);.      br
1d080 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1d090 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1d0a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1d0b0 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
1d0c0 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e  OKS, xBegin, xEn
1d0d0 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
1d0e0 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20   Register hooks 
1d0f0 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63  to call to indic
1d100 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63  ate which malloc
1d110 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20  () failures .   
1d120 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a   ** are benign..
1d130 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1d140 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d150 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
1d160 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70  OKS: {.      typ
1d170 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64  edef void (*void
1d180 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29  _function)(void)
1d190 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
1d1a0 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67  ction xBenignBeg
1d1b0 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  in;.      void_f
1d1c0 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45  unction xBenignE
1d1d0 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  nd;.      xBenig
1d1e0 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28  nBegin = va_arg(
1d1f0 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
1d200 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  n);.      xBenig
1d210 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70  nEnd = va_arg(ap
1d220 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
1d230 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1d240 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73  enignMallocHooks
1d250 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78  (xBenignBegin, x
1d260 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20  BenignEnd);.    
1d270 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d280 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1d290 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d2a0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d2b0 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
1d2c0 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58  , unsigned int X
1d2d0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1d2e0 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20  Set the PENDING 
1d2f0 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75  byte to the valu
1d300 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  e in the argumen
1d310 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a  t, if X>0..    *
1d320 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
1d330 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75  s if X==0.  Retu
1d340 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
1d350 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65  the pending byte
1d360 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78  .    ** as it ex
1d370 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68  isting before th
1d380 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1d390 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  alled..    **.  
1d3a0 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20    ** IMPORTANT: 
1d3b0 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
1d3c0 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20  NDING byte from 
1d3d0 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c  0x40000000 resul
1d3e0 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20  ts in.    ** an 
1d3f0 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74  incompatible dat
1d400 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61  abase file forma
1d410 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  t.  Changing the
1d420 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20   PENDING byte.  
1d430 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64    ** while any d
1d440 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1d450 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c  on is open resul
1d460 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20  ts in undefined 
1d470 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
1d480 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e  erious behavior.
1d490 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d4a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d4b0 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b  _PENDING_BYTE: {
1d4c0 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44  .      rc = PEND
1d4d0 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65  ING_BYTE;.#ifnde
1d4e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
1d4f0 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  D.      {.      
1d500 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e    unsigned int n
1d510 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61  ewVal = va_arg(a
1d520 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  p, unsigned int)
1d530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
1d540 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65  wVal ) sqlite3Pe
1d550 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56  ndingByte = newV
1d560 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  al;.      }.#end
1d570 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
1d580 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1d590 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1d5a0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1d5b0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1d5c0 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  T, int X).    **
1d5d0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74  .    ** This act
1d5e0 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72  ion provides a r
1d5f0 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20  un-time test to 
1d600 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
1d610 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  ot.    ** assert
1d620 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  () was enabled a
1d630 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
1d640 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
1d650 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a  d assert().    *
1d660 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  * is enabled, th
1d670 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
1d680 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49 66  lue is true.  If
1d690 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20   X is true and. 
1d6a0 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69     ** assert() i
1d6b0 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
1d6c0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1d6d0 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58  e is zero.  If X
1d6e0 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65   is.    ** false
1d6f0 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
1d700 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
1d710 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72  he assertion fir
1d720 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  es and the.    *
1d730 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73  * process aborts
1d740 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73 65  .  If X is false
1d750 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
1d760 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
1d770 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  the.    ** retur
1d780 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
1d790 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d7a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d7b0 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20  _ASSERT: {.     
1d7c0 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20   volatile int x 
1d7d0 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
1d7e0 74 28 20 2f 2a 73 69 64 65 2d 65 66 66 65 63 74  t( /*side-effect
1d7f0 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20 76 61 5f 61  s-ok*/ (x = va_a
1d800 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
1d810 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
1d820 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d830 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
1d840 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1d850 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d860 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
1d870 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
1d880 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
1d890 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
1d8a0 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
1d8b0 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
1d8c0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
1d8d0 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
1d8e0 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
1d8f0 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
1d900 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
1d910 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
1d920 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
1d930 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
1d940 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
1d950 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1d960 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
1d970 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
1d980 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
1d990 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
1d9a0 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
1d9b0 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
1d9c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
1d9d0 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
1d9e0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1d9f0 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
1da00 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
1da10 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
1da20 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
1da30 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
1da40 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
1da50 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
1da60 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
1da70 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
1da80 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
1da90 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
1daa0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1dab0 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
1dac0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1dad0 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
1dae0 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
1daf0 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
1db00 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
1db10 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
1db20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
1db30 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
1db40 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
1db50 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
1db60 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
1db70 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1db80 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
1db90 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
1dba0 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
1dbb0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
1dbc0 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
1dbd0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1dbe0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1dbf0 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
1dc00 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1dc10 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
1dc20 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
1dc30 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
1dc40 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
1dc50 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
1dc60 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1dc70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1dc80 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
1dc90 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
1dca0 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
1dcb0 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
1dcc0 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
1dcd0 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
1dce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
1dcf0 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1dd00 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
1dd10 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
1dd20 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
1dd30 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
1dd40 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1dd50 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1dd60 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
1dd70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1dd80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
1dd90 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
1dda0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ddb0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c   /*.    **   sql
1ddc0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1ddd0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1dde0 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20  L_BYTEORDER);.  
1ddf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1de00 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64  integer returned
1de10 20 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74   reveals the byt
1de20 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63  e-order of the c
1de30 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68  omputer on which
1de40 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69  .    ** SQLite i
1de50 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a  s running:.    *
1de60 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31  *.    **       1
1de70 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
1de80 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
1de90 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
1dea0 2a 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69  *      10     li
1deb0 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
1dec0 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
1ded0 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31  ime.    **  4321
1dee0 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61  01     big-endia
1def0 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64  n,    determined
1df00 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1df10 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20  .    **  123410 
1df20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61      little-endia
1df30 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74  n, determined at
1df40 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1df50 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53    */ .    case S
1df60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1df70 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20  YTEORDER: {.    
1df80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59    rc = SQLITE_BY
1df90 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51  TEORDER*100 + SQ
1dfa0 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41  LITE_LITTLEENDIA
1dfb0 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49  N*10 + SQLITE_BI
1dfc0 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62  GENDIAN;.      b
1dfd0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1dfe0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1dff0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1e000 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
1e010 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
1e020 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1e030 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
1e040 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
1e050 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
1e060 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
1e070 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
1e080 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
1e090 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e0a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
1e0b0 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
1e0c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1e0d0 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1e0e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
1e0f0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1e100 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1e110 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1e120 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
1e130 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
1e140 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
1e150 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
1e160 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1e170 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1e180 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
1e190 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1e1a0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e1b0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e1c0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1e1d0 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
1e1e0 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1e1f0 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
1e200 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
1e210 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
1e220 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
1e230 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
1e240 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
1e250 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
1e260 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
1e270 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
1e280 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
1e290 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
1e2a0 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
1e2b0 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
1e2c0 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
1e2d0 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
1e2e0 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
1e2f0 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
1e300 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
1e310 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
1e320 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
1e330 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
1e340 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
1e350 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
1e360 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
1e370 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
1e380 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
1e390 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e3a0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
1e3b0 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
1e3c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e3d0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1e3e0 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1e3f0 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31  dbOptFlags = (u1
1e400 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  6)(va_arg(ap, in
1e410 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20  t) & 0xffff);.  
1e420 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e430 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e440 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a  N_KEYWORD.    /*
1e450 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e460 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e470 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c  TCTRL_ISKEYWORD,
1e480 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
1e490 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rd).    **.    *
1e4a0 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20  * If zWord is a 
1e4b0 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a  keyword recogniz
1e4c0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1e4d0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
1e4e0 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
1e4f0 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  of keywords.  Or
1e500 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74   if zWord is not
1e510 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75   a keyword, retu
1e520 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  rn 0..    ** .  
1e530 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66    ** This test f
1e540 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61  eature is only a
1e550 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
1e560 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e  amalgamation sin
1e570 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51  ce.    ** the SQ
1e580 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d  LITE_N_KEYWORD m
1e590 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69  acro is not defi
1e5a0 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
1e5b0 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a   if SQLite.    *
1e5c0 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67  * is built using
1e5d0 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65   separate source
1e5e0 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
1e5f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1e600 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
1e610 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  D: {.      const
1e620 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76   char *zWord = v
1e630 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
1e640 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e  char*);.      in
1e650 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
1e660 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20  len30(zWord);.  
1e670 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65      rc = (sqlite
1e680 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38  3KeywordCode((u8
1e690 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f  *)zWord, n)!=TK_
1e6a0 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b  ID) ? SQLITE_N_K
1e6b0 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20  EYWORD : 0;.    
1e6c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1e6d0 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73  endif ..    /* s
1e6e0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1e6f0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1e700 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
1e710 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46  C, sz, &pNew, pF
1e720 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ree);.    **.   
1e730 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69   ** Pass pFree i
1e740 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74  nto sqlite3Scrat
1e750 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a  chFree(). .    *
1e760 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61  * If sz>0 then a
1e770 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63  llocate a scratc
1e780 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e  h buffer into pN
1e790 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ew.  .    */.   
1e7a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1e7b0 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
1e7c0 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  LOC: {.      voi
1e7d0 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65  d *pFree, **ppNe
1e7e0 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  w;.      int sz;
1e7f0 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61  .      sz = va_a
1e800 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1e810 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72     ppNew = va_ar
1e820 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20  g(ap, void**);. 
1e830 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f       pFree = va_
1e840 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
1e850 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a        if( sz ) *
1e860 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53  ppNew = sqlite3S
1e870 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29  cratchMalloc(sz)
1e880 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
1e890 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65  cratchFree(pFree
1e8a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e8b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1e8c0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e8d0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e8e0 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1e8f0 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29  AULT, int onoff)
1e900 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1e910 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f  If parameter ono
1e920 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ff is non-zero, 
1e930 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72  configure the wr
1e940 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61  appers so that a
1e950 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71  ll.    ** subseq
1e960 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f  uent calls to lo
1e970 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61  caltime() and va
1e980 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20  riants fail. If 
1e990 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20  onoff is zero,. 
1e9a0 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20     ** undo this 
1e9b0 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1e9c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e9d0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1e9e0 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
1e9f0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1ea00 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65  onfig.bLocaltime
1ea10 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61  Fault = va_arg(a
1ea20 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1ea30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ea40 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1ea50 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ea60 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
1ea70 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a  _CORRUPT, int);.
1ea80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
1ea90 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61  t or clear a fla
1eaa0 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
1eab0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1eac0 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79  se file is alway
1ead0 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66  s well-.    ** f
1eae0 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20  ormed and never 
1eaf0 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20 66  corrupt.  This f
1eb00 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62 79 20  lag is clear by 
1eb10 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74  default, indicat
1eb20 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ing that.    ** 
1eb30 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d  database files m
1eb40 69 67 68 74 20 68 61 76 65 20 61 72 62 69 74 72  ight have arbitr
1eb50 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ary corruption. 
1eb60 20 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61   Setting the fla
1eb70 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20  g during.    ** 
1eb80 74 65 73 74 69 6e 67 20 63 61 75 73 65 73 20 63  testing causes c
1eb90 65 72 74 61 69 6e 20 61 73 73 65 72 74 28 29 20  ertain assert() 
1eba0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
1ebb0 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74  e code to be act
1ebc0 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68  ivated.    ** th
1ebd0 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e  at demonstrat in
1ebe0 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c  variants on well
1ebf0 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
1ec00 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
1ec10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1ec20 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
1ec30 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73  RRUPT: {.      s
1ec40 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ec50 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20  ig.neverCorrupt 
1ec60 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1ec70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ec80 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
1ec90 74 20 74 68 65 20 74 68 72 65 73 68 6f 6c 64 20  t the threshold 
1eca0 61 74 20 77 68 69 63 68 20 4f 50 5f 4f 6e 63 65  at which OP_Once
1ecb0 20 63 6f 75 6e 74 65 72 73 20 72 65 73 65 74 20   counters reset 
1ecc0 62 61 63 6b 20 74 6f 20 7a 65 72 6f 2e 0a 20 20  back to zero..  
1ecd0 20 20 2a 2a 20 42 79 20 64 65 66 61 75 6c 74 20    ** By default 
1ece0 74 68 69 73 20 69 73 20 30 78 37 66 66 66 66 66  this is 0x7fffff
1ecf0 66 65 20 28 6f 76 65 72 20 32 20 62 69 6c 6c 69  fe (over 2 billi
1ed00 6f 6e 29 2c 20 62 75 74 20 74 68 61 74 20 76 61  on), but that va
1ed10 6c 75 65 20 69 73 0a 20 20 20 20 2a 2a 20 74 6f  lue is.    ** to
1ed20 6f 20 62 69 67 20 74 6f 20 74 65 73 74 20 69 6e  o big to test in
1ed30 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 61 6d   a reasonable am
1ed40 6f 75 6e 74 20 6f 66 20 74 69 6d 65 2c 20 73 6f  ount of time, so
1ed50 20 74 68 69 73 20 63 6f 6e 74 72 6f 6c 20 69 73   this control is
1ed60 0a 20 20 20 20 2a 2a 20 70 72 6f 76 69 64 65 64  .    ** provided
1ed70 20 74 6f 20 73 65 74 20 61 20 73 6d 61 6c 6c 20   to set a small 
1ed80 61 6e 64 20 65 61 73 69 6c 79 20 72 65 61 63 68  and easily reach
1ed90 61 62 6c 65 20 72 65 73 65 74 20 76 61 6c 75 65  able reset value
1eda0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1edb0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1edc0 4c 5f 4f 4e 43 45 5f 52 45 53 45 54 5f 54 48 52  L_ONCE_RESET_THR
1edd0 45 53 48 4f 4c 44 3a 20 7b 0a 20 20 20 20 20 20  ESHOLD: {.      
1ede0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1edf0 66 69 67 2e 69 4f 6e 63 65 52 65 73 65 74 54 68  fig.iOnceResetTh
1ee00 72 65 73 68 6f 6c 64 20 3d 20 76 61 5f 61 72 67  reshold = va_arg
1ee10 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1ee20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1ee30 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1ee40 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1ee50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42  ITE_TESTCTRL_VDB
1ee60 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c  E_COVERAGE, xCal
1ee70 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20  lback, ptr);.   
1ee80 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
1ee90 68 65 20 56 44 42 45 20 63 6f 76 65 72 61 67 65  he VDBE coverage
1eea0 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
1eeb0 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20  on to xCallback 
1eec0 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20  with context .  
1eed0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72    ** pointer ptr
1eee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1eef0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1ef00 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a  L_VDBE_COVERAGE:
1ef10 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   {.#ifdef SQLITE
1ef20 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
1ef30 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1ef40 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62  d (*branch_callb
1ef50 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75  ack)(void*,int,u
1ef60 38 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  8,u8);.      sql
1ef70 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ef80 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76  .xVdbeBranch = v
1ef90 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f  a_arg(ap,branch_
1efa0 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  callback);.     
1efb0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1efc0 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68  nfig.pVdbeBranch
1efd0 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Arg = va_arg(ap,
1efe0 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20  void*);.#endif. 
1eff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f000 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1f010 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1f020 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1f030 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62  _SORTER_MMAP, db
1f040 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20  , nMax); */.    
1f050 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f060 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
1f070 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1f080 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1f090 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1f0a0 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74      db->nMaxSort
1f0b0 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  erMmap = va_arg(
1f0c0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1f0d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1f0e0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1f0f0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1f100 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
1f110 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  IT);.    **.    
1f120 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1f130 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61  _OK if SQLite ha
1f140 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
1f150 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52  ed and SQLITE_ER
1f160 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f  ROR if.    ** no
1f170 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
1f180 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1f190 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20  RL_ISINIT: {.   
1f1a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
1f1b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
1f1c0 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  t==0 ) rc = SQLI
1f1d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1f1e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1f1f0 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    /*  sqlite3_te
1f200 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1f210 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
1f220 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c  TER, db, dbName,
1f230 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20   onOff, tnum);. 
1f240 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1f250 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69  s test control i
1f260 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
1f270 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
1f280 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f 69  .  "db" is a poi
1f290 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74  nter.    ** to t
1f2a0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1f2b0 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20  ection.  dbName 
1f2c0 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1f2d0 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  name (ex: "main"
1f2e0 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70   or.    ** "temp
1f2f0 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65  ") which will re
1f300 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73 74  ceive the impost
1f310 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75 72  er.  "onOff" tur
1f320 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  ns imposter mode
1f330 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66   on.    ** or of
1f340 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74 68  f.  "tnum" is th
1f350 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1f360 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68 69  he b-tree to whi
1f370 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72 0a  ch the imposter.
1f380 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f      ** table sho
1f390 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20  uld connect..   
1f3a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
1f3b0 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20  e imposter mode 
1f3c0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73 63  only when the sc
1f3d0 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64 79  hema has already
1f3e0 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20 54   been parsed.  T
1f3f0 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61  hen.    ** run a
1f400 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20 54   single CREATE T
1f410 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74  ABLE statement t
1f420 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
1f430 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69  imposter table i
1f440 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72  n.    ** the par
1f450 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68 65  sed schema.  The
1f460 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72 20  n turn imposter 
1f470 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61 67  mode back off ag
1f480 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ain..    **.    
1f490 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61  ** If onOff==0 a
1f4a0 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72  nd tnum>0 then r
1f4b0 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
1f4c0 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
1f4d0 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a  s, causing.    *
1f4e0 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
1f4f0 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65 20  be reparsed the 
1f500 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
1f510 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68 61  needed.  This ha
1f520 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66 66  s the.    ** eff
1f530 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20 61  ect of erasing a
1f540 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  ll imposter tabl
1f550 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1f560 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1f570 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a  TRL_IMPOSTER: {.
1f580 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1f590 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1f5a0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1f5b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f5c0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1f5d0 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69        db->init.i
1f5e0 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
1f5f0 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61 72  DbName(db, va_ar
1f600 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  g(ap,const char*
1f610 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  ));.      db->in
1f620 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  it.busy = db->in
1f630 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
1f640 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1f650 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69  );.      db->ini
1f660 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61  t.newTnum = va_a
1f670 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1f680 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
1f690 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e  usy==0 && db->in
1f6a0 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a  it.newTnum>0 ){.
1f6b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
1f6c0 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
1f6d0 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
1f6e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1f6f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1f700 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1f710 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f720 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
1f730 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1f740 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 20 2a  ITE_UNTESTABLE *
1f750 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1f760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
1f770 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e  a utility routin
1f780 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53  e, useful to VFS
1f790 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1f7a0 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a  , that checks.**
1f7b0 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74   to see if a dat
1f7c0 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61  abase file was a
1f7d0 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69   URI that contai
1f7e0 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71  ned a specific q
1f7f0 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74  uery .** paramet
1f800 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62  er, and if so ob
1f810 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
1f820 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72  of the query par
1f830 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
1f840 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
1f850 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65  ment is the file
1f860 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73  name pointer pas
1f870 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70  sed into the xOp
1f880 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  en().** method o
1f890 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  f a VFS implemen
1f8a0 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61  tation.  The zPa
1f8b0 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ram argument is 
1f8c0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
1f8d0 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
1f8e0 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69  er we seek.  Thi
1f8f0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f900 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1f910 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72  he zParam.** par
1f920 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69  ameter if it exi
1f930 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72  sts.  If the par
1f940 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20  ameter does not 
1f950 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  exist, this rout
1f960 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ine.** returns a
1f970 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
1f980 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1f990 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1f9a0 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
1f9b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
1f9c0 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a   char *zParam){.
1f9d0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
1f9e0 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20  =0 || zParam==0 
1f9f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46  ) return 0;.  zF
1fa00 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1fa10 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1fa20 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69  name) + 1;.  whi
1fa30 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  le( zFilename[0]
1fa40 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20   ){.    int x = 
1fa50 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
1fa60 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a  , zParam);.    z
1fa70 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1fa80 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1fa90 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  ename) + 1;.    
1faa0 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72  if( x==0 ) retur
1fab0 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  n zFilename;.   
1fac0 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1fad0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1fae0 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1faf0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1fb00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1fb10 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f  boolean value fo
1fb20 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
1fb30 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1fb40 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1fb50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1fb60 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1fb70 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62  r *zParam, int b
1fb80 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Dflt){.  const c
1fb90 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1fba0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
1fbb0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1fbc0 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66  );.  bDflt = bDf
1fbd0 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  lt!=0;.  return 
1fbe0 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f  z ? sqlite3GetBo
1fbf0 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20  olean(z, bDflt) 
1fc00 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  : bDflt;.}../*.*
1fc10 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69  * Return a 64-bi
1fc20 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
1fc30 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
1fc40 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  meter..*/.sqlite
1fc50 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
1fc60 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e  uri_int64(.  con
1fc70 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1fc80 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me,    /* Filena
1fc90 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  me as passed to 
1fca0 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  xOpen */.  const
1fcb0 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20   char *zParam,  
1fcc0 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61       /* URI para
1fcd0 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a  meter sought */.
1fce0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1fcf0 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72  bDflt       /* r
1fd00 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74  eturn if paramet
1fd10 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f  er is missing */
1fd20 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1fd30 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1fd40 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1fd50 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1fd60 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1fd70 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71  v;.  if( z && sq
1fd80 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
1fd90 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54  64(z, &v)==SQLIT
1fda0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c  E_OK ){.    bDfl
1fdb0 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
1fdc0 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  urn bDflt;.}../*
1fdd0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42  .** Return the B
1fde0 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65  tree pointer ide
1fdf0 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61  ntified by zDbNa
1fe00 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  me.  Return NULL
1fe10 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1fe20 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33  /.Btree *sqlite3
1fe30 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71  DbNameToBtree(sq
1fe40 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1fe50 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1fe60 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 7a 44 62  .  int iDb = zDb
1fe70 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 46 69  Name ? sqlite3Fi
1fe80 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
1fe90 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 72 65 74  Name) : 0;.  ret
1fea0 75 72 6e 20 69 44 62 3c 30 20 3f 20 30 20 3a 20  urn iDb<0 ? 0 : 
1feb0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
1fec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1fed0 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f  n the filename o
1fee0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1fef0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
1ff00 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1ff10 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  nection..*/.cons
1ff20 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
1ff30 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69  db_filename(sqli
1ff40 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1ff50 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1ff60 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66   Btree *pBt;.#if
1ff70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ff80 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1ff90 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1ffa0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
1ffb0 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
1ffc0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
1ffd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
1ffe0 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71  endif.  pBt = sq
1fff0 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
20000 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
20010 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20  .  return pBt ? 
20020 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
20030 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30  ilename(pBt) : 0
20040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20050 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65 20  n 1 if database 
20060 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  is read-only or 
20070 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e  0 if read/write.
20080 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a    Return -1 if.*
20090 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61  * no such databa
200a0 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e  se exists..*/.in
200b0 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61  t sqlite3_db_rea
200c0 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64  donly(sqlite3 *d
200d0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
200e0 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
200f0 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51   *pBt;.#ifdef SQ
20100 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
20110 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
20120 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
20130 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
20140 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
20150 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
20160 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n -1;.  }.#endif
20170 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
20180 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
20190 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
201a0 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
201b0 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c  e3BtreeIsReadonl
201c0 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a  y(pBt) : -1;.}..
201d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
201e0 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a  ABLE_SNAPSHOT./*
201f0 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 6e 61  .** Obtain a sna
20200 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72  pshot handle for
20210 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66   the snapshot of
20220 20 64 61 74 61 62 61 73 65 20 7a 44 62 20 63 75   database zDb cu
20230 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e  rrently .** bein
20240 67 20 72 65 61 64 20 62 79 20 68 61 6e 64 6c 65  g read by handle
20250 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
20260 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74  te3_snapshot_get
20270 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
20280 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
20290 7a 44 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73  zDb,.  sqlite3_s
202a0 6e 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70  napshot **ppSnap
202b0 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  shot.){.  int rc
202c0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
202d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
202e0 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66  OMIT_WAL..#ifdef
202f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
20300 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
20310 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
20320 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
20330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
20340 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
20350 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
20360 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
20370 6d 75 74 65 78 29 3b 0a 0a 20 20 69 66 28 20 64  mutex);..  if( d
20380 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
20390 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20   ){.    int iDb 
203a0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
203b0 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
203c0 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20    if( iDb==0 || 
203d0 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20 20 42  iDb>1 ){.      B
203e0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
203f0 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
20400 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
20410 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
20420 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
20430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20440 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74  eeBeginTrans(pBt
20450 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
20460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
20480 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
20490 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65  apshotGet(sqlite
204a0 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
204b0 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  , ppSnapshot);. 
204c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
204d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
204e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
204f0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
20500 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
20510 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
20520 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20530 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74  ** Open a read-t
20540 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
20550 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65 6e 64  e snapshot idend
20560 69 66 69 65 64 20 62 79 20 70 53 6e 61 70 73 68  ified by pSnapsh
20570 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
20580 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e  e3_snapshot_open
20590 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
205a0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
205b0 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  zDb, .  sqlite3_
205c0 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
205d0 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  hot.){.  int rc 
205e0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
205f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20600 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20  MIT_WAL..#ifdef 
20610 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
20620 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
20630 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
20640 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
20650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
20660 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
20670 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
20680 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
20690 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
206a0 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
206b0 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20  {.    int iDb;. 
206c0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
206d0 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
206e0 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
206f0 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a  ==0 || iDb>1 ){.
20700 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
20710 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
20720 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 30  pBt;.      if( 0
20730 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ==sqlite3BtreeIs
20740 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74 29  InReadTrans(pBt)
20750 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20760 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61   sqlite3PagerSna
20770 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65  pshotOpen(sqlite
20780 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
20790 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20  , pSnapshot);.  
207a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
207b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
207c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
207d0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
207e0 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
207f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20800 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c  SnapshotOpen(sql
20810 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
20820 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Bt), 0);.       
20830 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20840 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
20850 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
20860 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20  mutex);.#endif  
20870 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
20880 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  WAL */.  return 
20890 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  rc;.}../*.** Rec
208a0 6f 76 65 72 20 61 73 20 6d 61 6e 79 20 73 6e 61  over as many sna
208b0 70 73 68 6f 74 73 20 61 73 20 70 6f 73 73 69 62  pshots as possib
208c0 6c 65 20 66 72 6f 6d 20 74 68 65 20 77 61 6c 20  le from the wal 
208d0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
208e0 77 69 74 68 0a 2a 2a 20 73 63 68 65 6d 61 20 7a  with.** schema z
208f0 44 62 20 6f 66 20 64 61 74 61 62 61 73 65 20 64  Db of database d
20900 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
20910 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76  3_snapshot_recov
20920 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  er(sqlite3 *db, 
20930 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
20940 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20950 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74  ITE_ERROR;.  int
20960 20 69 44 62 3b 0a 23 69 66 6e 64 65 66 20 53 51   iDb;.#ifndef SQ
20970 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23  LITE_OMIT_WAL..#
20980 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20990 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
209a0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
209b0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
209c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
209d0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
209e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
209f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
20a00 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
20a10 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
20a20 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
20a30 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c  ;.  if( iDb==0 |
20a40 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 42  | iDb>1 ){.    B
20a50 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
20a60 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
20a70 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
20a80 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61  BtreeIsInReadTra
20a90 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
20aa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20ab0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74  eeBeginTrans(pBt
20ac0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20ae0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
20af0 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
20b00 6f 74 52 65 63 6f 76 65 72 28 73 71 6c 69 74 65  otRecover(sqlite
20b10 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
20b20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
20b30 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42  e3BtreeCommit(pB
20b40 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
20b50 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
20b60 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
20b70 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20  mutex);.#endif  
20b80 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
20b90 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  WAL */.  return 
20ba0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
20bb0 65 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e  e a snapshot han
20bc0 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  dle obtained fro
20bd0 6d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  m sqlite3_snapsh
20be0 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69  ot_get()..*/.voi
20bf0 64 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  d sqlite3_snapsh
20c00 6f 74 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f  ot_free(sqlite3_
20c10 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
20c20 68 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  hot){.  sqlite3_
20c30 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b  free(pSnapshot);
20c40 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
20c50 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
20c60 48 4f 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  HOT */..#ifndef 
20c70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
20c80 49 4c 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 0a  ILEOPTION_DIAGS.
20c90 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
20ca0 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6d 70 69 6c  name of a compil
20cb0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2c 20 72  e-time option, r
20cc0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
20cd0 61 74 20 6f 70 74 69 6f 6e 0a 2a 2a 20 77 61 73  at option.** was
20ce0 20 75 73 65 64 20 61 6e 64 20 66 61 6c 73 65 20   used and false 
20cf0 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  if not..**.** Th
20d00 65 20 6e 61 6d 65 20 63 61 6e 20 6f 70 74 69 6f  e name can optio
20d10 6e 61 6c 6c 79 20 62 65 67 69 6e 20 77 69 74 68  nally begin with
20d20 20 22 53 51 4c 49 54 45 5f 22 20 62 75 74 20 74   "SQLITE_" but t
20d30 68 65 20 22 53 51 4c 49 54 45 5f 22 20 70 72 65  he "SQLITE_" pre
20d40 66 69 78 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65  fix.** is not re
20d50 71 75 69 72 65 64 20 66 6f 72 20 61 20 6d 61 74  quired for a mat
20d60 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ch..*/.int sqlit
20d70 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e  e3_compileoption
20d80 5f 75 73 65 64 28 63 6f 6e 73 74 20 63 68 61 72  _used(const char
20d90 20 2a 7a 4f 70 74 4e 61 6d 65 29 7b 0a 20 20 69   *zOptName){.  i
20da0 6e 74 20 69 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e  nt i, n;.  int n
20db0 4f 70 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Opt;.  const cha
20dc0 72 20 2a 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  r **azCompileOpt
20dd0 3b 0a 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  ;. .#if SQLITE_E
20de0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
20df0 20 20 69 66 28 20 7a 4f 70 74 4e 61 6d 65 3d 3d    if( zOptName==
20e00 30 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  0 ){.    (void)S
20e10 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
20e20 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
20e30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
20e40 7a 43 6f 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71  zCompileOpt = sq
20e50 6c 69 74 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69  lite3CompileOpti
20e60 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a 0a 20 20 69  ons(&nOpt);..  i
20e70 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
20e80 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20 22 53 51  mp(zOptName, "SQ
20e90 4c 49 54 45 5f 22 2c 20 37 29 3d 3d 30 20 29 20  LITE_", 7)==0 ) 
20ea0 7a 4f 70 74 4e 61 6d 65 20 2b 3d 20 37 3b 0a 20  zOptName += 7;. 
20eb0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
20ec0 65 6e 33 30 28 7a 4f 70 74 4e 61 6d 65 29 3b 0a  en30(zOptName);.
20ed0 0a 20 20 2f 2a 20 53 69 6e 63 65 20 6e 4f 70 74  .  /* Since nOpt
20ee0 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 69 6e 20   is normally in 
20ef0 73 69 6e 67 6c 65 20 64 69 67 69 74 73 2c 20 61  single digits, a
20f00 20 6c 69 6e 65 61 72 20 73 65 61 72 63 68 20 69   linear search i
20f10 73 20 0a 20 20 2a 2a 20 61 64 65 71 75 61 74 65  s .  ** adequate
20f20 2e 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  . No need for a 
20f30 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 2a  binary search. *
20f40 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
20f50 4f 70 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Opt; i++){.    i
20f60 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
20f70 6d 70 28 7a 4f 70 74 4e 61 6d 65 2c 20 61 7a 43  mp(zOptName, azC
20f80 6f 6d 70 69 6c 65 4f 70 74 5b 69 5d 2c 20 6e 29  ompileOpt[i], n)
20f90 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ==0.     && sqli
20fa0 74 65 33 49 73 49 64 43 68 61 72 28 28 75 6e 73  te3IsIdChar((uns
20fb0 69 67 6e 65 64 20 63 68 61 72 29 61 7a 43 6f 6d  igned char)azCom
20fc0 70 69 6c 65 4f 70 74 5b 69 5d 5b 6e 5d 29 3d 3d  pileOpt[i][n])==
20fd0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  0.    ){.      r
20fe0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
20ff0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
21000 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21010 68 65 20 4e 2d 74 68 20 63 6f 6d 70 69 6c 65 2d  he N-th compile-
21020 74 69 6d 65 20 6f 70 74 69 6f 6e 20 73 74 72 69  time option stri
21030 6e 67 2e 20 20 49 66 20 4e 20 69 73 20 6f 75 74  ng.  If N is out
21040 20 6f 66 20 72 61 6e 67 65 2c 0a 2a 2a 20 72 65   of range,.** re
21050 74 75 72 6e 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  turn a NULL poin
21060 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ter..*/.const ch
21070 61 72 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 70  ar *sqlite3_comp
21080 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74 28 69 6e  ileoption_get(in
21090 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 74  t N){.  int nOpt
210a0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
210b0 2a 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20  *azCompileOpt;. 
210c0 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 20 3d 20   azCompileOpt = 
210d0 73 71 6c 69 74 65 33 43 6f 6d 70 69 6c 65 4f 70  sqlite3CompileOp
210e0 74 69 6f 6e 73 28 26 6e 4f 70 74 29 3b 0a 20 20  tions(&nOpt);.  
210f0 69 66 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 6e 4f  if( N>=0 && N<nO
21100 70 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pt ){.    return
21110 20 61 7a 43 6f 6d 70 69 6c 65 4f 70 74 5b 4e 5d   azCompileOpt[N]
21120 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
21130 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
21140 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c  LITE_OMIT_COMPIL
21150 45 4f 50 54 49 4f 4e 5f 44 49 41 47 53 20 2a 2f  EOPTION_DIAGS */
21160 0a                                               .