/ Hex Artifact Content
Login

Artifact 227a83d3f840d55e40360a1a8370c120f1466ea7d73b1fffb74b8f59ad0f4046:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 53 54 4d 54 56 54 41 42 0a 69 6e 74 20  LE_STMTVTAB.int 
0380: 73 71 6c 69 74 65 33 53 74 6d 74 56 74 61 62 49  sqlite3StmtVtabI
0390: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23  nit(sqlite3*);.#
03a0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
03b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a  ITE_ENABLE_FTS5.
03c0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
03d0: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23  nit(sqlite3*);.#
03e0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
03f0: 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49  QLITE_AMALGAMATI
0400: 4f 4e 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  ON./* IMPLEMENTA
0410: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 34 36 36 35 36  TION-OF: R-46656
0420: 2d 34 35 31 35 36 20 54 68 65 20 73 71 6c 69 74  -45156 The sqlit
0430: 65 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 73 74 72  e3_version[] str
0440: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20  ing constant.** 
0450: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78  contains the tex
0460: 74 20 6f 66 20 53 51 4c 49 54 45 5f 56 45 52 53  t of SQLITE_VERS
0470: 49 4f 4e 20 6d 61 63 72 6f 2e 20 0a 2a 2f 0a 63  ION macro. .*/.c
0480: 6f 6e 73 74 20 63 68 61 72 20 73 71 6c 69 74 65  onst char sqlite
0490: 33 5f 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51  3_version[] = SQ
04a0: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65  LITE_VERSION;.#e
04b0: 6e 64 69 66 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  ndif../* IMPLEME
04c0: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 33  NTATION-OF: R-53
04d0: 35 33 36 2d 34 32 35 37 35 20 54 68 65 20 73 71  536-42575 The sq
04e0: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
04f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0500: 72 6e 73 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  rns.** a pointer
0510: 20 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 73   to the to the s
0520: 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b 5d  qlite3_version[]
0530: 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74   string constant
0540: 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  . .*/.const char
0550: 20 2a 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72   *sqlite3_libver
0560: 73 69 6f 6e 28 76 6f 69 64 29 7b 20 72 65 74 75  sion(void){ retu
0570: 72 6e 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  rn sqlite3_versi
0580: 6f 6e 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d  on; }../* IMPLEM
0590: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 36  ENTATION-OF: R-6
05a0: 33 31 32 34 2d 33 39 33 30 30 20 54 68 65 20 73  3124-39300 The s
05b0: 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
05c0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
05d0: 6e 73 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  ns a.** pointer 
05e0: 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 73  to a string cons
05f0: 74 61 6e 74 20 77 68 6f 73 65 20 76 61 6c 75 65  tant whose value
0600: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
0610: 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 4f  the.** SQLITE_SO
0620: 55 52 43 45 5f 49 44 20 43 20 70 72 65 70 72 6f  URCE_ID C prepro
0630: 63 65 73 73 6f 72 20 6d 61 63 72 6f 2e 20 0a 2a  cessor macro. .*
0640: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
0650: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 76  lite3_sourceid(v
0660: 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c  oid){ return SQL
0670: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 3b 20 7d  ITE_SOURCE_ID; }
0680: 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54  ../* IMPLEMENTAT
0690: 49 4f 4e 2d 4f 46 3a 20 52 2d 33 35 32 31 30 2d  ION-OF: R-35210-
06a0: 36 33 35 30 38 20 54 68 65 20 73 71 6c 69 74 65  63508 The sqlite
06b0: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
06c0: 62 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 0a 2a  ber() function.*
06d0: 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74  * returns an int
06e0: 65 67 65 72 20 65 71 75 61 6c 20 74 6f 20 53 51  eger equal to SQ
06f0: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
0700: 42 45 52 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  BER..*/.int sqli
0710: 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e  te3_libversion_n
0720: 75 6d 62 65 72 28 76 6f 69 64 29 7b 20 72 65 74  umber(void){ ret
0730: 75 72 6e 20 53 51 4c 49 54 45 5f 56 45 52 53 49  urn SQLITE_VERSI
0740: 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a 0a 2f 2a  ON_NUMBER; }../*
0750: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0760: 4f 46 3a 20 52 2d 32 30 37 39 30 2d 31 34 30 32  OF: R-20790-1402
0770: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 74 68  5 The sqlite3_th
0780: 72 65 61 64 73 61 66 65 28 29 20 66 75 6e 63 74  readsafe() funct
0790: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 7a  ion returns.** z
07a0: 65 72 6f 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  ero if and only 
07b0: 69 66 20 53 51 4c 69 74 65 20 77 61 73 20 63 6f  if SQLite was co
07c0: 6d 70 69 6c 65 64 20 77 69 74 68 20 6d 75 74 65  mpiled with mute
07d0: 78 69 6e 67 20 63 6f 64 65 20 6f 6d 69 74 74 65  xing code omitte
07e0: 64 20 64 75 65 20 74 6f 0a 2a 2a 20 74 68 65 20  d due to.** the 
07f0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
0800: 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
0810: 70 74 69 6f 6e 20 62 65 69 6e 67 20 73 65 74 20  ption being set 
0820: 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
0830: 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28  ite3_threadsafe(
0840: 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51  void){ return SQ
0850: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b  LITE_THREADSAFE;
0860: 20 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 63   }../*.** When c
0870: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 74 65 73  ompiling the tes
0880: 74 20 66 69 78 74 75 72 65 20 6f 72 20 77 69 74  t fixture or wit
0890: 68 20 64 65 62 75 67 67 69 6e 67 20 65 6e 61 62  h debugging enab
08a0: 6c 65 64 20 28 6f 6e 20 57 69 6e 33 32 29 2c 0a  led (on Win32),.
08b0: 2a 2a 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ** this variable
08c0: 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 6e 6f   being set to no
08d0: 6e 2d 7a 65 72 6f 20 77 69 6c 6c 20 63 61 75 73  n-zero will caus
08e0: 65 20 4f 53 54 52 41 43 45 20 6d 61 63 72 6f 73  e OSTRACE macros
08f0: 20 74 6f 20 65 6d 69 74 0a 2a 2a 20 65 78 74 72   to emit.** extr
0900: 61 20 64 69 61 67 6e 6f 73 74 69 63 20 69 6e 66  a diagnostic inf
0910: 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  ormation..*/.#if
0920: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
0930: 4f 53 5f 54 52 41 43 45 0a 23 20 69 66 6e 64 65  OS_TRACE.# ifnde
0940: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  f SQLITE_DEBUG_O
0950: 53 5f 54 52 41 43 45 0a 23 20 20 20 64 65 66 69  S_TRACE.#   defi
0960: 6e 65 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f  ne SQLITE_DEBUG_
0970: 4f 53 5f 54 52 41 43 45 20 30 0a 23 20 65 6e 64  OS_TRACE 0.# end
0980: 69 66 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33  if.  int sqlite3
0990: 4f 53 54 72 61 63 65 20 3d 20 53 51 4c 49 54 45  OSTrace = SQLITE
09a0: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 3b  _DEBUG_OS_TRACE;
09b0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
09c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
09d0: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
09e0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
09f0: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  g function point
0a20: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  er is not NULL a
0a30: 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45 5f  nd if.** SQLITE_
0a40: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 69  ENABLE_IOTRACE i
0a50: 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
0a60: 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69 62  messages describ
0a70: 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69 76  ing.** I/O activ
0a80: 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75 73  e are written us
0a90: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
0aa0: 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61 67  n.  These messag
0ab0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 64  es.** are intend
0ac0: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
0ad0: 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e 0a   activity only..
0ae0: 2a 2f 0a 53 51 4c 49 54 45 5f 41 50 49 20 76 6f  */.SQLITE_API vo
0af0: 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  id (SQLITE_CDECL
0b00: 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65   *sqlite3IoTrace
0b10: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e  )(const char*, .
0b20: 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ..) = 0;.#endif.
0b30: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  ./*.** If the fo
0b40: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
0b50: 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20 74  ariable points t
0b60: 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  o a string which
0b70: 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20   is the.** name 
0b80: 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  of a directory, 
0b90: 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63 74  then that direct
0ba0: 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ory will be used
0bb0: 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d   to store.** tem
0bc0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a  porary files..**
0bd0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0be0: 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74   "PRAGMA temp_st
0bf0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0c00: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0c10: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d  har *sqlite3_tem
0c20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
0c30: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
0c40: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
0c50: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
0c60: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  to a string whic
0c70: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  h is the.** name
0c80: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c   of a directory,
0c90: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63   then that direc
0ca0: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65  tory will be use
0cb0: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 61 6c  d to store.** al
0cc0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
0cd0: 20 73 70 65 63 69 66 69 65 64 20 77 69 74 68 20   specified with 
0ce0: 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
0cf0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ame..**.** See a
0d00: 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41 20  lso the "PRAGMA 
0d10: 64 61 74 61 5f 73 74 6f 72 65 5f 64 69 72 65 63  data_store_direc
0d20: 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e  tory" SQL comman
0d30: 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  d..*/.char *sqli
0d40: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
0d50: 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ry = 0;../*.** I
0d60: 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69 74 65  nitialize SQLite
0d70: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
0d80: 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
0d90: 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69 61 6c  alled to initial
0da0: 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ize the memory a
0db0: 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46  llocation,.** VF
0dc0: 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73 75 62  S, and mutex sub
0dd0: 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20 74 6f  systems prior to
0de0: 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72 69 6f   doing any serio
0df0: 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20  us work with.** 
0e00: 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61 73 20  SQLite.  But as 
0e10: 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f 20 6e  long as you do n
0e20: 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ot compile with 
0e30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
0e40: 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75  INIT.** this rou
0e50: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
0e60: 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  led automaticall
0e70: 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69 6e 65  y by key routine
0e80: 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c  s such as.** sql
0e90: 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a  ite3_open().  .*
0ea0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0eb0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63  e is a no-op exc
0ec0: 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72 79 20  ept on its very 
0ed0: 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72 20 74  first call for t
0ee0: 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f  he process,.** o
0ef0: 72 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  r for the first 
0f00: 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63 61 6c  call after a cal
0f10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 68 75  l to sqlite3_shu
0f20: 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tdown..**.** The
0f30: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 74 6f   first thread to
0f40: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
0f50: 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e 69 74  ne runs the init
0f60: 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a  ialization to.**
0f70: 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66   completion.  If
0f80: 20 73 75 62 73 65 71 75 65 6e 74 20 74 68 72 65   subsequent thre
0f90: 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  ads call this ro
0fa0: 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74 68 65  utine before the
0fb0: 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65 61 64   first.** thread
0fc0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 74 68   has finished th
0fd0: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
0fe0: 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 74   process, then t
0ff0: 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  he subsequent.**
1000: 20 74 68 72 65 61 64 73 20 6d 75 73 74 20 62 6c   threads must bl
1010: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ock until the fi
1020: 72 73 74 20 74 68 72 65 61 64 20 66 69 6e 69 73  rst thread finis
1030: 68 65 73 20 77 69 74 68 20 74 68 65 20 69 6e 69  hes with the ini
1040: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a  tialization..**.
1050: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 68 72  ** The first thr
1060: 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c 20 74  ead might call t
1070: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 63 75  his routine recu
1080: 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75 72 73  rsively.  Recurs
1090: 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ive.** calls to 
10a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
10b0: 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f  uld not block, o
10c0: 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68 65 72  f course.  Other
10d0: 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74  wise the.** init
10e0: 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65  ialization proce
10f0: 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 63  ss would never c
1100: 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c  omplete..**.** L
1110: 65 74 20 58 20 62 65 20 74 68 65 20 66 69 72 73  et X be the firs
1120: 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e 74 65  t thread to ente
1130: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  r this routine. 
1140: 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65 20 6f   Let Y be some o
1150: 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20  ther.** thread. 
1160: 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68 65 20   Then while the 
1170: 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61 74 69  initial invocati
1180: 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  on of this routi
1190: 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e  ne by X is.** in
11a0: 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69 73 20  complete, it is 
11b0: 72 65 71 75 69 72 65 64 20 74 68 61 74 3a 0a 2a  required that:.*
11c0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73  *.**    *  Calls
11d0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
11e0: 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f   from Y must blo
11f0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f 75 74  ck until the out
1200: 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20  er-most.**      
1210: 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c   call by X compl
1220: 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  etes..**.**    *
1230: 20 20 52 65 63 75 72 73 69 76 65 20 63 61 6c 6c    Recursive call
1240: 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  s to this routin
1250: 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20 58 20  e from thread X 
1260: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
1270: 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68  ly.**       with
1280: 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  out blocking..*/
1290: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 69  .int sqlite3_ini
12a0: 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20  tialize(void){. 
12b0: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
12c0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
12d0: 73 74 65 72 3b 20 29 20 20 20 20 20 20 20 2f 2a  ster; )       /*
12e0: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
12f0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20   mutex */.  int 
1300: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1330: 6c 74 20 63 6f 64 65 20 2a 2f 0a 23 69 66 64 65  lt code */.#ifde
1340: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1350: 4e 49 54 0a 20 20 69 6e 74 20 62 52 75 6e 45 78  NIT.  int bRunEx
1360: 74 72 61 49 6e 69 74 20 3d 20 30 3b 20 20 20 20  traInit = 0;    
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 69 74     /* Extra init
1390: 69 61 6c 69 7a 61 74 69 6f 6e 20 6e 65 65 64 65  ialization neede
13a0: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  d */.#endif..#if
13b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13c0: 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  WSD.  rc = sqlit
13d0: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
13e0: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
13f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1400: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1410: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1420: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1430: 73 73 65 72 74 28 29 20 66 61 69 6c 73 20 6f 6e  ssert() fails on
1440: 20 73 6f 6d 65 20 6f 62 73 63 75 72 65 20 70 72   some obscure pr
1450: 6f 63 65 73 73 6f 72 2f 63 6f 6d 70 69 6c 65 72  ocessor/compiler
1460: 0a 20 20 2a 2a 20 63 6f 6d 62 69 6e 61 74 69 6f  .  ** combinatio
1470: 6e 2c 20 74 68 65 20 77 6f 72 6b 2d 61 72 6f 75  n, the work-arou
1480: 6e 64 20 69 73 20 74 6f 20 73 65 74 20 74 68 65  nd is to set the
1490: 20 63 6f 72 72 65 63 74 20 70 6f 69 6e 74 65 72   correct pointer
14a0: 0a 20 20 2a 2a 20 73 69 7a 65 20 61 74 20 63 6f  .  ** size at co
14b0: 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
14c0: 20 2d 44 53 51 4c 49 54 45 5f 50 54 52 53 49 5a   -DSQLITE_PTRSIZ
14d0: 45 3d 6e 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  E=n compile-time
14e0: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 61 73 73   option */.  ass
14f0: 65 72 74 28 20 53 51 4c 49 54 45 5f 50 54 52 53  ert( SQLITE_PTRS
1500: 49 5a 45 3d 3d 73 69 7a 65 6f 66 28 63 68 61 72  IZE==sizeof(char
1510: 2a 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  *) );..  /* If S
1520: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
1530: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74   completely init
1540: 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74 68  ialized, then th
1550: 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20  is call.  ** to 
1560: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1570: 7a 65 28 29 20 73 68 6f 75 6c 64 20 62 65 20 61  ze() should be a
1580: 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68 65   no-op.  But the
1590: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
15a0: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d    ** must be com
15b0: 70 6c 65 74 65 2e 20 20 53 6f 20 69 73 49 6e 69  plete.  So isIni
15c0: 74 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 73 65  t must not be se
15d0: 74 20 75 6e 74 69 6c 20 74 68 65 20 76 65 72 79  t until the very
15e0: 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69   end.  ** of thi
15f0: 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  s routine..  */.
1600: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1610: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1620: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1630: 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  _OK;..  /* Make 
1640: 73 75 72 65 20 74 68 65 20 6d 75 74 65 78 20 73  sure the mutex s
1650: 75 62 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74  ubsystem is init
1660: 69 61 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e 61  ialized.  If una
1670: 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69  ble to .  ** ini
1680: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65  tialize the mute
1690: 78 20 73 75 62 73 79 73 74 65 6d 2c 20 72 65 74  x subsystem, ret
16a0: 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 20 74  urn early with t
16b0: 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49  he error..  ** I
16c0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 69 73 20  f the system is 
16d0: 73 6f 20 73 69 63 6b 20 74 68 61 74 20 77 65 20  so sick that we 
16e0: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c  are unable to al
16f0: 6c 6f 63 61 74 65 20 61 20 6d 75 74 65 78 2c 0a  locate a mutex,.
1700: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f    ** there is no
1710: 74 20 6d 75 63 68 20 53 51 4c 69 74 65 20 69 73  t much SQLite is
1720: 20 67 6f 69 6e 67 20 74 6f 20 62 65 20 61 62 6c   going to be abl
1730: 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20  e to do..  **.  
1740: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 73 75 62  ** The mutex sub
1750: 73 79 73 74 65 6d 20 6d 75 73 74 20 74 61 6b 65  system must take
1760: 20 63 61 72 65 20 6f 66 20 73 65 72 69 61 6c 69   care of seriali
1770: 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a  zing its own.  *
1780: 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  * initialization
1790: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
17a0: 6c 69 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29  lite3MutexInit()
17b0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
17c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e  urn rc;..  /* In
17d0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c  itialize the mal
17e0: 6c 6f 63 28 29 20 73 79 73 74 65 6d 20 61 6e 64  loc() system and
17f0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
1800: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1810: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61  .  ** This opera
1820: 74 69 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65  tion is protecte
1830: 64 20 62 79 20 74 68 65 20 53 54 41 54 49 43 5f  d by the STATIC_
1840: 4d 41 53 54 45 52 20 6d 75 74 65 78 2e 20 20 4e  MASTER mutex.  N
1850: 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75  ote that.  ** Mu
1860: 74 65 78 41 6c 6c 6f 63 28 29 20 69 73 20 63 61  texAlloc() is ca
1870: 6c 6c 65 64 20 66 6f 72 20 61 20 73 74 61 74 69  lled for a stati
1880: 63 20 6d 75 74 65 78 20 70 72 69 6f 72 20 74 6f  c mutex prior to
1890: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
18a0: 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75  e.  ** malloc su
18b0: 62 73 79 73 74 65 6d 20 2d 20 74 68 69 73 20 69  bsystem - this i
18c0: 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
18d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20  allocation of a 
18e0: 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65  static.  ** mute
18f0: 78 20 6d 75 73 74 20 6e 6f 74 20 72 65 71 75 69  x must not requi
1900: 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  re support from 
1910: 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79  the malloc subsy
1920: 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54  stem..  */.  MUT
1930: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65  EX_LOGIC( pMaste
1940: 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  r = sqlite3Mutex
1950: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1960: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
1970: 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
1980: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
1990: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c  er);.  sqlite3Gl
19a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74  obalConfig.isMut
19b0: 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66  exInit = 1;.  if
19c0: 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ( !sqlite3Global
19d0: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
19e0: 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nit ){.    rc = 
19f0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69  sqlite3MallocIni
1a00: 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  t();.  }.  if( r
1a10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1a30: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
1a40: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  Init = 1;.    if
1a50: 28 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ( !sqlite3Global
1a60: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a70: 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
1a80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a90: 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20  InitMutex =.    
1aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75         sqlite3Mu
1ab0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1ac0: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
1ad0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
1ae0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1af0: 62 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73  bCoreMutex && !s
1b00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b10: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1b20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1b30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1b40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b50: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1b60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1b70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b80: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b  g.nRefInitMutex+
1b90: 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
1ba0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
1bb0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ster);..  /* If 
1bc0: 72 63 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  rc is not SQLITE
1bd0: 5f 4f 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e  _OK at this poin
1be0: 74 2c 20 74 68 65 6e 20 65 69 74 68 65 72 20 74  t, then either t
1bf0: 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73  he malloc.  ** s
1c00: 75 62 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e  ubsystem could n
1c10: 6f 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ot be initialize
1c20: 64 20 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20  d or the system 
1c30: 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61  failed to alloca
1c40: 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69  te.  ** the pIni
1c50: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65  tMutex mutex. Re
1c60: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e  turn an error in
1c70: 20 65 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a   either case.  *
1c80: 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
1c90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1ca0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
1cb0: 2a 20 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66  * Do the rest of
1cc0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1cd0: 69 6f 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65  ion under the re
1ce0: 63 75 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f  cursive mutex so
1cf0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69  .  ** that we wi
1d00: 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61  ll be able to ha
1d10: 6e 64 6c 65 20 72 65 63 75 72 73 69 76 65 20 63  ndle recursive c
1d20: 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  alls into.  ** s
1d30: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
1d40: 65 28 29 2e 20 20 54 68 65 20 72 65 63 75 72 73  e().  The recurs
1d50: 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c  ive calls normal
1d60: 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a  ly come through.
1d70: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f    ** sqlite3_os_
1d80: 69 6e 69 74 28 29 20 77 68 65 6e 20 69 74 20 69  init() when it i
1d90: 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76  nvokes sqlite3_v
1da0: 66 73 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62  fs_register(), b
1db0: 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65  ut other.  ** re
1dc0: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69  cursive calls mi
1dd0: 67 68 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73  ght also be poss
1de0: 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ible..  **.  ** 
1df0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
1e00: 46 3a 20 52 2d 30 30 31 34 30 2d 33 37 34 34 35  F: R-00140-37445
1e10: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69   SQLite automati
1e20: 63 61 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65 73  cally serializes
1e30: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74   calls.  ** to t
1e40: 68 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c  he xInit method,
1e50: 20 73 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65   so the xInit me
1e60: 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62 65  thod need not be
1e70: 20 74 68 72 65 61 64 73 61 66 65 2e 0a 20 20 2a   threadsafe..  *
1e80: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
1e90: 77 69 6e 67 20 6d 75 74 65 78 20 69 73 20 77 68  wing mutex is wh
1ea0: 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 61 63  at serializes ac
1eb0: 63 65 73 73 20 74 6f 20 74 68 65 20 61 70 70 64  cess to the appd
1ec0: 65 66 20 70 63 61 63 68 65 20 78 49 6e 69 74 0a  ef pcache xInit.
1ed0: 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54    ** methods.  T
1ee0: 68 65 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  he sqlite3_pcach
1ef0: 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74 28  e_methods.xInit(
1f00: 29 20 61 6c 6c 20 69 73 20 65 6d 62 65 64 64 65  ) all is embedde
1f10: 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61  d in the.  ** ca
1f20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61  ll to sqlite3Pca
1f30: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e  cheInitialize().
1f40: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1f50: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
1f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f70: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69  pInitMutex);.  i
1f80: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1f90: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
1fa0: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
1fb0: 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65  lConfig.inProgre
1fc0: 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ss==0 ){.    sql
1fd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1fe0: 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b  .inProgress = 1;
1ff0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2000: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20  NABLE_SQLLOG.   
2010: 20 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20   {.      extern 
2020: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 69  void sqlite3_ini
2030: 74 5f 73 71 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a  t_sqllog(void);.
2040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
2050: 69 74 5f 73 71 6c 6c 6f 67 28 29 3b 0a 20 20 20  it_sqllog();.   
2060: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65   }.#endif.    me
2070: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 42 75 69  mset(&sqlite3Bui
2080: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 2c 20 30  ltinFunctions, 0
2090: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
20a0: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
20b0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  ));.    sqlite3R
20c0: 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
20d0: 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69  nctions();.    i
20e0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
20f0: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
2100: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
2110: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
2120: 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  heInitialize();.
2130: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2140: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2150: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2160: 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68  alConfig.isPCach
2170: 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  eInit = 1;.     
2180: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49   rc = sqlite3OsI
2190: 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nit();.    }.   
21a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
21c0: 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53  te3PCacheBufferS
21d0: 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f  etup( sqlite3Glo
21e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c  balConfig.pPage,
21f0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
2200: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2210: 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47  szPage, sqlite3G
2220: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
2230: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
2240: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2250: 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66  Init = 1;.#ifdef
2260: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e   SQLITE_EXTRA_IN
2270: 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74  IT.      bRunExt
2280: 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64  raInit = 1;.#end
2290: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  if.    }.    sql
22a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
22b0: 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  .inProgress = 0;
22c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
22d0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
22e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
22f0: 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  InitMutex);..  /
2300: 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20  * Go back under 
2310: 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78  the static mutex
2320: 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68   and clean up th
2330: 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a  e recursive.  **
2340: 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e   mutex to preven
2350: 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61  t a resource lea
2360: 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  k..  */.  sqlite
2370: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
2380: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
2390: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
23a0: 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20  efInitMutex--;. 
23b0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
23c0: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
23d0: 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20  tMutex<=0 ){.   
23e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2400: 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b  fInitMutex==0 );
2410: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
2420: 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47  ex_free(sqlite3G
2430: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
2440: 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c  tMutex);.    sql
2450: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2460: 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b  .pInitMutex = 0;
2470: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
2480: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
2490: 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  er);..  /* The f
24a0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74  ollowing is just
24b0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20   a sanity check 
24c0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c  to make sure SQL
24d0: 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65  ite has.  ** bee
24e0: 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65  n compiled corre
24f0: 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70  ctly.  It is imp
2500: 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68  ortant to run th
2510: 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a  is code, but.  *
2520: 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
2530: 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66  to run it too of
2540: 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20  ten and soak up 
2550: 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e  CPU cycles for n
2560: 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20  o.  ** reason.  
2570: 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63  So we run it onc
2580: 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c  e during initial
2590: 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ization..  */.#i
25a0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66  fndef NDEBUG.#if
25b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25c0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
25d0: 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f    /* This sectio
25e0: 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79  n of code's only
25f0: 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61   "output" is via
2600: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
2610: 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20  ents. */.  if ( 
2620: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2630: 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28  .    u64 x = (((
2640: 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20  u64)1)<<63)-1;. 
2650: 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20     double y;.   
2660: 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78   assert(sizeof(x
2670: 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72  )==8);.    asser
2680: 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a  t(sizeof(x)==siz
2690: 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d  eof(y));.    mem
26a0: 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a  cpy(&y, &x, 8);.
26b0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
26c0: 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20  te3IsNaN(y) );. 
26d0: 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66   }.#endif.#endif
26e0: 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20  ..  /* Do extra 
26f0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73  initialization s
2700: 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62  teps requested b
2710: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54  y the SQLITE_EXT
2720: 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d  RA_INIT.  ** com
2730: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
2740: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
2750: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
2760: 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49    if( bRunExtraI
2770: 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53  nit ){.    int S
2780: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2790: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  (const char*);. 
27a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
27b0: 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20  XTRA_INIT(0);.  
27c0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
27d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27e0: 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73  Undo the effects
27f0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   of sqlite3_init
2800: 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20  ialize().  Must 
2810: 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68  not be called wh
2820: 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  ile.** there are
2830: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74   outstanding dat
2840: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2850: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2860: 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68  cations or.** wh
2870: 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20  ile any part of 
2880: 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77  SQLite is otherw
2890: 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e  ise in use in an
28a0: 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a  y thread.  This.
28b0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  ** routine is no
28c0: 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42  t threadsafe.  B
28d0: 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  ut it is safe to
28e0: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
28f0: 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20  tine.** on when 
2900: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
2910: 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66  y shut down.  If
2920: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2930: 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20  dy shut down.** 
2940: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2950: 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68  e is invoked, th
2960: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2970: 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
2980: 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
2990: 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69  te3_shutdown(voi
29a0: 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d){.#ifdef SQLIT
29b0: 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e 74  E_OMIT_WSD.  int
29c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73   rc = sqlite3_ws
29d0: 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29  d_init(4096, 24)
29e0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
29f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
2a00: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
2a10: 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  if..  if( sqlite
2a20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2a30: 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53  Init ){.#ifdef S
2a40: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2a50: 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51  DOWN.    void SQ
2a60: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2a70: 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53  OWN(void);.    S
2a80: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2a90: 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20  DOWN();.#endif. 
2aa0: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e     sqlite3_os_en
2ab0: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2ac0: 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65  _reset_auto_exte
2ad0: 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c  nsion();.    sql
2ae0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2af0: 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  .isInit = 0;.  }
2b00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2b10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
2b20: 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  cheInit ){.    s
2b30: 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74  qlite3PcacheShut
2b40: 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  down();.    sqli
2b50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b60: 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30  isPCacheInit = 0
2b70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2b80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b90: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a  isMallocInit ){.
2ba0: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f      sqlite3Mallo
2bb0: 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  cEnd();.    sqli
2bc0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2bd0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30  isMallocInit = 0
2be0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2bf0: 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f  E_OMIT_SHUTDOWN_
2c00: 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20  DIRECTORIES.    
2c10: 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73  /* The heap subs
2c20: 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65  ystem has now be
2c30: 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20  en shutdown and 
2c40: 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65  these values are
2c50: 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a   supposed.    **
2c60: 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70   to be NULL or p
2c70: 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74  oint to memory t
2c80: 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64  hat was obtained
2c90: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
2ca0: 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77  lloc(),.    ** w
2cb0: 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20  hich would rely 
2cc0: 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62  on that heap sub
2cd0: 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72  system; therefor
2ce0: 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
2cf0: 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  se.    ** values
2d00: 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f   cannot refer to
2d10: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61   heap memory tha
2d20: 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c  t was just inval
2d30: 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a  idated when the.
2d40: 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73      ** heap subs
2d50: 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f  ystem was shutdo
2d60: 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c  wn.  This is onl
2d70: 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75  y done if the cu
2d80: 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20  rrent call to.  
2d90: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
2da0: 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74  on resulted in t
2db0: 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65  he heap subsyste
2dc0: 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  m actually being
2dd0: 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a   shutdown..    *
2de0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61  /.    sqlite3_da
2df0: 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30  ta_directory = 0
2e00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65  ;.    sqlite3_te
2e10: 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30  mp_directory = 0
2e20: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
2e30: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2e40: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
2e50: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
2e60: 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20  3MutexEnd();.   
2e70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2e80: 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74  nfig.isMutexInit
2e90: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
2ea0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2eb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49  ../*.** This API
2ec0: 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74   allows applicat
2ed0: 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74  ions to modify t
2ee0: 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67  he global config
2ef0: 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  uration of.** th
2f00: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
2f10: 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a   at run-time..**
2f20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f30: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2f40: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
2f50: 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
2f60: 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  ding.** database
2f70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20   connections or 
2f80: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2f90: 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ns.  This routin
2fa0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65  e is not.** thre
2fb0: 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65  adsafe.  Failure
2fc0: 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77   to heed these w
2fd0: 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64  arnings can lead
2fe0: 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c   to unpredictabl
2ff0: 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a  e.** behavior..*
3000: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
3010: 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  nfig(int op, ...
3020: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
3030: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
3040: 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c  TE_OK;..  /* sql
3050: 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68  ite3_config() sh
3060: 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  all return SQLIT
3070: 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69  E_MISUSE if it i
3080: 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a  s invoked while.
3090: 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20    ** the SQLite 
30a0: 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73  library is in us
30b0: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  e. */.  if( sqli
30c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
30d0: 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20  isInit ) return 
30e0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
30f0: 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28  PT;..  va_start(
3100: 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
3110: 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  h( op ){..    /*
3120: 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61   Mutex configura
3130: 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65  tion options are
3140: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
3150: 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a  in a threadsafe.
3160: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a      ** compile..
3170: 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e      */.#if defin
3180: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
3190: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
31a0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f 2a  THREADSAFE>0  /*
31b0: 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34 36   IMP: R-54466-46
31c0: 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  756 */.    case 
31d0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49  SQLITE_CONFIG_SI
31e0: 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20  NGLETHREAD: {.  
31f0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3200: 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30 39  OF: R-02748-1909
3210: 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65  6 This option se
3220: 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67  ts the threading
3230: 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a   mode to.      *
3240: 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64 2e  * Single-thread.
3250: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3260: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
3270: 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  oreMutex = 0;  /
3280: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3290: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
32a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32b0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
32c0: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
32d0: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
32e0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
32f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3300: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3310: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3320: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3330: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3340: 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20 2a   R-20520-54086 *
3350: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
3360: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
3370: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
3380: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3390: 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69 73  14374-42468 This
33a0: 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65   option sets the
33b0: 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20   threading mode 
33c0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c 74  to.      ** Mult
33d0: 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20  i-thread. */.   
33e0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
33f0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
3400: 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c  x = 1;  /* Enabl
3410: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
3420: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3430: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3440: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3450: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3460: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
3470: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3480: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
3490: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
34a0: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
34b0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
34c0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39 33   /* IMP: R-59593
34d0: 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63 61  -21810 */.    ca
34e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
34f0: 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20  _SERIALIZED: {. 
3500: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3510: 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31 38  -OF: R-41220-518
3520: 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  00 This option s
3530: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3540: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3550: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20 2a  ** Serialized. *
3560: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3570: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
3580: 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20  eMutex = 1;  /* 
3590: 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20  Enable mutex on 
35a0: 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  core */.      sq
35b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
35c0: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31  g.bFullMutex = 1
35d0: 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74  ;  /* Enable mut
35e0: 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  ex on connection
35f0: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
3600: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
3610: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3620: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3630: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3640: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 36  FE>0 /* IMP: R-6
3650: 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20 20  3666-48755 */.  
3660: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3670: 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20  NFIG_MUTEX: {.  
3680: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
3690: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75  n alternative mu
36a0: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
36b0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
36c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
36d0: 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28  mutex = *va_arg(
36e0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
36f0: 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  x_methods*);.   
3700: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3710: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
3720: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
3730: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
3740: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3750: 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37 35  IMP: R-14450-375
3760: 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  97 */.    case S
3770: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3780: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
3790: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
37a0: 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70  urrent mutex imp
37b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
37c0: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
37d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
37e0: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
37f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3800: 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61  utex;.      brea
3810: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3820: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3830: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20  _CONFIG_MALLOC: 
3840: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3850: 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34 2d  NCE-OF: R-55594-
3860: 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54 45  21030 The SQLITE
3870: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f  _CONFIG_MALLOC o
3880: 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20  ption takes a.  
3890: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72      ** single ar
38a0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
38b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
38c0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a  instance of the.
38d0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
38e0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72  _mem_methods str
38f0: 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67 75  ucture. The argu
3900: 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20 61  ment specifies a
3910: 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20 20  lternative.     
3920: 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65   ** low-level me
3930: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3940: 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20 75  routines to be u
3950: 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
3960: 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20  the memory.     
3970: 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72   ** allocation r
3980: 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69 6e  outines built in
3990: 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20 20  to SQLite. */.  
39a0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
39b0: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f  lConfig.m = *va_
39c0: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
39d0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  mem_methods*);. 
39e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
39f0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3a00: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c  E_CONFIG_GETMALL
3a10: 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  OC: {.      /* E
3a20: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
3a30: 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53 51  213-46414 The SQ
3a40: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
3a50: 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b  ALLOC option tak
3a60: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
3a70: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
3a80: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
3a90: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
3aa0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  of the.      ** 
3ab0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3ac0: 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20 54  ods structure. T
3ad0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  he sqlite3_mem_m
3ae0: 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72 65  ethods structure
3af0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c   is.      ** fil
3b00: 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75 72  led with the cur
3b10: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 6d  rently defined m
3b20: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3b30: 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20 20   routines. */.  
3b40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
3b50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d  lobalConfig.m.xM
3b60: 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74  alloc==0 ) sqlit
3b70: 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28  e3MemSetDefault(
3b80: 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67  );.      *va_arg
3b90: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
3ba0: 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c  _methods*) = sql
3bb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3bc0: 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  .m;.      break;
3bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3be0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
3bf0: 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20  MSTATUS: {.     
3c00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3c10: 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20 54   R-61275-35157 T
3c20: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
3c30: 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69 6f  _MEMSTATUS optio
3c40: 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a  n takes.      **
3c50: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
3c60: 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69 6e   of type int, in
3c70: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 62  terpreted as a b
3c80: 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65 6e  oolean, which en
3c90: 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  ables.      ** o
3ca0: 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 63  r disables the c
3cb0: 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65 6d  ollection of mem
3cc0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  ory allocation s
3cd0: 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20 20  tatistics. */.  
3ce0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3cf0: 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74  lConfig.bMemstat
3d00: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3d10: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3d20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3d30: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 4d  SQLITE_CONFIG_SM
3d40: 41 4c 4c 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  ALL_MALLOC: {.  
3d50: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3d60: 6c 43 6f 6e 66 69 67 2e 62 53 6d 61 6c 6c 4d 61  lConfig.bSmallMa
3d70: 6c 6c 6f 63 20 3d 20 76 61 5f 61 72 67 28 61 70  lloc = va_arg(ap
3d80: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
3d90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3da0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3db0: 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20  G_PAGECACHE: {. 
3dc0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
3dd0: 2d 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36 36  -OF: R-18761-366
3de0: 30 31 20 54 68 65 72 65 20 61 72 65 20 74 68 72  01 There are thr
3df0: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
3e00: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
3e10: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
3e20: 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 38  : A pointer to 8
3e30: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3e40: 6d 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20  mory (pMem),.   
3e50: 20 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f     ** the size o
3e60: 66 20 65 61 63 68 20 70 61 67 65 20 63 61 63 68  f each page cach
3e70: 65 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64  e line (sz), and
3e80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
3e90: 61 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20 20  ache lines.     
3ea0: 20 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20   ** (N). */.    
3eb0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3ec0: 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61  onfig.pPage = va
3ed0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
3ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67  obalConfig.szPag
3f00: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3f10: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3f20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3f30: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
3f40: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
3f50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3f60: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3f70: 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a 20  G_PCACHE_HDRSZ: 
3f80: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3f90: 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d  NCE-OF: R-39100-
3fa0: 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54 45  27317 The SQLITE
3fb0: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48  _CONFIG_PCACHE_H
3fc0: 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65  DRSZ option take
3fd0: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e  s.      ** a sin
3fe0: 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77 68  gle parameter wh
3ff0: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
4000: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61   to an integer a
4010: 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a 20  nd writes into. 
4020: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e 74       ** that int
4030: 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20  eger the number 
4040: 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20 70  of extra bytes p
4050: 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65 64  er page required
4060: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a 20   for each page. 
4070: 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54       ** in SQLIT
4080: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
4090: 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  HE. */.      *va
40a0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d  _arg(ap, int*) =
40b0: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
40c0: 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74 72  te3HeaderSizeBtr
40d0: 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20  ee() +.         
40e0: 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69   sqlite3HeaderSi
40f0: 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20 20  zePcache() +.   
4100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65         sqlite3He
4110: 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31 28  aderSizePcache1(
4120: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4130: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
4140: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
4150: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
4160: 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
4170: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4180: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4190: 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b  FIG_GETPCACHE: {
41a0: 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e  .      /* now an
41b0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
41c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
41d0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
41e0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
41f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
4200: 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f  ACHE2: {.      /
4210: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4220: 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68 65  -63325-48378 The
4230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
4240: 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74 61  CACHE2 option ta
4250: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
4260: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
4270: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
4280: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
4290: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a  pcache_methods2.
42a0: 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e        ** object.
42b0: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70 65   This object spe
42c0: 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65 72  cifies the inter
42d0: 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f 6d  face to a custom
42e0: 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20 20   page cache.    
42f0: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74    ** implementat
4300: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ion. */.      sq
4310: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4320: 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f  g.pcache2 = *va_
4330: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
4340: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a  pcache_methods2*
4350: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4360: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
4370: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
4380: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
4390: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
43a0: 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20 54   R-22035-46182 T
43b0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
43c0: 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74 69  _GETPCACHE2 opti
43d0: 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20  on takes a.     
43e0: 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d   ** single argum
43f0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70  ent which is a p
4400: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
4410: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
4420: 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62  ods2.      ** ob
4430: 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f 70  ject. SQLite cop
4440: 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ies of the curre
4450: 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69 6d  nt page cache im
4460: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
4470: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  o.      ** that 
4480: 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20  object. */.     
4490: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
44a0: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
44b0: 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  .xInit==0 ){.   
44c0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
44d0: 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  heSetDefault();.
44e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76        }.      *v
44f0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
4500: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4510: 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  2*) = sqlite3Glo
4520: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
4530: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
4540: 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e      }../* EVIDEN
4550: 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31  CE-OF: R-06626-1
4560: 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45 5f  2911 The SQLITE_
4570: 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74 69  CONFIG_HEAP opti
4580: 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76  on is only.** av
4590: 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69 74  ailable if SQLit
45a0: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  e is compiled wi
45b0: 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  th either SQLITE
45c0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20  _ENABLE_MEMSYS3 
45d0: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41  or.** SQLITE_ENA
45e0: 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20  BLE_MEMSYS5 and 
45f0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
4600: 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64 20  RROR if invoked 
4610: 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69  otherwise. */.#i
4620: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4630: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29  _ENABLE_MEMSYS3)
4640: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
4650: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
4660: 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  5).    case SQLI
4670: 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20  TE_CONFIG_HEAP: 
4680: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
4690: 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d  NCE-OF: R-19854-
46a0: 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65 20  42126 There are 
46b0: 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20  three arguments 
46c0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  to.      ** SQLI
46d0: 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20  TE_CONFIG_HEAP: 
46e0: 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  An 8-byte aligne
46f0: 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
4700: 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20   memory, the.   
4710: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
4720: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65 6d  bytes in the mem
4730: 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64 20  ory buffer, and 
4740: 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
4750: 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20  cation size..   
4760: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
4770: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4780: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
4790: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
47a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
47b0: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
47c0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
47d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
47e0: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
47f0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4800: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
4810: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4820: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
4830: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4840: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
4850: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4860: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
4870: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
4880: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
4890: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
48a0: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
48b0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
48c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
48d0: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
48e0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
48f0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
4900: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
4910: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
4920: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32  DENCE-OF: R-4992
4930: 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20 66  0-60189 If the f
4940: 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74 68  irst pointer (th
4950: 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72  e memory pointer
4960: 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  ).        ** is 
4970: 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74  NULL, then SQLit
4980: 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73 69  e reverts to usi
4990: 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20 6d  ng its default m
49a0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a  emory allocator.
49b0: 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20          ** (the 
49c0: 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20  system malloc() 
49d0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c  implementation),
49e0: 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72 69   undoing any pri
49f0: 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  or invocation of
4a00: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  .        ** SQLI
4a10: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
4a20: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
4a30: 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67 20       ** Setting 
4a40: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4a50: 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72  fig.m to all zer
4a60: 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d 61  os will cause ma
4a70: 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20 20  lloc to.        
4a80: 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74 73  ** revert to its
4a90: 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65   default impleme
4aa0: 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c  ntation when sql
4ab0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
4ac0: 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20 20  ) is run.       
4ad0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   */.        mems
4ae0: 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61  et(&sqlite3Globa
4af0: 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69  lConfig.m, 0, si
4b00: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
4b10: 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20  alConfig.m));.  
4b20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4b30: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
4b40: 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31 38  F: R-61006-08918
4b50: 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 70   If the memory p
4b60: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ointer is not NU
4b70: 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  LL then the.    
4b80: 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69      ** alternati
4b90: 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ve memory alloca
4ba0: 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20 74  tor is engaged t
4bb0: 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20  o handle all of 
4bc0: 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20 20  SQLites.        
4bd0: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
4be0: 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23  tion needs. */.#
4bf0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4c00: 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20  BLE_MEMSYS3.    
4c10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4c20: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c  lConfig.m = *sql
4c30: 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73  ite3MemGetMemsys
4c40: 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  3();.#endif.#ifd
4c50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4c60: 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20  _MEMSYS5.       
4c70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4c80: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4c90: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29  3MemGetMemsys5()
4ca0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
4cb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4cc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
4cd0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
4ce0: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
4cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4d00: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
4d10: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
4d20: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
4d30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4d40: 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  ig.nLookaside = 
4d50: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4d60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d70: 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20    }.    .    /* 
4d80: 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  Record a pointer
4d90: 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66   to the logger f
4da0: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20  unction and its 
4db0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
4dc0: 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75      ** The defau
4dd0: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67  lt is NULL.  Log
4de0: 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  ging is disabled
4df0: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
4e00: 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20   pointer is.    
4e10: 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  ** NULL..    */.
4e20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4e30: 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20  CONFIG_LOG: {.  
4e40: 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
4e50: 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
4e60: 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
4e70: 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
4e80: 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
4e90: 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
4ea0: 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
4eb0: 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
4ec0: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
4ed0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a  a_arg(ap, void(*
4ee0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
4ef0: 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
4f00: 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
4f10: 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f  f void(*LOGFUNC_
4f20: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  t)(void*,int,con
4f30: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
4f40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4f50: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
4f60: 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74  rg(ap, LOGFUNC_t
4f70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4f80: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f  GlobalConfig.pLo
4f90: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
4fa0: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
4fb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4fc0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4fd0: 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37 20  : R-55548-33817 
4fe0: 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  The compile-time
4ff0: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52 49   setting for URI
5000: 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a   filenames.    *
5010: 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
5020: 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 75   at start-time u
5030: 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  sing the.    ** 
5040: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
5050: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
5060: 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  ,1) or.    ** sq
5070: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
5080: 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30  ITE_CONFIG_URI,0
5090: 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ) configuration 
50a0: 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  calls..    */.  
50b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
50c0: 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20  NFIG_URI: {.    
50d0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
50e0: 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35 20  : R-25451-61125 
50f0: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
5100: 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b  G_URI option tak
5110: 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20  es a single.    
5120: 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66    ** argument of
5130: 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f   type int. If no
5140: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52 49  n-zero, then URI
5150: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f   handling is glo
5160: 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65  bally.      ** e
5170: 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20 70  nabled. If the p
5180: 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f  arameter is zero
5190: 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c  , then URI handl
51a0: 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a  ing is globally.
51b0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
51c0: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  d. */.      sqli
51d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
51e0: 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72  bOpenUri = va_ar
51f0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
5200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5210: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5220: 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f  CONFIG_COVERING_
5230: 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20  INDEX_SCAN: {.  
5240: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5250: 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37 37  OF: R-36592-0277
5260: 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  2 The SQLITE_CON
5270: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
5280: 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a  EX_SCAN.      **
5290: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20   option takes a 
52a0: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61  single integer a
52b0: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
52c0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
52d0: 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65  a.      ** boole
52e0: 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  an in order to e
52f0: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
5300: 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76 65   the use of cove
5310: 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f 72  ring indices for
5320: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74  .      ** full t
5330: 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74 68  able scans in th
5340: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
5350: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
5360: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5370: 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72 67  bUseCis = va_arg
5380: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
5390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
53a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
53b0: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63  BLE_SQLLOG.    c
53c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
53d0: 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20  G_SQLLOG: {.    
53e0: 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a    typedef void(*
53f0: 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  SQLLOGFUNC_t)(vo
5400: 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  id*, sqlite3*, c
5410: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
5420: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5430: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
5440: 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  log = va_arg(ap,
5450: 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a   SQLLOGFUNC_t);.
5460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5470: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
5480: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
5490: 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20  , void *);.     
54a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
54b0: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
54c0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
54d0: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
54e0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
54f0: 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53 51  R-58063-38258 SQ
5500: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
5510: 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f 20  _SIZE takes two 
5520: 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  64-bit.      ** 
5530: 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65 33  integer (sqlite3
5540: 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20 74  _int64) values t
5550: 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66 61  hat are the defa
5560: 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69  ult mmap size li
5570: 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  mit.      ** (th
5580: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
5590: 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61  g for PRAGMA mma
55a0: 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65 20  p_size) and the 
55b0: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a  maximum allowed.
55c0: 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69        ** mmap si
55d0: 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20  ze limit. */.   
55e0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
55f0: 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67   szMmap = va_arg
5600: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  (ap, sqlite3_int
5610: 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  64);.      sqlit
5620: 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20  e3_int64 mxMmap 
5630: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
5640: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20  ite3_int64);.   
5650: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
5660: 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39 30  F: R-53367-43190
5670: 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75 6d   If either argum
5680: 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74 69  ent to this opti
5690: 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e  on is.      ** n
56a0: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
56b0: 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 63  at argument is c
56c0: 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63 6f  hanged to its co
56d0: 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61 75  mpile-time defau
56e0: 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  lt..      **.   
56f0: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
5700: 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33 31  F: R-34993-45031
5710: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
5720: 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20 77  owed mmap size w
5730: 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
5740: 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61 74  silently truncat
5750: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ed if necessary 
5760: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
5770: 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a 20  not exceed the. 
5780: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d       ** compile-
5790: 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  time maximum mma
57a0: 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74 68  p size set by th
57b0: 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  e SQLITE_MAX_MMA
57c0: 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20  P_SIZE.      ** 
57d0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
57e0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
57f0: 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30      if( mxMmap<0
5800: 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54   || mxMmap>SQLIT
5810: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20  E_MAX_MMAP_SIZE 
5820: 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d 61  ){.        mxMma
5830: 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  p = SQLITE_MAX_M
5840: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
5850: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  }.      if( szMm
5860: 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20  ap<0 ) szMmap = 
5870: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
5880: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
5890: 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61  if( szMmap>mxMma
58a0: 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d  p) szMmap = mxMm
58b0: 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ap;.      sqlite
58c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
58d0: 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20  Mmap = mxMmap;. 
58e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
58f0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20  alConfig.szMmap 
5900: 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20  = szMmap;.      
5910: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
5920: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  f SQLITE_OS_WIN 
5930: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5940: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20  E_WIN32_MALLOC) 
5950: 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d  /* IMP: R-04780-
5960: 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61 73  55815 */.    cas
5970: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5980: 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a 20  WIN32_HEAPSIZE: 
5990: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
59a0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d  NCE-OF: R-34926-
59b0: 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e  03360 SQLITE_CON
59c0: 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49  FIG_WIN32_HEAPSI
59d0: 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62 69  ZE takes a 32-bi
59e0: 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69 67  t.      ** unsig
59f0: 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ned integer valu
5a00: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
5a10: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
5a20: 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65 64  e of the created
5a30: 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e 20  .      ** heap. 
5a40: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5a50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
5a60: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
5a70: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
5a80: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
5a90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5aa0: 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b  _CONFIG_PMASZ: {
5ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61  obalConfig.szPma
5ad0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
5ae0: 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
5af0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5b00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5b10: 5f 43 4f 4e 46 49 47 5f 53 54 4d 54 4a 52 4e 4c  _CONFIG_STMTJRNL
5b20: 5f 53 50 49 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  _SPILL: {.      
5b30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5b40: 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 20 3d  fig.nStmtSpill =
5b50: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5b60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5b70: 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c     }..    defaul
5b80: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t: {.      rc = 
5b90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5ba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5bb0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
5bc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
5be0: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75  the lookaside bu
5bf0: 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61  ffers for a data
5c00: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
5c10: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
5c20: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
5c30: 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69    .** If lookasi
5c40: 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  de is already ac
5c50: 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c  tive, return SQL
5c60: 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20  ITE_BUSY..**.** 
5c70: 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72  The sz parameter
5c80: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
5c90: 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20  f bytes in each 
5ca0: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a  lookaside slot..
5cb0: 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d  ** The cnt param
5cc0: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
5cd0: 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66  er of slots.  If
5ce0: 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20   pStart is NULL 
5cf0: 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72  the.** space for
5d00: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
5d10: 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65  emory is obtaine
5d20: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
5d30: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70  alloc()..** If p
5d40: 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  Start is not NUL
5d50: 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a  L then it is sz*
5d60: 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  cnt bytes of mem
5d70: 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a  ory to use for.*
5d80: 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  * the lookaside 
5d90: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
5da0: 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61  c int setupLooka
5db0: 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  side(sqlite3 *db
5dc0: 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
5dd0: 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  t sz, int cnt){.
5de0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5df0: 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20  MIT_LOOKASIDE.  
5e00: 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20  void *pStart;.  
5e10: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
5e20: 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65  e.nOut ){.    re
5e30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5e40: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20  ;.  }.  /* Free 
5e50: 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f  any existing loo
5e60: 6b 61 73 69 64 65 20 62 75 66 66 65 72 20 66 6f  kaside buffer fo
5e70: 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65  r this handle be
5e80: 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  fore.  ** alloca
5e90: 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73  ting a new one s
5ea0: 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  o we don't have 
5eb0: 74 6f 20 68 61 76 65 20 73 70 61 63 65 20 66 6f  to have space fo
5ec0: 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20  r .  ** both at 
5ed0: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
5ee0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f   */.  if( db->lo
5ef0: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
5f00: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
5f10: 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73  _free(db->lookas
5f20: 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d  ide.pStart);.  }
5f30: 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f  .  /* The size o
5f40: 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c  f a lookaside sl
5f50: 6f 74 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f  ot after ROUNDDO
5f60: 57 4e 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20  WN8 needs to be 
5f70: 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e  larger.  ** than
5f80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65   a pointer to be
5f90: 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20   useful..  */.  
5fa0: 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  sz = ROUNDDOWN8(
5fb0: 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  sz);  /* IMP: R-
5fc0: 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20  33038-09382 */. 
5fd0: 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69   if( sz<=(int)si
5fe0: 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  zeof(LookasideSl
5ff0: 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20  ot*) ) sz = 0;. 
6000: 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74   if( cnt<0 ) cnt
6010: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d   = 0;.  if( sz==
6020: 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20  0 || cnt==0 ){. 
6030: 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70     sz = 0;.    p
6040: 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Start = 0;.  }el
6050: 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  se if( pBuf==0 )
6060: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
6070: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
6080: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73  ;.    pStart = s
6090: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a  qlite3Malloc( sz
60a0: 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  *cnt );  /* IMP:
60b0: 20 52 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a   R-61949-35727 *
60c0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  /.    sqlite3End
60d0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
60e0: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
60f0: 20 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   cnt = sqlite3Ma
6100: 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29  llocSize(pStart)
6110: 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  /sz;.  }else{.  
6120: 20 20 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b    pStart = pBuf;
6130: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .  }.  db->looka
6140: 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53  side.pStart = pS
6150: 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b  tart;.  db->look
6160: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b  aside.pFree = 0;
6170: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
6180: 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20  .sz = (u16)sz;. 
6190: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
61a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f     int i;.    Lo
61b0: 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a  okasideSlot *p;.
61c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e      assert( sz >
61d0: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f   (int)sizeof(Loo
61e0: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a  kasideSlot*) );.
61f0: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
6200: 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a  deSlot*)pStart;.
6210: 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b      for(i=cnt-1;
6220: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
6230: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62     p->pNext = db
6240: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
6250: 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f  e;.      db->loo
6260: 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70  kaside.pFree = p
6270: 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f  ;.      p = (Loo
6280: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75  kasideSlot*)&((u
6290: 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d  8*)p)[sz];.    }
62a0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
62b0: 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20  de.pEnd = p;.   
62c0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
62d0: 44 69 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  Disable = 0;.   
62e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
62f0: 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d  Malloced = pBuf=
6300: 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65  =0 ?1:0;.  }else
6310: 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  {.    db->lookas
6320: 69 64 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b  ide.pStart = db;
6330: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
6340: 64 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20  de.pEnd = db;.  
6350: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6360: 62 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20  bDisable = 1;.  
6370: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6380: 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20  bMalloced = 0;. 
6390: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
63a0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49  ITE_OMIT_LOOKASI
63b0: 44 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53  DE */.  return S
63c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
63d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 75  ** Return the mu
63e0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
63f0: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
6400: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71  onnection..*/.sq
6410: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c  lite3_mutex *sql
6420: 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73 71  ite3_db_mutex(sq
6430: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
6440: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6450: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
6460: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
6470: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
6480: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
6490: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
64a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
64b0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
64c0: 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->mutex;.}../*.*
64d0: 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63  * Free up as muc
64e0: 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63  h memory as we c
64f0: 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  an from the give
6500: 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  n database.** co
6510: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nnection..*/.int
6520: 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
6530: 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74  ase_memory(sqlit
6540: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
6550: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
6560: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
6570: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
6580: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
6590: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
65a0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
65b0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
65c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
65d0: 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
65e0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
65f0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
6600: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
6610: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
6620: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
6630: 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a  .    if( pBt ){.
6640: 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
6650: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
6660: 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
6670: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
6680: 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a  Shrink(pPager);.
6690: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
66a0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
66b0: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (db);.  sqlite3_
66c0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
66d0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
66e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
66f0: 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64  *.** Flush any d
6700: 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
6710: 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 66 6f  e pager-cache fo
6720: 72 20 61 6e 79 20 61 74 74 61 63 68 65 64 20 64  r any attached d
6730: 61 74 61 62 61 73 65 0a 2a 2a 20 74 6f 20 64 69  atabase.** to di
6740: 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
6750: 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68  e3_db_cacheflush
6760: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
6770: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
6780: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6790: 69 6e 74 20 62 53 65 65 6e 42 75 73 79 20 3d 20  int bSeenBusy = 
67a0: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
67b0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
67c0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
67d0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
67e0: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
67f0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
6800: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
6810: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
6820: 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74  >mutex);.  sqlit
6830: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
6840: 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  db);.  for(i=0; 
6850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6860: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6870: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
6880: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
6890: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
68a0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
68b0: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
68c0: 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
68d0: 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
68e0: 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
68f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6900: 50 61 67 65 72 46 6c 75 73 68 28 70 50 61 67 65  PagerFlush(pPage
6910: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
6920: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
6930: 0a 20 20 20 20 20 20 20 20 62 53 65 65 6e 42 75  .        bSeenBu
6940: 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sy = 1;.        
6950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6960: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6970: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
6980: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
6990: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
69a0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
69b0: 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53    return ((rc==S
69c0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 53 65 65  QLITE_OK && bSee
69d0: 6e 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f  nBusy) ? SQLITE_
69e0: 42 55 53 59 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  BUSY : rc);.}../
69f0: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
6a00: 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  on settings for 
6a10: 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61  an individual da
6a20: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
6a30: 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  n.*/.int sqlite3
6a40: 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74  _db_config(sqlit
6a50: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20  e3 *db, int op, 
6a60: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
6a70: 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ap;.  int rc;.  
6a80: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
6a90: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
6aa0: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
6ab0: 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44  E_DBCONFIG_MAIND
6ac0: 42 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2f  BNAME: {.      /
6ad0: 2a 20 49 4d 50 3a 20 52 2d 30 36 38 32 34 2d 32  * IMP: R-06824-2
6ae0: 38 35 33 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  8531 */.      /*
6af0: 20 49 4d 50 3a 20 52 2d 33 36 32 35 37 2d 35 32   IMP: R-36257-52
6b00: 31 32 35 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  125 */.      db-
6b10: 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[0].zDbSName
6b20: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61   = va_arg(ap,cha
6b30: 72 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r*);.      rc = 
6b40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
6b50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42    case SQLITE_DB
6b70: 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45  CONFIG_LOOKASIDE
6b80: 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  : {.      void *
6b90: 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70  pBuf = va_arg(ap
6ba0: 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50  , void*); /* IMP
6bb0: 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20  : R-26835-10964 
6bc0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  */.      int sz 
6bd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
6be0: 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  );       /* IMP:
6bf0: 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a   R-47871-25994 *
6c00: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  /.      int cnt 
6c10: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
6c20: 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  );      /* IMP: 
6c30: 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f  R-04460-53386 */
6c40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75  .      rc = setu
6c50: 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70  pLookaside(db, p
6c60: 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20  Buf, sz, cnt);. 
6c70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6c80: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
6c90: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
6ca0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
6cb0: 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20       int op;    
6cc0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
6cd0: 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d  */.        u32 m
6ce0: 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ask;    /* Mask 
6cf0: 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71  of the bit in sq
6d00: 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73  lite3.flags to s
6d10: 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20  et/clear */.    
6d20: 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20    } aFlagOp[] = 
6d30: 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  {.        { SQLI
6d40: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
6d50: 4c 45 5f 46 4b 45 59 2c 20 20 20 20 20 20 20 20  LE_FKEY,        
6d60: 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67     SQLITE_Foreig
6d70: 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20  nKeys    },.    
6d80: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
6d90: 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49  ONFIG_ENABLE_TRI
6da0: 47 47 45 52 2c 20 20 20 20 20 20 20 20 53 51 4c  GGER,        SQL
6db0: 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65  ITE_EnableTrigge
6dc0: 72 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  r  },.        { 
6dd0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6de0: 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45  ENABLE_FTS3_TOKE
6df0: 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46 74  NIZER, SQLITE_Ft
6e00: 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c 0a  s3Tokenizer  },.
6e10: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
6e20: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
6e30: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c  _LOAD_EXTENSION,
6e40: 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
6e50: 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 20  nsion  },.      
6e60: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
6e70: 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43  FIG_NO_CKPT_ON_C
6e80: 4c 4f 53 45 2c 20 20 20 20 20 20 53 51 4c 49 54  LOSE,      SQLIT
6e90: 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 20  E_NoCkptOnClose 
6ea0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
6eb0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
6ec0: 41 42 4c 45 5f 51 50 53 47 2c 20 20 20 20 20 20  ABLE_QPSG,      
6ed0: 20 20 20 20 20 53 51 4c 49 54 45 5f 45 6e 61 62       SQLITE_Enab
6ee0: 6c 65 51 50 53 47 20 20 20 20 20 7d 2c 0a 20 20  leQPSG     },.  
6ef0: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
6f00: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
6f10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
6f20: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
6f30: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
6f40: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6f50: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
6f60: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
6f70: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
6f80: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
6f90: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
6fa0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6fb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
6fc0: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
6fd0: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
6fe0: 20 20 20 20 75 33 32 20 6f 6c 64 46 6c 61 67 73      u32 oldFlags
6ff0: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
7000: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
7010: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
7020: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
7030: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
7040: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7050: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
7060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
7070: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
7080: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
7090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
70a0: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
70b0: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
70c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
70d0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
70e0: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
70f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7100: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
7110: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
7120: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
7130: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
7140: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
7150: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
7160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
7170: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7190: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
71a0: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
71b0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
71c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
71d0: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
71e0: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
71f0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
7200: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
7210: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
7220: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
7230: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
7240: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
7250: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
7260: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
7270: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
7280: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
7290: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
72a0: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
72b0: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
72c0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
72d0: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
72e0: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
72f0: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
7300: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
7310: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
7320: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
7330: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
7340: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
7350: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
7360: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
7370: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
7380: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
7390: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
73a0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
73b0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
73c0: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
73d0: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
73e0: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20  1 : nKey2;.  /* 
73f0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
7400: 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20 62  5033-28449 The b
7410: 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63  uilt-in BINARY c
7420: 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65  ollation compare
7430: 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 62  s.  ** strings b
7440: 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69 6e  yte by byte usin
7450: 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66  g the memcmp() f
7460: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  unction from the
7470: 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a   standard C.  **
7480: 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20 61   library. */.  a
7490: 73 73 65 72 74 28 20 70 4b 65 79 31 20 26 26 20  ssert( pKey1 && 
74a0: 70 4b 65 79 32 20 29 3b 0a 20 20 72 63 20 3d 20  pKey2 );.  rc = 
74b0: 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
74c0: 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
74d0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
74e0: 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20  padFlag.     && 
74f0: 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72  allSpaces(((char
7500: 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79  *)pKey1)+n, nKey
7510: 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c  1-n).     && all
7520: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
7530: 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e  Key2)+n, nKey2-n
7540: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
7550: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
7560: 2d 33 31 36 32 34 2d 32 34 37 33 37 20 52 54 52  -31624-24737 RTR
7570: 49 4d 20 69 73 20 6c 69 6b 65 20 42 49 4e 41 52  IM is like BINAR
7580: 59 20 65 78 63 65 70 74 20 74 68 61 74 20 65 78  Y except that ex
7590: 74 72 61 0a 20 20 20 20 20 20 2a 2a 20 73 70 61  tra.      ** spa
75a0: 63 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ces at the end o
75b0: 66 20 65 69 74 68 65 72 20 73 74 72 69 6e 67 20  f either string 
75c0: 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
75d0: 65 20 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68  e result. In oth
75e0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 64  er.      ** word
75f0: 73 2c 20 73 74 72 69 6e 67 73 20 77 69 6c 6c 20  s, strings will 
7600: 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
7610: 20 6f 6e 65 20 61 6e 6f 74 68 65 72 20 61 73 20   one another as 
7620: 6c 6f 6e 67 20 61 73 20 74 68 65 79 0a 20 20 20  long as they.   
7630: 20 20 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c     ** differ onl
7640: 79 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  y in the number 
7650: 6f 66 20 73 70 61 63 65 73 20 61 74 20 74 68 65  of spaces at the
7660: 20 65 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   end..      */. 
7670: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7680: 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65  rc = nKey1 - nKe
7690: 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  y2;.    }.  }.  
76a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
76b0: 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c  .** Another buil
76c0: 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73  t-in collating s
76d0: 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e  equence: NOCASE.
76e0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c   .**.** This col
76f0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
7700: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
7710: 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73 65  e used for "case
7720: 20 69 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20   independent.** 
7730: 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c  comparison". SQL
7740: 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20  ite's knowledge 
7750: 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77  of upper and low
7760: 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c 65  er case equivale
7770: 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f  nts.** extends o
7780: 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63 68  nly to the 26 ch
7790: 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69 6e  aracters used in
77a0: 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e   the English lan
77b0: 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20  guage..**.** At 
77c0: 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65  the moment there
77d0: 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38   is only a UTF-8
77e0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
77f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
7800: 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
7810: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
7820: 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
7830: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
7840: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
7850: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
7860: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d  ey2.){.  int r =
7870: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
7880: 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63  (.      (const c
7890: 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f  har *)pKey1, (co
78a0: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32  nst char *)pKey2
78b0: 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f  , (nKey1<nKey2)?
78c0: 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20  nKey1:nKey2);.  
78d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
78e0: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  (NotUsed);.  if(
78f0: 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d   0==r ){.    r =
7900: 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20   nKey1-nKey2;.  
7910: 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
7920: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7930: 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  e ROWID of the m
7940: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
7950: 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36  t.*/.sqlite_int6
7960: 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  4 sqlite3_last_i
7970: 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69  nsert_rowid(sqli
7980: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
7990: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
79a0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
79b0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
79c0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
79d0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
79e0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
79f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
7a00: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
7a10: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
7a20: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
7a30: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
7a40: 65 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69  e sqlite3_last_i
7a50: 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50  nsert_rowid() AP
7a60: 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
7a70: 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f  oid sqlite3_set_
7a80: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
7a90: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73  d(sqlite3 *db, s
7aa0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f  qlite3_int64 iRo
7ab0: 77 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  wid){.#ifdef SQL
7ac0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
7ad0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
7ae0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
7af0: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
7b00: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
7b10: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
7b20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
7b30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7b40: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7b50: 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d   db->lastRowid =
7b60: 20 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74   iRowid;.  sqlit
7b70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7b80: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a  b->mutex);.}../*
7b90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
7ba0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
7bb0: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
7bc0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
7bd0: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
7be0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
7bf0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
7c00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7c10: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
7c20: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
7c30: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
7c40: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
7c50: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
7c60: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7c70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
7c80: 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a  rn db->nChange;.
7c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7ca0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
7cb0: 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  anges since the 
7cc0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7cd0: 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69  was opened..*/.i
7ce0: 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  nt sqlite3_total
7cf0: 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  _changes(sqlite3
7d00: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7d10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7d20: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
7d30: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
7d40: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
7d50: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
7d60: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7d70: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
7d80: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f    return db->nTo
7d90: 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  talChange;.}../*
7da0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70  .** Close all op
7db0: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54  en savepoints. T
7dc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
7dd0: 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69  y manipulates fi
7de0: 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64  elds of the.** d
7df0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
7e00: 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e  bject, it does n
7e10: 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76  ot close any sav
7e20: 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79  epoints that may
7e30: 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74   be open.** at t
7e40: 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20  he b-tree/pager 
7e50: 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  level..*/.void s
7e60: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
7e70: 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  oints(sqlite3 *d
7e80: 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d  b){.  while( db-
7e90: 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  >pSavepoint ){. 
7ea0: 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54     Savepoint *pT
7eb0: 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  mp = db->pSavepo
7ec0: 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61  int;.    db->pSa
7ed0: 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
7ee0: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
7ef0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d  e3DbFree(db, pTm
7f00: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53  p);.  }.  db->nS
7f10: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
7f20: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
7f30: 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e   0;.  db->isTran
7f40: 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
7f50: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
7f60: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
7f70: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73  ctor function as
7f80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75  sociated with Fu
7f90: 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e  ncDef p, if any.
7fa0: 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74   Except,.** if t
7fb0: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  his is not the l
7fc0: 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ast copy of the 
7fd0: 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74  function, do not
7fe0: 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74   invoke it. Mult
7ff0: 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f  iple.** copies o
8000: 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74  f a single funct
8010: 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20  ion are created 
8020: 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63  when create_func
8030: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
8040: 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f  .** with SQLITE_
8050: 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ANY as the encod
8060: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
8070: 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  oid functionDest
8080: 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  roy(sqlite3 *db,
8090: 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20   FuncDef *p){.  
80a0: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
80b0: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d  pDestructor = p-
80c0: 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a  >u.pDestructor;.
80d0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
80e0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
80f0: 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ctor->nRef--;.  
8100: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
8110: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
8120: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
8130: 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74 72  >xDestroy(pDestr
8140: 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61  uctor->pUserData
8150: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8160: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73 74  DbFree(db, pDest
8170: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
8180: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63   }.}../*.** Disc
8190: 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74  onnect all sqlit
81a0: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20  e3_vtab objects 
81b0: 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64  that belong to d
81c0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
81d0: 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69  on.** db. This i
81e0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62  s called when db
81f0: 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64   is being closed
8200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8210: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
8220: 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ab(sqlite3 *db){
8230: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8240: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8250: 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73  E.  int i;.  Has
8260: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69  hElem *p;.  sqli
8270: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
8280: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
8290: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
82a0: 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  {.    Schema *pS
82b0: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
82c0: 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  i].pSchema;.    
82d0: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
82e0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
82f0: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
8300: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
8310: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
8320: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
8330: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
8340: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
8350: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
8360: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
8370: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
8380: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
8390: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
83a0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
83b0: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71  }.  }.  for(p=sq
83c0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
83d0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20  b->aModule); p; 
83e0: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
83f0: 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65  (p)){.    Module
8400: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
8410: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
8420: 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  a(p);.    if( pM
8430: 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20  od->pEpoTab ){. 
8440: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
8450: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70  Disconnect(db, p
8460: 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20  Mod->pEpoTab);. 
8470: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
8480: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
8490: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
84a0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
84b0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
84c0: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
84d0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
84e0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
84f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
8500: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
8510: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
8520: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
8530: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
8540: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
8550: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
8560: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
8570: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
8580: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
8590: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
85a0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
85b0: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
85c0: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
85d0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
85e0: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
85f0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
8600: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
8610: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
8620: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
8630: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
8640: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
8650: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
8660: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
8670: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
8680: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8690: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
86a0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
86b0: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
86c0: 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45   !db ){.    /* E
86d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
86e0: 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e  257-11740 Callin
86f0: 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  g sqlite3_close(
8700: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
8710: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77  te3_close_v2() w
8720: 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  ith a NULL point
8730: 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  er argument is a
8740: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
8750: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
8760: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8770: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
8780: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
8790: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
87a0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
87b0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
87c0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
87d0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
87e0: 28 20 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53  ( db->mTrace & S
87f0: 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53  QLITE_TRACE_CLOS
8800: 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72  E ){.    db->xTr
8810: 61 63 65 28 53 51 4c 49 54 45 5f 54 52 41 43 45  ace(SQLITE_TRACE
8820: 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72 61  _CLOSE, db->pTra
8830: 63 65 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a 20  ceArg, db, 0);. 
8840: 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78   }..  /* Force x
8850: 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73  Disconnect calls
8860: 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   on all virtual 
8870: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63  tables */.  disc
8880: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62  onnectAllVtab(db
8890: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  );..  /* If a tr
88a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
88b0: 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63  n, the disconnec
88c0: 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20  tAllVtab() call 
88d0: 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  above.  ** will 
88e0: 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20  not have called 
88f0: 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28  the xDisconnect(
8900: 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20  ) method on any 
8910: 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62  virtual.  ** tab
8920: 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61  les in the db->a
8930: 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20  VTrans[] array. 
8940: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  The following sq
8950: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
8960: 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69  k().  ** call wi
8970: 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65  ll do so. We nee
8980: 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66  d to do this bef
8990: 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f  ore the check fo
89a0: 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51  r active.  ** SQ
89b0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c  L statements bel
89c0: 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62  ow, as the v-tab
89d0: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
89e0: 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67  n may be storing
89f0: 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61  .  ** some prepa
8a00: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69  red statements i
8a10: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
8a20: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
8a30: 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a  lback(db);..  /*
8a40: 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72   Legacy behavior
8a50: 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28   (sqlite3_close(
8a60: 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20 74  ) behavior) is t
8a70: 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  o return.  ** SQ
8a80: 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65  LITE_BUSY if the
8a90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20   connection can 
8aa0: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
8ab0: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  mediately..  */.
8ac0: 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62    if( !forceZomb
8ad0: 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e  ie && connection
8ae0: 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20  IsBusy(db) ){.  
8af0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
8b00: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
8b10: 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74  _BUSY, "unable t
8b20: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
8b30: 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20  nfinalized ".   
8b40: 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20      "statements 
8b50: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  or unfinished ba
8b60: 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c  ckups");.    sql
8b70: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8b80: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
8b90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
8ba0: 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  USY;.  }..#ifdef
8bb0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
8bc0: 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
8bd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
8be0: 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
8bf0: 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61  * Closing the ha
8c00: 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
8c10: 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
8c20: 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f   the value 2. */
8c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
8c40: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
8c50: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
8c60: 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
8c70: 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a   db, 0, 2);.  }.
8c80: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e  #endif..  /* Con
8c90: 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  vert the connect
8ca0: 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69  ion into a zombi
8cb0: 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65  e and then close
8cc0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e   it..  */.  db->
8cd0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
8ce0: 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73  AGIC_ZOMBIE;.  s
8cf0: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
8d00: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64  AndCloseZombie(d
8d10: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
8d20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8d30: 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20   Two variations 
8d40: 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e  on the public in
8d50: 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73  terface for clos
8d60: 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
8d70: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  * connection. Th
8d80: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  e sqlite3_close(
8d90: 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e  ) version return
8da0: 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  s SQLITE_BUSY an
8db0: 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20  d.** leaves the 
8dc0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f  connection optio
8dd0: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 75  n if there are u
8de0: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
8df0: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
8e00: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
8e10: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e  sqlite3_backups.
8e20: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c    The sqlite3_cl
8e30: 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73  ose_v2().** vers
8e40: 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63  ion forces the c
8e50: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63  onnection to bec
8e60: 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20  ome a zombie if 
8e70: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63  there are.** unc
8e80: 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c  losed resources,
8e90: 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f   and arranges fo
8ea0: 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  r deallocation w
8eb0: 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  hen the last.** 
8ec0: 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e  prepare statemen
8ed0: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
8ee0: 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69  kup closes..*/.i
8ef0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
8f00: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8f10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8f20: 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20  se(db,0); }.int 
8f30: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8f40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8f50: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8f60: 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a  se(db,1); }.../*
8f70: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75  .** Close the mu
8f80: 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
8f90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a  connection db..*
8fa0: 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  *.** Furthermore
8fb0: 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  , if database co
8fc0: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61  nnection db is a
8fd0: 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67   zombie (meaning
8fe0: 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68   that there.** h
8ff0: 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20  as been a prior 
9000: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
9010: 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c  close(db) or sql
9020: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62  ite3_close_v2(db
9030: 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20  )) and.** every 
9040: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73  sqlite3_stmt has
9050: 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69   now been finali
9060: 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73 71  zed and every sq
9070: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73  lite3_backup has
9080: 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68  .** finished, th
9090: 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  en free all reso
90a0: 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urces..*/.void s
90b0: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
90c0: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73  AndCloseZombie(s
90d0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
90e0: 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20  ashElem *i;     
90f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9100: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65  * Hash table ite
9110: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  rator */.  int j
9120: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
9130: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
9140: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72   sqlite3_stmt or
9150: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9160: 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20  objects.  ** or 
9170: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
9180: 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  n has not yet be
9190: 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c  en closed by sql
91a0: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c  ite3_close_v2(),
91b0: 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20  .  ** then just 
91c0: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
91d0: 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
91e0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63  .  if( db->magic
91f0: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  !=SQLITE_MAGIC_Z
9200: 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74  OMBIE || connect
9210: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
9220: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
9230: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
9240: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ex);.    return;
9250: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
9260: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
9270: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
9280: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9290: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a  nnection has.  *
92a0: 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c  * closed all sql
92b0: 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71  ite3_stmt and sq
92c0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
92d0: 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65 65  ects and has bee
92e0: 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f  n.  ** passed to
92f0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28   sqlite3_close (
9300: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
9310: 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54  is a zombie).  T
9320: 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67  herefore,.  ** g
9330: 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65 65  o ahead and free
9340: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a   all resources..
9350: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20    */..  /* If a 
9360: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
9370: 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63  pen, roll it bac
9380: 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73  k. This also ens
9390: 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a  ures that if.  *
93a0: 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 73  * any database s
93b0: 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e  chemas have been
93c0: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20   modified by an 
93d0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  uncommitted tran
93e0: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65  saction.  ** the
93f0: 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64  y are reset. And
9400: 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69 72   that the requir
9410: 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
9420: 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a  is held to make.
9430: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72    ** the pager r
9440: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
9450: 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d  ma reset an atom
9460: 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f  ic operation. */
9470: 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  .  sqlite3Rollba
9480: 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
9490: 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  _OK);..  /* Free
94a0: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
94b0: 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63   Savepoint struc
94c0: 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tures. */.  sqli
94d0: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
94e0: 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c  ts(db);..  /* Cl
94f0: 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ose all database
9500: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
9510: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
9520: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
9530: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
9540: 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20   &db->aDb[j];.  
9550: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
9560: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
9570: 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70  treeClose(pDb->p
9580: 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  Bt);.      pDb->
9590: 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pBt = 0;.      i
95a0: 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20  f( j!=1 ){.     
95b0: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20     pDb->pSchema 
95c0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
95d0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61   }.  }.  /* Clea
95e0: 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d  r the TEMP schem
95f0: 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64  a separately and
9600: 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64   last */.  if( d
9610: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9620: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
9630: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
9640: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
9650: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
9660: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
9670: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20  ;..  /* Free up 
9680: 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75 78  the array of aux
9690: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
96a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   */.  sqlite3Col
96b0: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
96c0: 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ay(db);.  assert
96d0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
96e0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
96f0: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
9700: 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74   );..  /* Tell t
9710: 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66  he code in notif
9720: 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e  y.c that the con
9730: 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65  nection no longe
9740: 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a  r holds any.  **
9750: 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20   locks and does 
9760: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
9770: 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e  further unlock-n
9780: 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
9790: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
97a0: 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28  onnectionClosed(
97b0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71  db);..  for(i=sq
97c0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
97d0: 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d  b->aFunc); i; i=
97e0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
97f0: 29 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  )){.    FuncDef 
9800: 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20  *pNext, *p;.    
9810: 70 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  p = sqliteHashDa
9820: 74 61 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  ta(i);.    do{. 
9830: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
9840: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
9850: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
9860: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
9870: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
9880: 0a 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74  .      p = pNext
9890: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20  ;.    }while( p 
98a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
98b0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
98c0: 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73  Func);.  for(i=s
98d0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
98e0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69  db->aCollSeq); i
98f0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
9900: 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c  xt(i)){.    Coll
9910: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
9920: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
9930: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f  shData(i);.    /
9940: 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73  * Invoke any des
9950: 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65  tructors registe
9960: 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f  red for collatio
9970: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20  n sequence user 
9980: 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  data. */.    for
9990: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
99a0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
99b0: 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20  [j].xDel ){.    
99c0: 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65      pColl[j].xDe
99d0: 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72  l(pColl[j].pUser
99e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
99f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
9a00: 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20  ee(db, pColl);. 
9a10: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
9a20: 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c  Clear(&db->aColl
9a30: 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
9a40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9a50: 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73  LTABLE.  for(i=s
9a60: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
9a70: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b  db->aModule); i;
9a80: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
9a90: 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(i)){.    Modul
9aa0: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
9ab0: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
9ac0: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
9ad0: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b  Mod->xDestroy ){
9ae0: 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65  .      pMod->xDe
9af0: 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78  stroy(pMod->pAux
9b00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
9b10: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
9b20: 73 54 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20  sTableClear(db, 
9b30: 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  pMod);.    sqlit
9b40: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
9b50: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
9b60: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
9b70: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
9b80: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
9b90: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
9ba0: 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20   /* Deallocates 
9bb0: 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72  any cached error
9bc0: 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73   strings. */.  s
9bd0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
9be0: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c  db->pErr);.  sql
9bf0: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
9c00: 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c  ons(db);.#if SQL
9c10: 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
9c20: 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65  ICATION.  sqlite
9c30: 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e  3_free(db->auth.
9c40: 7a 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71  zAuthUser);.  sq
9c50: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
9c60: 75 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65  uth.zAuthPW);.#e
9c70: 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  ndif..  db->magi
9c80: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
9c90: 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68  _ERROR;..  /* Th
9ca0: 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20  e temp-database 
9cb0: 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61  schema is alloca
9cc0: 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  ted differently 
9cd0: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73  from the other s
9ce0: 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63  chema.  ** objec
9cf0: 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65  ts (using sqlite
9d00: 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c  Malloc() directl
9d10: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71  y, instead of sq
9d20: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
9d30: 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20  ())..  ** So it 
9d40: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
9d50: 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68  d here. Todo: Wh
9d60: 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74  y not roll the t
9d70: 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a  emp schema into.
9d80: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71    ** the same sq
9d90: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20  liteMalloc() as 
9da0: 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c  the one that all
9db0: 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62  ocates the datab
9dc0: 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74  ase .  ** struct
9dd0: 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ure?.  */.  sqli
9de0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62  te3DbFree(db, db
9df0: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
9e00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9e10: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
9e20: 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  ex);.  db->magic
9e30: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
9e40: 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65  CLOSED;.  sqlite
9e50: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d  3_mutex_free(db-
9e60: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
9e70: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
9e80: 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  .nOut==0 );  /* 
9e90: 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61  Fails on a looka
9ea0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  side memory leak
9eb0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f   */.  if( db->lo
9ec0: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
9ed0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
9ee0: 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73  _free(db->lookas
9ef0: 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d  ide.pStart);.  }
9f00: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9f10: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  db);.}../*.** Ro
9f20: 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62  llback all datab
9f30: 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74  ase files.  If t
9f40: 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53  ripCode is not S
9f50: 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a  QLITE_OK, then.*
9f60: 2a 20 61 6e 79 20 77 72 69 74 65 20 63 75 72 73  * any write curs
9f70: 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
9f80: 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d  ted ("tripped" -
9f90: 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67   as in "tripping
9fa0: 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72   a circuit.** br
9fb0: 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65  eaker") and made
9fc0: 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43   to return tripC
9fd0: 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65  ode if there are
9fe0: 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20   any further.** 
9ff0: 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20  attempts to use 
a000: 74 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65  that cursor.  Re
a010: 61 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69  ad cursors remai
a020: 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64  n open and valid
a030: 0a 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61 76  .** but are "sav
a040: 65 64 22 20 69 6e 20 63 61 73 65 20 74 68 65 20  ed" in case the 
a050: 74 61 62 6c 65 20 70 61 67 65 73 20 61 72 65 20  table pages are 
a060: 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f  moved around..*/
a070: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
a080: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
a090: 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f   *db, int tripCo
a0a0: 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  de){.  int i;.  
a0b0: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
a0c0: 0a 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61  .  int schemaCha
a0d0: 6e 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  nge;.  assert( s
a0e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a0f0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
a100: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
a110: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
a120: 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62   /* Obtain all b
a130: 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65  -tree mutexes be
a140: 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20  fore making any 
a150: 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f  calls to BtreeRo
a160: 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20  llback(). .  ** 
a170: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
a180: 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72  t in case the tr
a190: 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20  ansaction being 
a1a0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a  rolled back has.
a1b0: 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68    ** modified th
a1c0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
a1d0: 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  a. If the b-tree
a1e0: 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74   mutexes are not
a1f0: 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65   taken.  ** here
a200: 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73  , then another s
a210: 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e  hared-cache conn
a220: 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65  ection might sne
a230: 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20  ak in between.  
a240: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
a250: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
a260: 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68  ema reset, which
a270: 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65   can cause false
a280: 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  .  ** corruption
a290: 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65   reports in some
a2a0: 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71   cases.  */.  sq
a2b0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
a2c0: 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61  ll(db);.  schema
a2d0: 43 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 6d 44  Change = (db->mD
a2e0: 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f  bFlags & DBFLAG_
a2f0: 53 63 68 65 6d 61 43 68 61 6e 67 65 29 21 3d 30  SchemaChange)!=0
a300: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
a310: 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  y==0;..  for(i=0
a320: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
a330: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
a340: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
a350: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
a360: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a370: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
a380: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54  ) ){.        inT
a390: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  rans = 1;.      
a3a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
a3b0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
a3c0: 74 72 69 70 43 6f 64 65 2c 20 21 73 63 68 65 6d  tripCode, !schem
a3d0: 61 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a  aChange);.    }.
a3e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
a3f0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20  bRollback(db);. 
a400: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
a410: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66  nMalloc();..  if
a420: 28 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73 26  ( (db->mDbFlags&
a430: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61  DBFLAG_SchemaCha
a440: 6e 67 65 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  nge)!=0 && db->i
a450: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
a460: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
a470: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
a480: 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ts(db);.    sqli
a490: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
a4a0: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
a4b0: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
a4c0: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
a4d0: 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65  b);..  /* Any de
a4e0: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
a4f0: 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76  t violations hav
a500: 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c  e now been resol
a510: 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44  ved. */.  db->nD
a520: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
a530: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
a540: 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64  ImmCons = 0;.  d
a550: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
a560: 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20  ITE_DeferFKs;.. 
a570: 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62   /* If one has b
a580: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
a590: 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62  invoke the rollb
a5a0: 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ack-hook callbac
a5b0: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78  k */.  if( db->x
a5c0: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
a5d0: 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20   && (inTrans || 
a5e0: 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29  !db->autoCommit)
a5f0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c   ){.    db->xRol
a600: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62  lbackCallback(db
a610: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b  ->pRollbackArg);
a620: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
a630: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
a640: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
a650: 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70  the name corresp
a660: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72  onding to the er
a670: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63  ror code.** spec
a680: 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72 67  ified in the arg
a690: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65  ument..*/.#if de
a6a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45 45  fined(SQLITE_NEE
a6b0: 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73  D_ERR_NAME).cons
a6c0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
a6d0: 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a  rrName(int rc){.
a6e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
a6f0: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
a700: 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20  , origRc = rc;. 
a710: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26   for(i=0; i<2 &&
a720: 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20   zName==0; i++, 
a730: 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20  rc &= 0xff){.   
a740: 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
a750: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a760: 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20  _OK:            
a770: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a780: 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20  LITE_OK";       
a790: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a7a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a7b0: 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20  E_ERROR:        
a7c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a7d0: 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20  QLITE_ERROR";   
a7e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a7f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a800: 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20  TE_INTERNAL:    
a810: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a820: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22  SQLITE_INTERNAL"
a830: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
a840: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a850: 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20  ITE_PERM:       
a860: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a870: 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20  "SQLITE_PERM";  
a880: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a890: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a8a0: 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20  LITE_ABORT:     
a8b0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a8c0: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b   "SQLITE_ABORT";
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a8e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a8f0: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
a900: 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20  BACK:     zName 
a910: 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  = "SQLITE_ABORT_
a920: 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72  ROLLBACK";    br
a930: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a940: 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20  SQLITE_BUSY:    
a950: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a960: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22   = "SQLITE_BUSY"
a970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
a980: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a990: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43   SQLITE_BUSY_REC
a9a0: 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d  OVERY:      zNam
a9b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
a9c0: 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20  _RECOVERY";     
a9d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a9e0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  e SQLITE_BUSY_SN
a9f0: 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61  APSHOT:      zNa
aa00: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
aa10: 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20  Y_SNAPSHOT";    
aa20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aa30: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
aa40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
aa50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
aa60: 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20  CKED";          
aa70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aa80: 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ase SQLITE_LOCKE
aa90: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a  D_SHAREDCACHE: z
aaa0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c  Name = "SQLITE_L
aab0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
aac0: 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  E";break;.      
aad0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  case SQLITE_NOME
aae0: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
aaf0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ab00: 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20  NOMEM";         
ab10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ab20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
ab30: 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20  DONLY:          
ab40: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ab50: 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20  _READONLY";     
ab60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ab70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
ab80: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a  ADONLY_RECOVERY:
ab90: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aba0: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
abb0: 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ERY"; break;.   
abc0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
abd0: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
abe0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
abf0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
ac00: 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LOCK"; break;.  
ac10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ac20: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
ac30: 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  K:  zName = "SQL
ac40: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
ac50: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
ac60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ac70: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
ac80: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
ac90: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
aca0: 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a  MOVED";  break;.
acb0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
acc0: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20  E_INTERRUPT:    
acd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ace0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22  QLITE_INTERRUPT"
acf0: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
ad00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ad10: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20  TE_IOERR:       
ad20: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ad30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
ad40: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
ad50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ad60: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20  ITE_IOERR_READ: 
ad70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ad80: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  "SQLITE_IOERR_RE
ad90: 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AD";        brea
ada0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
adb0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
adc0: 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  _READ:   zName =
add0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
ade0: 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65  HORT_READ";  bre
adf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
ae10: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
ae20: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ae30: 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72  WRITE";       br
ae40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ae50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
ae60: 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  NC:        zName
ae70: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ae80: 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62  _FSYNC";       b
ae90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aea0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
aeb0: 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d  R_FSYNC:    zNam
aec0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
aed0: 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20  R_DIR_FSYNC";   
aee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aef0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
af00: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61  RUNCATE:     zNa
af10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
af20: 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20  RR_TRUNCATE";   
af30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
af40: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
af50: 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e  FSTAT:        zN
af60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
af70: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
af80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
af90: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
afa0: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _UNLOCK:       z
afb0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
afc0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20  OERR_UNLOCK";   
afd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
afe0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
aff0: 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_RDLOCK:       
b000: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b010: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20  IOERR_RDLOCK";  
b020: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b030: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b040: 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20  RR_DELETE:      
b050: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b060: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20  _IOERR_DELETE"; 
b070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b080: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b090: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
b0a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b0b0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20  E_IOERR_NOMEM"; 
b0c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b0d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b0e0: 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20  OERR_ACCESS:    
b0f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b100: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
b110: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
b120: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b130: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b140: 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VEDLOCK:.       
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b170: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
b180: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
b190: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b1a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b1b0: 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20  R_LOCK:         
b1c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b1d0: 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20  IOERR_LOCK";    
b1e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b1f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b200: 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20  RR_CLOSE:       
b210: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b220: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20  _IOERR_CLOSE";  
b230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b240: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b250: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20  ERR_DIR_CLOSE:  
b260: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b270: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
b280: 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  E";   break;.   
b290: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b2a0: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20  OERR_SHMOPEN:   
b2b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b2c0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
b2d0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b2e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b2f0: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20  IOERR_SHMSIZE:  
b300: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b310: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b320: 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
b330: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b340: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20  _IOERR_SHMLOCK: 
b350: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b360: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
b370: 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  CK";     break;.
b380: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b390: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20  E_IOERR_SHMMAP: 
b3a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b3b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
b3c0: 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AP";      break;
b3d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b3e0: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20  TE_IOERR_SEEK:  
b3f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b400: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
b410: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
b420: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b430: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b440: 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20  _NOENT: zName = 
b450: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
b460: 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61  LETE_NOENT";brea
b470: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b480: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a  LITE_IOERR_MMAP:
b490: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b4a0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d   "SQLITE_IOERR_M
b4b0: 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72 65  MAP";        bre
b4c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b4d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
b4e0: 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  EMPPATH:  zName 
b4f0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b500: 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72  GETTEMPPATH"; br
b510: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b520: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
b530: 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65  VPATH:     zName
b540: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b550: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62  _CONVPATH";    b
b560: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b570: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a   SQLITE_CORRUPT:
b580: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b590: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
b5a0: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  UPT";           
b5b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b5c0: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
b5d0: 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61  _VTAB:       zNa
b5e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
b5f0: 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20  RUPT_VTAB";     
b600: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b610: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
b620: 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  ND:           zN
b630: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
b640: 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20  TFOUND";        
b650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b660: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
b680: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
b690: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20  ULL";           
b6a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b6b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
b6c0: 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20  OPEN:           
b6d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b6e0: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20  CANTOPEN";      
b6f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b700: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
b710: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a  TOPEN_NOTEMPDIR:
b720: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b730: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
b740: 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  DIR";break;.    
b750: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b760: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20  NTOPEN_ISDIR:   
b770: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b780: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
b790: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
b7a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b7b0: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
b7c0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
b7d0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
b7e0: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
b7f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b800: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
b810: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
b820: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
b830: 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  VPATH"; break;. 
b840: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b850: 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20  _PROTOCOL:      
b860: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b870: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20  LITE_PROTOCOL"; 
b880: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b890: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b8a0: 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20  E_EMPTY:        
b8b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b8c0: 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20  QLITE_EMPTY";   
b8d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b8e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b8f0: 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20  TE_SCHEMA:      
b900: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b910: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20  SQLITE_SCHEMA"; 
b920: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b930: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b940: 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20  ITE_TOOBIG:     
b950: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b960: 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b  "SQLITE_TOOBIG";
b970: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b980: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b990: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a  LITE_CONSTRAINT:
b9a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b9b0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b9c0: 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72 65  INT";        bre
b9d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b9e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b9f0: 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20  _UNIQUE:  zName 
ba00: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
ba10: 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72  AINT_UNIQUE"; br
ba20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba30: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ba40: 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65  T_TRIGGER: zName
ba50: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
ba60: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62  RAINT_TRIGGER";b
ba70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ba80: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
ba90: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20  NT_FOREIGNKEY:. 
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bac0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bad0: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
bae0: 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  NKEY";   break;.
baf0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bb00: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
bb10: 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CK:   zName = "S
bb20: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bb30: 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b  _CHECK";  break;
bb40: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bb50: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
bb60: 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20  IMARYKEY:.      
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bb90: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bba0: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22  AINT_PRIMARYKEY"
bbb0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
bbc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bbd0: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a  STRAINT_NOTNULL:
bbe0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bbf0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
bc00: 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ULL";break;.    
bc10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bc20: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
bc30: 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OOK:.           
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bc60: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bc70: 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62  COMMITHOOK";   b
bc80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc90: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
bca0: 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d  NT_VTAB:    zNam
bcb0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
bcc0: 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20  TRAINT_VTAB";   
bcd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bce0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
bcf0: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  INT_FUNCTION:.  
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bd20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
bd30: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
bd40: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
bd50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bd60: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
bd70: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
bd80: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bd90: 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ROWID";  break;.
bda0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bdb0: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20  E_MISMATCH:     
bdc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bdd0: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b  QLITE_MISMATCH";
bde0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bdf0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be00: 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20  TE_MISUSE:      
be10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
be20: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
be30: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
be40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
be50: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
be60: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
be70: 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20  "SQLITE_NOLFS"; 
be80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
be90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bea0: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
beb0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bec0: 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20   "SQLITE_AUTH"; 
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
bee0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bef0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
bf00: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bf10: 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  = "SQLITE_FORMAT
bf20: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
bf30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bf40: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20  SQLITE_RANGE:   
bf50: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bf60: 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45   = "SQLITE_RANGE
bf70: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
bf80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bf90: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20   SQLITE_NOTADB: 
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bfb0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41  e = "SQLITE_NOTA
bfc0: 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  DB";            
bfd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bfe0: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20  e SQLITE_ROW:   
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c000: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57  me = "SQLITE_ROW
c010: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
c020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c030: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
c040: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
c050: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
c060: 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20 20  TICE";          
c070: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c080: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
c090: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a  E_RECOVER_WAL: z
c0a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c0b0: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
c0c0: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
c0d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
c0e0: 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
c0f0: 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ACK:.           
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c120: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c130: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  VER_ROLLBACK"; b
c140: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c150: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a   SQLITE_WARNING:
c160: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
c170: 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e  e = "SQLITE_WARN
c180: 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  ING";           
c190: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c1a0: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
c1b0: 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61  _AUTOINDEX:  zNa
c1c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
c1d0: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b  NING_AUTOINDEX";
c1e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c1f0: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20  se SQLITE_DONE: 
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
c210: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f  ame = "SQLITE_DO
c220: 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  NE";            
c230: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c240: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
c250: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
c260: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
c270: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c280: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
c290: 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f  , zBuf, "SQLITE_
c2a0: 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72  UNKNOWN(%d)", or
c2b0: 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  igRc);.    zName
c2c0: 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72   = zBuf;.  }.  r
c2d0: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
c2e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
c2f0: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
c300: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
c310: 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
c320: 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
c330: 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
c340: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
c350: 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28   *sqlite3ErrStr(
c360: 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69  int rc){.  stati
c370: 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f  c const char* co
c380: 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20  nst aMsg[] = {. 
c390: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20     /* SQLITE_OK 
c3a0: 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74           */ "not
c3b0: 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20   an error",.    
c3c0: 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  /* SQLITE_ERROR 
c3d0: 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f        */ "SQL lo
c3e0: 67 69 63 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  gic error",.    
c3f0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
c400: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
c410: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
c420: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
c430: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
c440: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c450: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
c460: 2f 20 22 71 75 65 72 79 20 61 62 6f 72 74 65 64  / "query aborted
c470: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c480: 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20  _BUSY        */ 
c490: 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  "database is loc
c4a0: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
c4b0: 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  ITE_LOCKED      
c4c0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62  */ "database tab
c4d0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  le is locked",. 
c4e0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d     /* SQLITE_NOM
c4f0: 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74  EM       */ "out
c500: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20   of memory",.   
c510: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f   /* SQLITE_READO
c520: 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d  NLY    */ "attem
c530: 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65  pt to write a re
c540: 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22  adonly database"
c550: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c560: 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22  INTERRUPT   */ "
c570: 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20  interrupted",.  
c580: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52    /* SQLITE_IOER
c590: 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b  R       */ "disk
c5a0: 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20   I/O error",.   
c5b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   /* SQLITE_CORRU
c5c0: 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  PT     */ "datab
c5d0: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
c5e0: 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20  s malformed",.  
c5f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46    /* SQLITE_NOTF
c600: 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e  OUND    */ "unkn
c610: 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a  own operation",.
c620: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55      /* SQLITE_FU
c630: 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  LL        */ "da
c640: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
c650: 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20  s full",.    /* 
c660: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
c670: 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f     */ "unable to
c680: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
c690: 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ile",.    /* SQL
c6a0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20  ITE_PROTOCOL    
c6b0: 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  */ "locking prot
c6c0: 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ocol",.    /* SQ
c6d0: 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20  LITE_EMPTY      
c6e0: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
c6f0: 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20  LITE_SCHEMA     
c700: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63   */ "database sc
c710: 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64  hema has changed
c720: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c730: 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20  _TOOBIG      */ 
c740: 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20  "string or blob 
c750: 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a  too big",.    /*
c760: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c770: 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69  NT  */ "constrai
c780: 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20  nt failed",.    
c790: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  /* SQLITE_MISMAT
c7a0: 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79  CH    */ "dataty
c7b0: 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20  pe mismatch",.  
c7c0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55    /* SQLITE_MISU
c7d0: 53 45 20 20 20 20 20 20 2a 2f 20 22 62 61 64 20  SE      */ "bad 
c7e0: 70 61 72 61 6d 65 74 65 72 20 6f 72 20 6f 74 68  parameter or oth
c7f0: 65 72 20 41 50 49 20 6d 69 73 75 73 65 22 2c 0a  er API misuse",.
c800: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
c810: 53 41 42 4c 45 5f 4c 46 53 0a 20 20 20 20 2f 2a  SABLE_LFS.    /*
c820: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20   SQLITE_NOLFS   
c830: 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69      */ "large fi
c840: 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69  le support is di
c850: 73 61 62 6c 65 64 22 2c 0a 23 65 6c 73 65 0a 20  sabled",.#else. 
c860: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c     /* SQLITE_NOL
c870: 46 53 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 23  FS       */ 0,.#
c880: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 53 51 4c  endif.    /* SQL
c890: 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20  ITE_AUTH        
c8a0: 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  */ "authorizatio
c8b0: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
c8c0: 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20  * SQLITE_FORMAT 
c8d0: 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f       */ 0,.    /
c8e0: 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20  * SQLITE_RANGE  
c8f0: 20 20 20 20 20 2a 2f 20 22 63 6f 6c 75 6d 6e 20       */ "column 
c900: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
c910: 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ge",.    /* SQLI
c920: 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a  TE_NOTADB      *
c930: 2f 20 22 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  / "file is not a
c940: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b   database",.  };
c950: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c960: 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65  Err = "unknown e
c970: 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28  rror";.  switch(
c980: 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20   rc ){.    case 
c990: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
c9a0: 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a  LBACK: {.      z
c9b0: 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65  Err = "abort due
c9c0: 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   to ROLLBACK";. 
c9d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c9e0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
c9f0: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
ca00: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
ca10: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
ca20: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
ca30: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
ca40: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
ca50: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
ca60: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ca70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
ca80: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
ca90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
caa0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
cab0: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
cac0: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
cad0: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
cae0: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
caf0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
cb00: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
cb10: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
cb20: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
cb30: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
cb40: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
cb50: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
cb60: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
cb70: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
cb80: 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20  ck(. void *ptr, 
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cba0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
cbb0: 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75  tion */. int cou
cbc0: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
cbd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
cbe0: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
cbf0: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23  een busy */.){.#
cc00: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
cc10: 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   || HAVE_USLEEP.
cc20: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
cc30: 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20  8 delays[] =.   
cc40: 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c    { 1, 2, 5, 10,
cc50: 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c   15, 20, 25, 25,
cc60: 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20    25,  50,  50, 
cc70: 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  100 };.  static 
cc80: 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b  const u8 totals[
cc90: 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c  ] =.     { 0, 1,
cca0: 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20   3,  8, 18, 33, 
ccb0: 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38  53, 78, 103, 128
ccc0: 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20  , 178, 228 };.# 
ccd0: 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72  define NDELAY Ar
cce0: 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a  raySize(delays).
ccf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cd00: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a  (sqlite3 *)ptr;.
cd10: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20    int timeout = 
cd20: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  db->busyTimeout;
cd30: 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72  .  int delay, pr
cd40: 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ior;..  assert( 
cd50: 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66  count>=0 );.  if
cd60: 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59  ( count < NDELAY
cd70: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
cd80: 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20  delays[count];. 
cd90: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
cda0: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73  s[count];.  }els
cdb0: 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  e{.    delay = d
cdc0: 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b  elays[NDELAY-1];
cdd0: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
cde0: 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20  als[NDELAY-1] + 
cdf0: 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44  delay*(count-(ND
ce00: 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  ELAY-1));.  }.  
ce10: 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61  if( prior + dela
ce20: 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  y > timeout ){. 
ce30: 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f     delay = timeo
ce40: 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20  ut - prior;.    
ce50: 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72  if( delay<=0 ) r
ce60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
ce70: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
ce80: 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30  ->pVfs, delay*10
ce90: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
cea0: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
ceb0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
cec0: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
ced0: 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33  eout = ((sqlite3
cee0: 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d   *)ptr)->busyTim
cef0: 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75  eout;.  if( (cou
cf00: 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d  nt+1)*1000 > tim
cf10: 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  eout ){.    retu
cf20: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
cf30: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
cf40: 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20  Vfs, 1000000);. 
cf50: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
cf60: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  f.}../*.** Invok
cf70: 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79  e the given busy
cf80: 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   handler..**.** 
cf90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cfa0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f  called when an o
cfb0: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20  peration failed 
cfc0: 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20  with a lock..** 
cfd0: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
cfe0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
cff0: 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65  , the lock is re
d000: 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  tried.  If it.**
d010: 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20   returns 0, the 
d020: 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73  operation aborts
d030: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
d040: 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  BUSY error..*/.i
d050: 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  nt sqlite3Invoke
d060: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79  BusyHandler(Busy
d070: 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69  Handler *p){.  i
d080: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56  nt rc;.  if( NEV
d090: 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78  ER(p==0) || p->x
d0a0: 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42  Func==0 || p->nB
d0b0: 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30  usy<0 ) return 0
d0c0: 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e  ;.  rc = p->xFun
d0d0: 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42  c(p->pArg, p->nB
d0e0: 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  usy);.  if( rc==
d0f0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  0 ){.    p->nBus
d100: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
d110: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b  .    p->nBusy++;
d120: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d130: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ; .}../*.** This
d140: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
d150: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
d160: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
d170: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
d180: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
d190: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
d1a0: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
d1b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d1c0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20  _busy_handler(. 
d1d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
d1e0: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
d1f0: 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  d*,int),.  void 
d200: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
d210: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
d220: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
d230: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
d240: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
d250: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
d260: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
d270: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d280: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d290: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
d2a0: 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20  xFunc = xBusy;. 
d2b0: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
d2c0: 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  .pArg = pArg;.  
d2d0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
d2e0: 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62 2d  nBusy = 0;.  db-
d2f0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30  >busyTimeout = 0
d300: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d310: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
d320: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
d330: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
d340: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
d350: 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b  ROGRESS_CALLBACK
d360: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d370: 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f  ine sets the pro
d380: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66  gress callback f
d390: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
d3a0: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
d3b0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
d3c0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
d3d0: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
d3e0: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
d3f0: 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62  llback will.** b
d400: 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20  e invoked every 
d410: 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f  nOps opcodes..*/
d420: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72  .void sqlite3_pr
d430: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a  ogress_handler(.
d440: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
d450: 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e    int nOps,.  in
d460: 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76  t (*xProgress)(v
d470: 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a  oid*), .  void *
d480: 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53  pArg.){.#ifdef S
d490: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
d4a0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
d4b0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
d4c0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
d4d0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
d4e0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
d4f0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
d500: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
d510: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
d520: 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b  .  if( nOps>0 ){
d530: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
d540: 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a  ss = xProgress;.
d550: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
d560: 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64  sOps = (unsigned
d570: 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70  )nOps;.    db->p
d580: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41  ProgressArg = pA
d590: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
d5a0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
d5b0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f   0;.    db->nPro
d5c0: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
d5d0: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
d5e0: 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  rg = 0;.  }.  sq
d5f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d600: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
d610: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
d620: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74  his routine inst
d630: 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62  alls a default b
d640: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74  usy handler that
d650: 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a   waits for the.*
d660: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62  * specified numb
d670: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
d680: 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ds before return
d690: 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ing 0..*/.int sq
d6a0: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
d6b0: 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ut(sqlite3 *db, 
d6c0: 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20  int ms){.#ifdef 
d6d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
d6e0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
d6f0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
d700: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
d710: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
d720: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  KPT;.#endif.  if
d730: 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71  ( ms>0 ){.    sq
d740: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
d750: 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66  er(db, sqliteDef
d760: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
d770: 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20  , (void*)db);.  
d780: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
d790: 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b  t = ms;.  }else{
d7a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
d7b0: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c  y_handler(db, 0,
d7c0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
d7d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d7e0: 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20  /*.** Cause any 
d7f0: 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f  pending operatio
d800: 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73  n to stop at its
d810: 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74   earliest opport
d820: 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  unity..*/.void s
d830: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
d840: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
d850: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d860: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
d870: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
d880: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 26 26  tyCheckOk(db) &&
d890: 20 28 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d   (db==0 || db->m
d8a0: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
d8b0: 49 43 5f 5a 4f 4d 42 49 45 29 20 29 7b 0a 20 20  IC_ZOMBIE) ){.  
d8c0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
d8d0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
d8e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d8f0: 69 66 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e  if.  db->u1.isIn
d900: 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d  terrupted = 1;.}
d910: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
d920: 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c  nction is exactl
d930: 79 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  y the same as sq
d940: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
d950: 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a  ction(), except.
d960: 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 64 65  ** that it is de
d970: 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c  signed to be cal
d980: 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20  led by internal 
d990: 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65 72  code. The differ
d9a0: 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20  ence is.** that 
d9b0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
d9c0: 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63  ils in sqlite3_c
d9d0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
d9e0: 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  , an error code.
d9f0: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
da00: 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69  nd the mallocFai
da10: 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64  led flag cleared
da20: 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
da30: 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73  3CreateFunc(.  s
da40: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
da50: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74  nst char *zFunct
da60: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
da70: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
da80: 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74    void *pUserDat
da90: 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  a,.  void (*xSFu
daa0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
dab0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
dac0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
dad0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
dae0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
daf0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
db00: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
db10: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
db20: 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65  text*),.  FuncDe
db30: 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72  structor *pDestr
db40: 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44  uctor.){.  FuncD
db50: 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61  ef *p;.  int nNa
db60: 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74 72 61 46  me;.  int extraF
db70: 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65 72 74 28  lags;..  assert(
db80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
db90: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
dba0: 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f  ;.  if( zFunctio
dbb0: 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20  nName==0 ||.    
dbc0: 20 20 28 78 53 46 75 6e 63 20 26 26 20 28 78 46    (xSFunc && (xF
dbd0: 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20  inal || xStep)) 
dbe0: 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 53 46 75  || .      (!xSFu
dbf0: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26  nc && (xFinal &&
dc00: 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20   !xStep)) ||.   
dc10: 20 20 20 28 21 78 53 46 75 6e 63 20 26 26 20 28     (!xSFunc && (
dc20: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
dc30: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
dc40: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
dc50: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
dc60: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
dc70: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
dc80: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46  ite3Strlen30( zF
dc90: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
dca0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
dcb0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
dcc0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
dcd0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
dce0: 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54  TANT==SQLITE_DET
dcf0: 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20  ERMINISTIC );.  
dd00: 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63  extraFlags = enc
dd10: 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52   &  SQLITE_DETER
dd20: 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20  MINISTIC;.  enc 
dd30: 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f  &= (SQLITE_FUNC_
dd40: 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41  ENCMASK|SQLITE_A
dd50: 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20  NY);.  .#ifndef 
dd60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
dd70: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
dd80: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
dd90: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
dda0: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
ddb0: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
ddc0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
ddd0: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
dde0: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
ddf0: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
de00: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
de10: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
de20: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
de30: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
de40: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
de50: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
de60: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
de70: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
de80: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
de90: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
dea0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
deb0: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
dec0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
ded0: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
dee0: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
def0: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
df00: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
df10: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
df20: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
df30: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
df40: 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20  |extraFlags,.   
df50: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
df60: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20   xSFunc, xStep, 
df70: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
df80: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tor);.    if( rc
df90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
dfa0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dfb0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
dfc0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
dfd0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
dfe0: 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  6LE|extraFlags,.
dff0: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
e000: 61 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74  ata, xSFunc, xSt
e010: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
e020: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
e030: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e040: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
e050: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e060: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
e070: 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65  _UTF16BE;.  }.#e
e080: 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49  lse.  enc = SQLI
e090: 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a  TE_UTF8;.#endif.
e0a0: 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
e0b0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e   an existing fun
e0c0: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f  ction is being o
e0d0: 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c  verridden or del
e0e0: 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a  eted. If so,.  *
e0f0: 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
e100: 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e  active VMs, then
e110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
e120: 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69  USY. If a functi
e130: 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  on.  ** is being
e140: 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65   overridden/dele
e150: 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72  ted but there ar
e160: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
e170: 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20   allow the.  ** 
e180: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  operation to con
e190: 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69  tinue but invali
e1a0: 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70  date all precomp
e1b0: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
e1c0: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
e1d0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
e1e0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
e1f0: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
e200: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
e210: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
e220: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43   SQLITE_FUNC_ENC
e230: 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d  MASK)==enc && p-
e240: 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20  >nArg==nArg ){. 
e250: 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
e260: 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
e270: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
e280: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
e290: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
e2a0: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
e2b0: 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63  modify user-func
e2c0: 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69  tion due to acti
e2d0: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
e2e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
e2f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e300: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
e310: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
e320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
e330: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
e340: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
e350: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
e360: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
e370: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
e380: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
e390: 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20  , (u8)enc, 1);. 
e3a0: 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d   assert(p || db-
e3b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a  >mallocFailed);.
e3c0: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
e3d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e3e0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
e3f0: 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20   /* If an older 
e400: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66  version of the f
e410: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63  unction with a c
e420: 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75  onfigured destru
e430: 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69  ctor is.  ** bei
e440: 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f  ng replaced invo
e450: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
e460: 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e  r function here.
e470: 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65   */.  functionDe
e480: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20  stroy(db, p);.. 
e490: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
e4a0: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63   ){.    pDestruc
e4b0: 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  tor->nRef++;.  }
e4c0: 0a 20 20 70 2d 3e 75 2e 70 44 65 73 74 72 75 63  .  p->u.pDestruc
e4d0: 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f  tor = pDestructo
e4e0: 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67  r;.  p->funcFlag
e4f0: 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67  s = (p->funcFlag
e500: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
e510: 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61  ENCMASK) | extra
e520: 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73  Flags;.  testcas
e530: 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  e( p->funcFlags 
e540: 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  & SQLITE_DETERMI
e550: 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78  NISTIC );.  p->x
e560: 53 46 75 6e 63 20 3d 20 78 53 46 75 6e 63 20 3f  SFunc = xSFunc ?
e570: 20 78 53 46 75 6e 63 20 3a 20 78 53 74 65 70 3b   xSFunc : xStep;
e580: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
e590: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
e5a0: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
e5b0: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
e5c0: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
e5d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e5e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
e5f0: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
e600: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
e610: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e620: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
e630: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
e640: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
e650: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
e660: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
e670: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
e680: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e690: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e6a0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
e6b0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
e6c0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e6d0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e6e0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
e6f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
e700: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
e710: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
e720: 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c  on_v2(db, zFunc,
e730: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
e740: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  SFunc, xStep,.  
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a    xFinal, 0);.}.
e780: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
e790: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
e7a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
e7b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e7c0: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
e7d0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
e7e0: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
e7f0: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
e800: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e810: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e820: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
e830: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e840: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e850: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e860: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
e870: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
e880: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
e890: 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  oid *).){.  int 
e8a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
e8b0: 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  R;.  FuncDestruc
e8c0: 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a  tor *pArg = 0;..
e8d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e8e0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e8f0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
e900: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
e910: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e920: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e930: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
e940: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e950: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e960: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
e970: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
e980: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
e990: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
e9a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63  (db, sizeof(Func
e9b0: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
e9c0: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
e9d0: 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29       xDestroy(p)
e9e0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74  ;.      goto out
e9f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67  ;.    }.    pArg
ea00: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
ea10: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
ea20: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
ea30: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
ea40: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
ea50: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
ea60: 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53  c, p, xSFunc, xS
ea70: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72  tep, xFinal, pAr
ea80: 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26  g);.  if( pArg &
ea90: 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20  & pArg->nRef==0 
eaa0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
eab0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
eac0: 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b      xDestroy(p);
ead0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
eae0: 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20  ee(db, pArg);.  
eaf0: 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20  }.. out:.  rc = 
eb00: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
eb10: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
eb20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
eb30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
eb40: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
eb50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
eb60: 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  F16.int sqlite3_
eb70: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
eb80: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
eb90: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
eba0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
ebb0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
ebc0: 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69   eTextRep,.  voi
ebd0: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
ebe0: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
ebf0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
ec00: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
ec10: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
ec20: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
ec30: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
ec40: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
ec50: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
ec60: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
ec70: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
ec80: 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  nc8;..#ifdef SQL
ec90: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
eca0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
ecb0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
ecc0: 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69 6f  (db) || zFunctio
ecd0: 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  nName==0 ) retur
ece0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
ecf0: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
ed00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ed10: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
ed20: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
ed30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
ed40: 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33  zFunc8 = sqlite3
ed50: 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75  Utf16to8(db, zFu
ed60: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20  nctionName, -1, 
ed70: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
ed80: 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  VE);.  rc = sqli
ed90: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
eda0: 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20  , zFunc8, nArg, 
edb0: 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 53 46  eTextRep, p, xSF
edc0: 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e 61 6c  unc,xStep,xFinal
edd0: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
ede0: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
edf0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
ee00: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
ee10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ee20: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
ee30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ee40: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
ee50: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
ee60: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
ee70: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
ee80: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
ee90: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
eea0: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
eeb0: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
eec0: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
eed0: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
eee0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
eef0: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
ef00: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
ef10: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
ef20: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
ef30: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
ef40: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
ef50: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
ef60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
ef70: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
ef80: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
ef90: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
efa0: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
efb0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
efc0: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
efd0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
efe0: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
eff0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
f000: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
f010: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
f020: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
f030: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
f040: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
f050: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
f060: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
f070: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
f080: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
f090: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f0a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f0b0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
f0c0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
f0d0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
f0e0: 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e  || zName==0 || n
f0f0: 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65  Arg<-2 ){.    re
f100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
f110: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
f120: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f130: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f140: 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tex);.  if( sqli
f150: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
f160: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
f170: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
f180: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
f190: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
f1a0: 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  c(db, zName, nAr
f1b0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
f1e0: 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
f1f0: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tion, 0, 0, 0);.
f200: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
f210: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
f220: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
f230: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f240: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
f250: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
f260: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
f270: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
f280: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
f290: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
f2a0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
f2b0: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
f2c0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
f2d0: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
f2e0: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
f2f0: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
f300: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
f310: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
f320: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
f330: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
f340: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
f350: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
f360: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
f370: 65 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ement..*/.#ifnde
f380: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
f390: 50 52 45 43 41 54 45 44 0a 76 6f 69 64 20 2a 73  PRECATED.void *s
f3a0: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
f3b0: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a  ite3 *db, void(*
f3c0: 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f  xTrace)(void*,co
f3d0: 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64  nst char*), void
f3e0: 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20   *pArg){.  void 
f3f0: 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
f400: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f410: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f420: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f430: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
f440: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
f450: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
f460: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
f470: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f480: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f490: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
f4a0: 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d  pTraceArg;.  db-
f4b0: 3e 6d 54 72 61 63 65 20 3d 20 78 54 72 61 63 65  >mTrace = xTrace
f4c0: 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f   ? SQLITE_TRACE_
f4d0: 4c 45 47 41 43 59 20 3a 20 30 3b 0a 20 20 64 62  LEGACY : 0;.  db
f4e0: 2d 3e 78 54 72 61 63 65 20 3d 20 28 69 6e 74 28  ->xTrace = (int(
f4f0: 2a 29 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69  *)(u32,void*,voi
f500: 64 2a 2c 76 6f 69 64 2a 29 29 78 54 72 61 63 65  d*,void*))xTrace
f510: 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72  ;.  db->pTraceAr
f520: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
f530: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f540: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f550: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
f560: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
f570: 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f  IT_DEPRECATED */
f580: 0a 0a 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20  ../* Register a 
f590: 74 72 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 75  trace callback u
f5a0: 73 69 6e 67 20 74 68 65 20 76 65 72 73 69 6f 6e  sing the version
f5b0: 2d 32 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  -2 interface..*/
f5c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61  .int sqlite3_tra
f5d0: 63 65 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  ce_v2(.  sqlite3
f5e0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 2f 2a 20 54 72 61 63 65 20 74 68 69      /* Trace thi
f610: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
f620: 20 20 75 6e 73 69 67 6e 65 64 20 6d 54 72 61 63    unsigned mTrac
f630: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f650: 4d 61 73 6b 20 6f 66 20 65 76 65 6e 74 73 20 74  Mask of events t
f660: 6f 20 62 65 20 74 72 61 63 65 64 20 2a 2f 0a 20  o be traced */. 
f670: 20 69 6e 74 28 2a 78 54 72 61 63 65 29 28 75 6e   int(*xTrace)(un
f680: 73 69 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69  signed,void*,voi
f690: 64 2a 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43  d*,void*),  /* C
f6a0: 61 6c 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b  allback to invok
f6b0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  e */.  void *pAr
f6c0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a    /* Context */.
f6f0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
f700: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f710: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f720: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f730: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f740: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f750: 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
f760: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f770: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
f780: 0a 20 20 69 66 28 20 6d 54 72 61 63 65 3d 3d 30  .  if( mTrace==0
f790: 20 29 20 78 54 72 61 63 65 20 3d 20 30 3b 0a 20   ) xTrace = 0;. 
f7a0: 20 69 66 28 20 78 54 72 61 63 65 3d 3d 30 20 29   if( xTrace==0 )
f7b0: 20 6d 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 64   mTrace = 0;.  d
f7c0: 62 2d 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72 61  b->mTrace = mTra
f7d0: 63 65 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65  ce;.  db->xTrace
f7e0: 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d   = xTrace;.  db-
f7f0: 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
f800: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
f810: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f820: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
f830: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
f840: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f850: 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
f860: 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66   Register a prof
f870: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ile function.  T
f880: 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
f890: 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
f8a0: 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69  stered .** profi
f8b0: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  le function is r
f8c0: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
f8d0: 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20   A NULL profile 
f8e0: 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
f8f0: 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67  hat no profiling
f900: 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
f910: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f   non-NULL.** pro
f920: 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65  file is a pointe
f930: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
f940: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
f950: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
f960: 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c  n of.** each SQL
f970: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
f980: 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  is run..*/.void 
f990: 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65  *sqlite3_profile
f9a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
f9b0: 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69  .  void (*xProfi
f9c0: 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  le)(void*,const 
f9d0: 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e  char*,sqlite_uin
f9e0: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
f9f0: 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  rg.){.  void *pO
fa00: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
fa10: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
fa20: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
fa30: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
fa40: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
fa50: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
fa60: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
fa70: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
fa80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fa90: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
faa0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
fab0: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
fac0: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
fad0: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
fae0: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
faf0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
fb00: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
fb10: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
fb20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fb30: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
fb40: 45 44 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ED */.#endif /* 
fb50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
fb60: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  E */../*.** Regi
fb70: 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  ster a function 
fb80: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68  to be invoked wh
fb90: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
fba0: 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20   commits..** If 
fbb0: 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63  the invoked func
fbc0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tion returns non
fbd0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
fbe0: 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61  commit becomes a
fbf0: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  .** rollback..*/
fc00: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63  .void *sqlite3_c
fc10: 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71  ommit_hook(.  sq
fc20: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
fc30: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
fc40: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
fc50: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
fc60: 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
fc70: 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75  )(void*),  /* Fu
fc80: 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65  nction to invoke
fc90: 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20   on each commit 
fca0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fcc0: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
fcd0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
fce0: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a  .  void *pOld;..
fcf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
fd00: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
fd10: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
fd20: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
fd30: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
fd40: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
fd50: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fd60: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
fd70: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
fd80: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
fd90: 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  d = db->pCommitA
fda0: 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69  rg;.  db->xCommi
fdb0: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  tCallback = xCal
fdc0: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f  lback;.  db->pCo
fdd0: 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a  mmitArg = pArg;.
fde0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fdf0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
fe00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
fe10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
fe20: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
fe30: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
fe40: 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
fe50: 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
fe60: 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
fe70: 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
fe80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
fe90: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
fea0: 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73  update_hook(.  s
feb0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
fec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
fed0: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
fee0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
fef0: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
ff00: 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
ff10: 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20  ar const *,char 
ff20: 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69  const *,sqlite_i
ff30: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
ff40: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
ff50: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
ff60: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
ff70: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
ff80: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
ff90: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
ffa0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
ffb0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
ffc0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
ffd0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
ffe0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
fff0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
10000 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10010 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10020 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64   pRet = db->pUpd
10030 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55  ateArg;.  db->xU
10040 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20  pdateCallback = 
10050 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
10060 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  >pUpdateArg = pA
10070 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
10080 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10090 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
100a0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
100b0 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
100c0 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
100d0 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
100e0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
100f0 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69  d.** back by thi
10100 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
10110 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
10120 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
10130 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
10140 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10150 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
10160 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
10170 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
10180 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
10190 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63  id*), /* Callbac
101a0 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
101b0 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
101c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
101d0 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
101e0 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
101f0 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65  id *pRet;..#ifde
10200 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10210 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10220 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10230 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
10240 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
10250 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
10260 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
10270 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
10280 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10290 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
102a0 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b  b->pRollbackArg;
102b0 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  .  db->xRollback
102c0 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
102d0 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c  back;.  db->pRol
102e0 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b  lbackArg = pArg;
102f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10300 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
10310 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
10320 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
10330 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
10340 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52  ATE_HOOK./*.** R
10350 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
10360 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
10370 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
10380 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
10390 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
103a0 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
103b0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
103c0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
103d0 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68  ite3_preupdate_h
103e0 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
103f0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
10400 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
10410 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
10420 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a  base */.  void(*
10430 78 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20 20  xCallback)(     
10440 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
10450 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
10460 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
10470 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63  nt,char const*,c
10480 68 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74  har const*,sqlit
10490 65 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65 33  e3_int64,sqlite3
104a0 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
104b0 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
104c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 61       /* First ca
104d0 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20  llback argument 
104e0 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
104f0 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
10500 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10510 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
10520 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
10530 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61  ;.  db->xPreUpda
10540 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  teCallback = xCa
10550 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50  llback;.  db->pP
10560 72 65 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  reUpdateArg = pA
10570 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
10580 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10590 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
105a0 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Ret;.}.#endif /*
105b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
105c0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
105d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
105e0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
105f0 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
10600 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
10610 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71  registered by sq
10620 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
10630 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49  eckpoint()..** I
10640 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61  nvoke sqlite3_wa
10650 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  l_checkpoint if 
10660 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
10670 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
10680 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
10690 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e  er than sqlite3.
106a0 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20  pWalArg cast to 
106b0 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20  an integer (the 
106c0 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
106d0 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63   by.** wal_autoc
106e0 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  heckpoint())..*/
106f0 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c   .int sqlite3Wal
10700 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76  DefaultHook(.  v
10710 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
10720 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  ,     /* Argumen
10730 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
10740 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db,           /*
10750 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   Connection */. 
10760 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
10770 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
10780 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ase */.  int nFr
10790 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
107a0 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a  /* Size of WAL *
107b0 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d  /.){.  if( nFram
107c0 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  e>=SQLITE_PTR_TO
107d0 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61  _INT(pClientData
107e0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
107f0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
10800 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
10810 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
10820 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71  db, zDb);.    sq
10830 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
10840 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65  lloc();.  }.  re
10850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10860 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10870 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
10880 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
10890 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  an sqlite3_wal_h
108a0 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74  ook() callback t
108b0 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
108c0 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20  checkpoint.** a 
108d0 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63  database after c
108e0 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
108f0 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
10900 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a   are nFrame or.*
10910 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e  * more frames in
10920 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50   the log file. P
10930 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61  assing zero or a
10940 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
10950 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65  as the.** nFrame
10960 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62   parameter disab
10970 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68  les automatic ch
10980 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65  eckpoints entire
10990 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ly..**.** The ca
109a0 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
109b0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
109c0 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20  on replaces any 
109d0 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63  existing callbac
109e0 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20  k.** registered 
109f0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
10a00 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69  l_hook(). Likewi
10a10 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20  se, registering 
10a20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73  a callback.** us
10a30 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
10a40 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20  hook() disables 
10a50 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68  the automatic ch
10a60 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69  eckpoint mechani
10a70 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  sm.** configured
10a80 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
10a90 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
10aa0 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
10ab0 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
10ac0 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23  , int nFrame){.#
10ad0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
10ae0 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50  T_WAL.  UNUSED_P
10af0 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
10b00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10b10 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a  (nFrame);.#else.
10b20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10b30 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
10b40 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
10b50 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
10b60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10b70 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
10b80 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  if.  if( nFrame>
10b90 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
10ba0 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71  _wal_hook(db, sq
10bb0 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
10bc0 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ook, SQLITE_INT_
10bd0 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b  TO_PTR(nFrame));
10be0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
10bf0 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
10c00 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  b, 0, 0);.  }.#e
10c10 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
10c20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10c30 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
10c40 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
10c50 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
10c60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77  transaction is w
10c70 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74  ritten.** into t
10c80 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c  he write-ahead-l
10c90 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62  og by this datab
10ca0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
10cb0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
10cc0 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  _wal_hook(.  sql
10cd0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cf0 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
10d00 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c  to this db handl
10d10 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c  e */.  int(*xCal
10d20 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73  lback)(void *, s
10d30 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
10d40 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f  har*, int),.  vo
10d50 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d70 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
10d80 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62  passed to xCallb
10d90 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ack() */.){.#ifn
10da0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10db0 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  WAL.  void *pRet
10dc0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
10dd0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10de0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10df0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10e00 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
10e10 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
10e20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
10e30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
10e40 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10e50 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
10e60 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72  Ret = db->pWalAr
10e70 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c  g;.  db->xWalCal
10e80 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
10e90 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67  k;.  db->pWalArg
10ea0 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
10eb0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10ec0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10ed0 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a  urn pRet;.#else.
10ee0 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
10ef0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
10f00 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
10f10 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zDb..*/.int sqli
10f20 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
10f30 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  nt_v2(.  sqlite3
10f40 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10f50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10f60 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
10f70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
10f80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10f90 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61   /* Name of atta
10fa0 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f  ched database (o
10fb0 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
10fc0 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20   eMode,         
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10fe0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
10ff0 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  T_* value */.  i
11000 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20  nt *pnLog,      
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11020 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57  * OUT: Size of W
11030 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73  AL log in frames
11040 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70   */.  int *pnCkp
11050 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11060 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
11070 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  tal number of fr
11080 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65  ames checkpointe
11090 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  d */.){.#ifdef S
110a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
110b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
110c0 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  K;.#else.  int r
110d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
110e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
110f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
11100 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f  nt iDb = SQLITE_
11110 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f  MAX_ATTACHED;  /
11120 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20  * sqlite3.aDb[] 
11130 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63  index of db to c
11140 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69  heckpoint */..#i
11150 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11160 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
11170 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
11180 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
11190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
111a0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
111b0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
111c0 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  e the output var
111d0 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20  iables to -1 in 
111e0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
111f0 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70  curs. */.  if( p
11200 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20  nLog ) *pnLog = 
11210 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74  -1;.  if( pnCkpt
11220 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b   ) *pnCkpt = -1;
11230 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
11240 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
11250 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73  SSIVE==0 );.  as
11260 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
11270 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20  CKPOINT_FULL==1 
11280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
11290 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
112a0 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61  ESTART==2 );.  a
112b0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
112c0 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
112d0 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65 4d  E==3 );.  if( eM
112e0 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode<SQLITE_CHECK
112f0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c  POINT_PASSIVE ||
11300 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48   eMode>SQLITE_CH
11310 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
11320 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  E ){.    /* EVID
11330 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36  ENCE-OF: R-03996
11340 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70 61 72  -12088 The M par
11350 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61  ameter must be a
11360 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e   valid checkpoin
11370 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a  t.    ** mode: *
11380 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
11390 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
113a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
113b0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
113c0 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20  );.  if( zDb && 
113d0 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44  zDb[0] ){.    iD
113e0 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
113f0 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
11400 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20    }.  if( iDb<0 
11410 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11420 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
11430 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
11440 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52  g(db, SQLITE_ERR
11450 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  OR, "unknown dat
11460 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29  abase: %s", zDb)
11470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
11480 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
11490 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  Busy = 0;.    rc
114a0 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
114b0 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
114c0 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
114d0 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
114e0 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
114f0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
11500 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
11510 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
11520 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
11530 74 61 74 65 6d 65 6e 74 73 2c 20 63 6c 65 61 72  tatements, clear
11540 20 74 68 65 20 69 6e 74 65 72 72 75 70 74 20 66   the interrupt f
11550 6c 61 67 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  lag at this.  **
11560 20 70 6f 69 6e 74 2e 20 20 2a 2f 0a 20 20 69 66   point.  */.  if
11570 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
11580 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  e==0 ){.    db->
11590 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
115a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c   = 0;.  }..  sql
115b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
115c0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
115d0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
115e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
115f0 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
11600 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55  Db. If zDb is NU
11610 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75  LL, or if the bu
11620 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a  ffer zDb points.
11630 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61  ** to contains a
11640 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72   zero-length str
11650 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65  ing, all attache
11660 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  d databases are 
11670 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
11680 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11690 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
116a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
116b0 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
116c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
116d0 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54   R-41613-20553 T
116e0 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  he sqlite3_wal_c
116f0 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69  heckpoint(D,X) i
11700 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
11710 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c    ** sqlite3_wal
11720 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44  _checkpoint_v2(D
11730 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  ,X,SQLITE_CHECKP
11740 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30  OINT_PASSIVE,0,0
11750 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  ). */.  return s
11760 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
11770 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c  point_v2(db,zDb,
11780 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
11790 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a  T_PASSIVE,0,0);.
117a0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
117b0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
117c0 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   Run a checkpoin
117d0 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44  t on database iD
117e0 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  b. This is a no-
117f0 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69  op if database i
11800 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72  Db is.** not cur
11810 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57  rently open in W
11820 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  AL mode..**.** I
11830 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
11840 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  is open on the d
11850 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68  atabase being ch
11860 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73  eckpointed, this
11870 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
11880 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
11890 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70  KED and a checkp
118a0 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65  oint is not atte
118b0 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e  mpted. If .** an
118c0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
118d0 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ile running the 
118e0 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53  checkpoint, an S
118f0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
11900 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
11910 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f   (i.e. SQLITE_IO
11920 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  ERR). Otherwise,
11930 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
11940 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  * The mutex on d
11950 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
11960 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  b should be held
11970 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
11980 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73  The mutex.** ass
11990 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
119a0 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65   specific b-tree
119b0 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
119c0 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a  ted is taken by.
119d0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
119e0 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b   while the check
119f0 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67  point is running
11a00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69  ..**.** If iDb i
11a10 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f  s passed SQLITE_
11a20 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68  MAX_ATTACHED, th
11a30 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  en all attached 
11a40 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a  databases are.**
11a50 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49   checkpointed. I
11a60 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
11a70 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
11a80 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
11a90 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74  tely -.** no att
11aa0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
11ab0 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72  checkpoint any r
11ac0 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73  emaining databas
11ad0 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  es..**.** Parame
11ae0 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65  ter eMode is one
11af0 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   of SQLITE_CHECK
11b00 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46  POINT_PASSIVE, F
11b10 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a  ULL or RESTART..
11b20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
11b30 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
11b40 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
11b50 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70  nt eMode, int *p
11b60 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70  nLog, int *pnCkp
11b70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
11b80 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
11b90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11ba0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
11bd0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
11be0 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62  ough attached db
11bf0 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79  s */.  int bBusy
11c00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11c10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11c20 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61  f SQLITE_BUSY ha
11c30 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  s been encounter
11c40 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
11c50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11c60 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
11c70 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c  ;.  assert( !pnL
11c80 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31  og || *pnLog==-1
11c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
11ca0 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74  nCkpt || *pnCkpt
11cb0 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69  ==-1 );..  for(i
11cc0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26  =0; i<db->nDb &&
11cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
11ce0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
11cf0 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c  =iDb || iDb==SQL
11d00 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
11d10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
11d20 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b  qlite3BtreeCheck
11d30 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d  point(db->aDb[i]
11d40 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c  .pBt, eMode, pnL
11d50 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
11d60 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20     pnLog = 0;.  
11d70 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a      pnCkpt = 0;.
11d80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11d90 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
11da0 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a       bBusy = 1;.
11db0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
11dc0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
11dd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
11de0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
11df0 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53  OK && bBusy) ? S
11e00 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b  QLITE_BUSY : rc;
11e10 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
11e20 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
11e30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11e40 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75  tion returns tru
11e50 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79  e if main-memory
11e60 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
11e70 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20  instead of.** a 
11e80 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66  temporary file f
11e90 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67  or transient pag
11ea0 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61  er files and sta
11eb0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
11ec0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
11ed0 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f  turned depends o
11ee0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64  n the value of d
11ef0 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72  b->temp_store (r
11f00 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65  untime.** parame
11f10 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d  ter) and the com
11f20 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20  pile time value 
11f30 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  of SQLITE_TEMP_S
11f40 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c  TORE. The.** fol
11f50 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
11f60 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74  cribes the relat
11f70 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
11f80 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73  these two values
11f90 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e  .** and this fun
11fa0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61  ctions return va
11fb0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  lue..**.**   SQL
11fc0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20  ITE_TEMP_STORE  
11fd0 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72     db->temp_stor
11fe0 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f  e     Location o
11ff0 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  f temporary data
12000 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  base.**   ------
12010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
12020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
12030 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
12040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12050 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
12090 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
120c0 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
120d0 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
12100 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
12110 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
12120 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
12130 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
12140 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
12150 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
12160 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
12170 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
12180 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
12190 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
121a0 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
121b0 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
121d0 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
121e0 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   1).**   2      
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12210 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
12220 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20  urn 1).**   3   
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
12250 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
12260 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74  return 1).*/.int
12270 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
12280 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74  mory(const sqlit
12290 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c  e3 *db){.#if SQL
122a0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
122b0 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  1.  return ( db-
122c0 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29  >temp_store==2 )
122d0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
122e0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
122f0 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  2.  return ( db-
12300 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29  >temp_store!=1 )
12310 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
12320 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
12330 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  3.  UNUSED_PARAM
12340 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75  ETER(db);.  retu
12350 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66  rn 1;.#endif.#if
12360 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
12370 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54  RE<1 || SQLITE_T
12380 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e  EMP_STORE>3.  UN
12390 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
123a0 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  b);.  return 0;.
123b0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
123c0 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63  Return UTF-8 enc
123d0 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
123e0 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
123f0 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
12400 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
12410 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
12420 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
12430 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
12440 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
12450 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
12460 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
12470 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  r(SQLITE_NOMEM_B
12480 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  KPT);.  }.  if( 
12490 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
124a0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
124b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
124c0 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
124d0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b  TE_MISUSE_BKPT);
124e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
124f0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
12500 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
12510 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12520 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
12530 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
12540 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c  MEM_BKPT);.  }el
12550 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65  se{.    testcase
12560 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b  ( db->pErr==0 );
12570 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  .    z = (char*)
12580 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
12590 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  xt(db->pErr);.  
125a0 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
125b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
125c0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
125d0 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
125e0 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
125f0 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
12600 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12610 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
12620 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
12630 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12640 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
12650 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
12660 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
12670 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
12680 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
12690 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
126a0 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
126b0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
126c0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
126d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
126e0 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a   outOfMem[] = {.
126f0 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
12700 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27  ', ' ', 'o', 'f'
12710 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , ' ', 'm', 'e',
12720 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20   'm', 'o', 'r', 
12730 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  'y', 0.  };.  st
12740 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d  atic const u16 m
12750 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  isuse[] = {.    
12760 27 62 27 2c 20 27 61 27 2c 20 27 64 27 2c 20 27  'b', 'a', 'd', '
12770 20 27 2c 20 27 70 27 2c 20 27 61 27 2c 20 27 72   ', 'p', 'a', 'r
12780 27 2c 20 27 61 27 2c 20 27 6d 27 2c 20 27 65 27  ', 'a', 'm', 'e'
12790 2c 20 27 74 27 2c 20 27 65 27 2c 20 27 72 27 2c  , 't', 'e', 'r',
127a0 20 27 20 27 2c 0a 20 20 20 20 27 6f 27 2c 20 27   ' ',.    'o', '
127b0 72 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 74  r', ' ', 'o', 't
127c0 27 2c 20 27 68 27 2c 20 27 65 27 2c 20 27 72 27  ', 'h', 'e', 'r'
127d0 2c 20 27 20 27 2c 20 27 41 27 2c 20 27 50 27 2c  , ' ', 'A', 'P',
127e0 20 27 49 27 2c 20 27 20 27 2c 0a 20 20 20 20 27   'I', ' ',.    '
127f0 6d 27 2c 20 27 69 27 2c 20 27 73 27 2c 20 27 75  m', 'i', 's', 'u
12800 27 2c 20 27 73 27 2c 20 27 65 27 2c 20 30 0a 20  ', 's', 'e', 0. 
12810 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69   };..  const voi
12820 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  d *z;.  if( !db 
12830 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
12840 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
12850 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
12860 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
12870 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
12880 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
12890 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71  misuse;.  }.  sq
128a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
128b0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
128c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
128d0 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
128e0 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
128f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
12900 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
12910 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
12920 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
12930 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12940 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
12950 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71   db->errCode, sq
12960 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
12970 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20  errCode));.     
12980 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
12990 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
129a0 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rr);.    }.    /
129b0 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79  * A malloc() may
129c0 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74   have failed wit
129d0 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hin the call to 
129e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
129f0 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62  xt16().    ** ab
12a00 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ove. If this is 
12a10 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
12a20 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
12a30 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74  led flag needs t
12a40 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61  o.    ** be clea
12a50 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  red before retur
12a60 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69  ning. Do this di
12a70 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
12a80 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71  of via.    ** sq
12a90 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20  lite3ApiExit(), 
12aa0 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67  to avoid setting
12ab0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12ac0 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  ndle error messa
12ad0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ge..    */.    s
12ae0 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72 28 64  qlite3OomClear(d
12af0 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
12b00 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
12b10 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
12b20 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
12b30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
12b40 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
12b50 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
12b60 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
12b70 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
12b80 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20  SQLite routine. 
12b90 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61  If NULL is.** pa
12ba0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
12bb0 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65  ction, we assume
12bc0 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
12bd0 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  ed during sqlite
12be0 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  3_open()..*/.int
12bf0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
12c00 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
12c10 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
12c20 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
12c30 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
12c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12c50 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
12c60 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
12c70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12c80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12c90 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
12ca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
12cb0 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65  >errCode & db->e
12cc0 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71  rrMask;.}.int sq
12cd0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
12ce0 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
12cf0 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
12d00 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
12d10 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
12d20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12d30 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
12d40 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
12d50 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12d60 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
12d70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
12d80 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
12d90 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a  rn db->errCode;.
12da0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  }.int sqlite3_sy
12db0 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c 69 74  stem_errno(sqlit
12dc0 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
12dd0 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53 79 73 45  n db ? db->iSysE
12de0 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a 2f  rrno : 0;.}  ../
12df0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
12e00 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
12e10 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
12e20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
12e30 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
12e40 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68  nt.  For now, th
12e50 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20  is simply calls 
12e60 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c  the internal sql
12e70 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20  ite3ErrStr().** 
12e80 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  function..*/.con
12e90 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
12ea0 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b  _errstr(int rc){
12eb0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
12ec0 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a  3ErrStr(rc);.}..
12ed0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
12ee0 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ew collating fun
12ef0 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61  ction for databa
12f00 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61  se "db".  The na
12f10 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61  me is zName.** a
12f20 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  nd the encoding 
12f30 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69  is enc..*/.stati
12f40 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c  c int createColl
12f50 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
12f60 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  * db,.  const ch
12f70 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38  ar *zName, .  u8
12f80 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43   enc,.  void* pC
12f90 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
12fa0 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
12fb0 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
12fc0 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
12fd0 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
12fe0 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
12ff0 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
13000 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  2;.  .  assert( 
13010 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13020 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
13030 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  ..  /* If SQLITE
13040 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
13050 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
13060 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
13070 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
13080 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
13090 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
130a0 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
130b0 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
130c0 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
130d0 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
130e0 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
130f0 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e  nally..  */.  en
13100 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74  c2 = enc;.  test
13110 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
13120 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65  TE_UTF16 );.  te
13130 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
13140 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
13150 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32  ED );.  if( enc2
13160 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c  ==SQLITE_UTF16 |
13170 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  | enc2==SQLITE_U
13180 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a  TF16_ALIGNED ){.
13190 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54      enc2 = SQLIT
131a0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
131b0 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51   }.  if( enc2<SQ
131c0 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
131d0 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  2>SQLITE_UTF16BE
131e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
131f0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
13200 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
13210 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
13220 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
13230 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
13240 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
13250 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
13260 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
13270 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
13280 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
13290 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
132a0 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
132b0 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
132c0 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
132d0 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ents..  */.  pCo
132e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
132f0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
13300 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  enc2, zName, 0);
13310 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
13320 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
13330 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
13340 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
13350 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
13360 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
13370 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
13380 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
13390 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e  modify collation
133a0 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f   sequence due to
133b0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
133c0 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ts");.      retu
133d0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
133e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
133f0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
13400 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a  tatements(db);..
13410 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74      /* If collat
13420 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
13430 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64  ll was created d
13440 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c  irectly by a cal
13450 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
13460 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
13470 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65  tion, and not ge
13480 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68  nerated by synth
13490 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a  CollSeq(),.    *
134a0 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65  * then any copie
134b0 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43  s made by synthC
134c0 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f  ollSeq() need to
134d0 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e   be invalidated.
134e0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f  .    ** Also, co
134f0 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74  llation destruct
13500 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65  or - CollSeq.xDe
13510 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d  l() - function m
13520 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  ay need.    ** t
13530 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20  o be called..   
13540 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43   */ .    if( (pC
13550 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49  oll->enc & ~SQLI
13560 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
13570 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20  )==enc2 ){.     
13580 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20   CollSeq *aColl 
13590 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
135a0 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
135b0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69   zName);.      i
135c0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
135d0 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a  j=0; j<3; j++){.
135e0 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
135f0 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a  *p = &aColl[j];.
13600 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
13610 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
13620 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13630 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20  p->xDel ){.     
13640 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70         p->xDel(p
13650 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20  ->pUser);.      
13660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13670 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20  p->xCmp = 0;.   
13680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13690 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c     }.  }..  pCol
136a0 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
136b0 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
136c0 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a  nc2, zName, 1);.
136d0 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
136e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
136f0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 43 6f  OMEM_BKPT;.  pCo
13700 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70  ll->xCmp = xComp
13710 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55  are;.  pColl->pU
13720 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43  ser = pCtx;.  pC
13730 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c  oll->xDel = xDel
13740 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d  ;.  pColl->enc =
13750 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e   (u8)(enc2 | (en
13760 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c & SQLITE_UTF16
13770 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71  _ALIGNED));.  sq
13780 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
13790 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74  QLITE_OK);.  ret
137a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
137b0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72  .../*.** This ar
137c0 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64  ray defines hard
137d0 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e   upper bounds on
137e0 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20   limit values.  
137f0 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  The.** initializ
13800 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20  er must be kept 
13810 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
13820 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a   SQLITE_LIMIT_*.
13830 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73  ** #defines in s
13840 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61  qlite3.h..*/.sta
13850 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48  tic const int aH
13860 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  ardLimit[] = {. 
13870 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
13880 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
13890 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _SQL_LENGTH,.  S
138a0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
138b0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ,.  SQLITE_MAX_E
138c0 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  XPR_DEPTH,.  SQL
138d0 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
138e0 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54  _SELECT,.  SQLIT
138f0 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20  E_MAX_VDBE_OP,. 
13900 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
13910 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49  TION_ARG,.  SQLI
13920 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
13930 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  .  SQLITE_MAX_LI
13940 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
13950 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
13960 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
13970 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
13980 33 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20  38091-32352 */. 
13990 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
139a0 47 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  GER_DEPTH,.  SQL
139b0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
139c0 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  HREADS,.};../*.*
139d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
139e0 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20  hard limits are 
139f0 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c  set to reasonabl
13a00 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20  e values.*/.#if 
13a10 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13a20 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
13a30 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
13a40 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
13a50 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
13a60 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
13a70 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
13a80 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
13a90 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
13aa0 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
13ab0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13ac0 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51  AX_SQL_LENGTH>SQ
13ad0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
13ae0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13af0 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
13b00 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65  st not be greate
13b10 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41  r than SQLITE_MA
13b20 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a  X_LENGTH.#endif.
13b30 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
13b40 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32  OMPOUND_SELECT<2
13b50 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13b60 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
13b70 45 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ECT must be at l
13b80 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69  east 2.#endif.#i
13b90 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  f SQLITE_MAX_VDB
13ba0 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20  E_OP<40.# error 
13bb0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
13bc0 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  OP must be at le
13bd0 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69  ast 40.#endif.#i
13be0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  f SQLITE_MAX_FUN
13bf0 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53  CTION_ARG<0 || S
13c00 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
13c10 4f 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65 72 72  ON_ARG>127.# err
13c20 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  or SQLITE_MAX_FU
13c30 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20  NCTION_ARG must 
13c40 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
13c50 20 31 32 37 0a 23 65 6e 64 69 66 0a 23 69 66 20   127.#endif.#if 
13c60 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
13c70 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  HED<0 || SQLITE_
13c80 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35  MAX_ATTACHED>125
13c90 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13ca0 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73  MAX_ATTACHED mus
13cb0 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
13cc0 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69  nd 125.#endif.#i
13cd0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  f SQLITE_MAX_LIK
13ce0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
13cf0 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
13d00 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
13d10 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  RN_LENGTH must b
13d20 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
13d30 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13d40 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a  AX_COLUMN>32767.
13d50 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13d60 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e  AX_COLUMN must n
13d70 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a  ot exceed 32767.
13d80 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13d90 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
13da0 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  PTH<1.# error SQ
13db0 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
13dc0 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61  _DEPTH must be a
13dd0 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
13de0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13df0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30  WORKER_THREADS<0
13e00 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57   || SQLITE_MAX_W
13e10 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30  ORKER_THREADS>50
13e20 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13e30 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
13e40 44 53 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  DS must be betwe
13e50 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64  en 0 and 50.#end
13e60 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
13e70 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
13e80 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
13e90 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
13ea0 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
13eb0 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
13ec0 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
13ed0 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
13ee0 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
13ef0 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
13f00 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
13f10 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
13f20 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
13f30 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
13f40 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
13f50 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
13f60 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
13f70 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
13f80 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
13f90 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
13fa0 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
13fb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
13fc0 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
13fd0 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
13fe0 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
13ff0 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23  int oldLimit;..#
14000 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
14010 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
14020 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
14030 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
14040 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
14050 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
14060 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
14070 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45  }.#endif..  /* E
14080 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30  VIDENCE-OF: R-30
14090 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61  189-54097 For ea
140a0 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72  ch limit categor
140b0 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e  y SQLITE_LIMIT_N
140c0 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  AME.  ** there i
140d0 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62  s a hard upper b
140e0 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70  ound set at comp
140f0 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20  ile-time by a C 
14100 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a  preprocessor.  *
14110 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53  * macro called S
14120 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20  QLITE_MAX_NAME. 
14130 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69  (The "_LIMIT_" i
14140 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68  n the name is ch
14150 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f  anged to.  ** "_
14160 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61  MAX_".).  */.  a
14170 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
14180 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
14190 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
141a0 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  AX_LENGTH );.  a
141b0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
141c0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53  t[SQLITE_LIMIT_S
141d0 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49  QL_LENGTH]==SQLI
141e0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
141f0 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
14200 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
14210 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d  _LIMIT_COLUMN]==
14220 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
14230 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  N );.  assert( a
14240 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
14250 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
14260 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45  H]==SQLITE_MAX_E
14270 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  XPR_DEPTH );.  a
14280 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
14290 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
142a0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d  OMPOUND_SELECT]=
142b0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50  =SQLITE_MAX_COMP
142c0 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20  OUND_SELECT);.  
142d0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
142e0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
142f0 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45  VDBE_OP]==SQLITE
14300 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a  _MAX_VDBE_OP );.
14310 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
14320 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
14330 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d  T_FUNCTION_ARG]=
14340 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  =SQLITE_MAX_FUNC
14350 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73  TION_ARG );.  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 41 54  [SQLITE_LIMIT_AT
14380 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f  TACHED]==SQLITE_
14390 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a  MAX_ATTACHED );.
143a0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
143b0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
143c0 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
143d0 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20  ENGTH]==.       
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14400 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d          SQLITE_M
14410 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
14420 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
14430 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
14440 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
14450 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51  ABLE_NUMBER]==SQ
14460 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
14470 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73  E_NUMBER);.  ass
14480 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14490 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
144a0 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  GGER_DEPTH]==SQL
144b0 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
144c0 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
144d0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
144e0 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
144f0 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49  R_THREADS]==SQLI
14500 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
14510 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72  READS );.  asser
14520 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  t( SQLITE_LIMIT_
14530 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d  WORKER_THREADS==
14540 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d  (SQLITE_N_LIMIT-
14550 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69  1) );...  if( li
14560 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74  mitId<0 || limit
14570 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d  Id>=SQLITE_N_LIM
14580 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
14590 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69   -1;.  }.  oldLi
145a0 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  mit = db->aLimit
145b0 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28  [limitId];.  if(
145c0 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20   newLimit>=0 ){ 
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145e0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37    /* IMP: R-5247
145f0 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69  6-28732 */.    i
14600 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72  f( newLimit>aHar
14610 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  dLimit[limitId] 
14620 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  ){.      newLimi
14630 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c  t = aHardLimit[l
14640 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50  imitId];  /* IMP
14650 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20  : R-51463-25634 
14660 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  */.    }.    db-
14670 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
14680 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d   = newLimit;.  }
14690 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d  .  return oldLim
146a0 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
146b0 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
146c0 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f  R-53341-35419 */
146d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
146e0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
146f0 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52  to parse both UR
14700 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66  Is and non-URI f
14710 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20  ilenames passed 
14720 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74  by the.** user t
14730 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20  o API functions 
14740 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f  sqlite3_open() o
14750 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
14760 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74  2(), and for dat
14770 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70  abase.** URIs sp
14780 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
14790 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d  of ATTACH statem
147a0 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
147b0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
147c0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
147d0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
147e0 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f  he VFS to use (o
147f0 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73  r.** a NULL to s
14800 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75  ignify the defau
14810 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55  lt VFS) if the U
14820 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  RI does not cont
14830 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a  ain a "vfs=xxx".
14840 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
14850 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  er. The second a
14860 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
14870 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e   the URI (or non
14880 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a  -URI filename).*
14890 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74  * itself. When t
148a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
148b0 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61  called the *pFla
148c0 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  gs variable shou
148d0 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68  ld contain.** th
148e0 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20  e default flags 
148f0 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
14900 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68  base handle with
14910 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72  . The value stor
14920 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73  ed in.** *pFlags
14930 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20   may be updated 
14940 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
14950 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65   if the URI file
14960 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a  name contains .*
14970 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72  * "cache=xxx" or
14980 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72   "mode=xxx" quer
14990 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a  y parameters..**
149a0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
149b0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
149c0 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
149d0 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73  s case *ppVfs is
149e0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
149f0 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74  .** the VFS that
14a00 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
14a10 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
14a20 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69  base file. *pzFi
14a30 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  le is set to.** 
14a40 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
14a50 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
14a60 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
14a70 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73  e to open. It is
14a80 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
14a90 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
14aa0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
14ab0 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  lly call sqlite3
14ac0 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
14ad0 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
14ae0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
14af0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
14b00 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
14b10 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
14b20 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67  ed and *pzErrMsg
14b30 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74  .** may be set t
14b40 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
14b50 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
14b60 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
14b70 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  ge error .** mes
14b80 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
14b90 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
14ba0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
14bb0 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
14bc0 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
14bd0 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  r by calling sql
14be0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
14bf0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65  int sqlite3Parse
14c00 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  Uri(.  const cha
14c10 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20  r *zDefaultVfs, 
14c20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f         /* VFS to
14c30 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d   use if no "vfs=
14c40 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f  xxx" query optio
14c50 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
14c60 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20  r *zUri,        
14c70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
14c80 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20  rminated URI to 
14c90 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  parse */.  unsig
14ca0 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  ned int *pFlags,
14cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
14cc0 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45  /OUT: SQLITE_OPE
14cd0 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  N_XXX flags */. 
14ce0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70   sqlite3_vfs **p
14cf0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
14d00 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20   /* OUT: VFS to 
14d10 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a  use */ .  char *
14d20 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20  *pzFile,        
14d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
14d40 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f  : Filename compo
14d50 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20  nent of URI */. 
14d60 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
14d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d80 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
14d90 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53  essage (if rc!=S
14da0 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a  QLITE_OK) */.){.
14db0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14dc0 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
14dd0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46   int flags = *pF
14de0 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lags;.  const ch
14df0 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61  ar *zVfs = zDefa
14e00 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a  ultVfs;.  char *
14e10 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b  zFile;.  char c;
14e20 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71  .  int nUri = sq
14e30 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
14e40 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ri);..  assert( 
14e50 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a  *pzErrMsg==0 );.
14e60 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26  .  if( ((flags &
14e70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
14e80 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  )             /*
14e90 20 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33 32   IMP: R-48725-32
14ea0 32 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  206 */.         
14eb0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f     || sqlite3Glo
14ec0 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
14ed0 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ri) /* IMP: R-51
14ee0 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20  689-46548 */.   
14ef0 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65  && nUri>=5 && me
14f00 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65  mcmp(zUri, "file
14f10 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50  :", 5)==0 /* IMP
14f20 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20  : R-57884-37496 
14f30 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  */.  ){.    char
14f40 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20   *zOpt;.    int 
14f50 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
14f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
14f70 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70  ser state when p
14f80 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20  arsing URI */.  
14f90 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20    int iIn;      
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fb0 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74  /* Input charact
14fc0 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
14fd0 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ff0 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65   Output characte
15000 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75  r index */.    u
15010 36 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b  64 nByte = nUri+
15020 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
15030 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
15040 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
15050 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
15060 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
15070 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20  URI flag is set 
15080 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74  to indicate to t
15090 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20  he VFS xOpen .  
150a0 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74    ** method that
150b0 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78   there may be ex
150c0 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66  tra parameters f
150d0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c  ollowing the fil
150e0 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e-name.  */.    
150f0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
15100 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66  OPEN_URI;..    f
15110 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55  or(iIn=0; iIn<nU
15120 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65  ri; iIn++) nByte
15130 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d   += (zUri[iIn]==
15140 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  '&');.    zFile 
15150 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
15160 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  64(nByte);.    i
15170 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75  f( !zFile ) retu
15180 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
15190 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49 6e 20 3d  BKPT;..    iIn =
151a0 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   5;.#ifdef SQLIT
151b0 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48  E_ALLOW_URI_AUTH
151c0 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20 73 74  ORITY.    if( st
151d0 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f  rncmp(zUri+5, "/
151e0 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  //", 3)==0 ){.  
151f0 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
15200 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
15210 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61  ing condition ca
15220 75 73 65 73 20 55 52 49 73 20 77 69 74 68 20 66  uses URIs with f
15230 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68  ive leading / ch
15240 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a  aracters.      *
15250 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f  * like file:////
15260 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65  /host/path to be
15270 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
15280 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74  UNCs like //host
15290 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  /path..      ** 
152a0 54 68 65 20 63 6f 72 72 65 63 74 20 55 52 49 20  The correct URI 
152b0 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61 73  for that UNC has
152c0 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75   only two or fou
152d0 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72  r leading / char
152e0 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  acters.      ** 
152f0 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68  file://host/path
15300 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73   or file:////hos
15310 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c  t/path.  But 5 l
15320 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69  eading slashes i
15330 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  s a .      ** co
15340 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61  mmon error, we a
15350 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68  re told, so we h
15360 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73 70  andle it as a sp
15370 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20  ecial case. */. 
15380 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
15390 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20  (zUri+7, "///", 
153a0 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20  3)==0 ){ iIn++; 
153b0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
153c0 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20  strncmp(zUri+5, 
153d0 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20  "//localhost/", 
153e0 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  12)==0 ){.      
153f0 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a  iIn = 16;.    }.
15400 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69 73  #else.    /* Dis
15410 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
15420 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
15430 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
15440 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
15450 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
15460 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
15470 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
15480 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
15490 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
154a0 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='/' ) iIn++;. 
154b0 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
154c0 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
154d0 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
154e0 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
154f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
15500 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
15510 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
15520 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
15530 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
15540 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
15550 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
15560 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15570 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
15580 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
15590 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
155a0 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  f..    /* Copy t
155b0 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
155c0 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65  any query parame
155d0 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46  ters into the zF
155e0 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20  ile buffer. .   
155f0 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65   ** Decode %HH e
15600 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e  scape codes alon
15610 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20  g the way. .    
15620 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e  **.    ** Within
15630 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69   this loop, vari
15640 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20  able eState may 
15650 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f  be set to 0, 1 o
15660 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20  r 2, depending. 
15670 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72     ** on the par
15680 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73  sing context. As
15690 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
156a0 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72  .    **   0: Par
156b0 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a  sing file-name..
156c0 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73      **   1: Pars
156d0 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e  ing name section
156e0 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
156f0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
15700 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61  ..    **   2: Pa
15710 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74  rsing value sect
15720 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
15730 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
15740 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ter..    */.    
15750 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
15760 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
15770 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
15780 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '#' ){.      iIn
15790 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
157a0 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20  ='%' .       && 
157b0 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
157c0 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20  zUri[iIn]) .    
157d0 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
157e0 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31  digit(zUri[iIn+1
157f0 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ]) .      ){.   
15800 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d       int octet =
15810 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e   (sqlite3HexToIn
15820 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c  t(zUri[iIn++]) <
15830 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63  < 4);.        oc
15840 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65  tet += sqlite3He
15850 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
15860 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  +]);..        as
15870 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26  sert( octet>=0 &
15880 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20  & octet<256 );. 
15890 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74         if( octet
158a0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
158b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 52 49  QLITE_ENABLE_URI
158c0 5f 30 30 5f 45 52 52 4f 52 0a 20 20 20 20 20 20  _00_ERROR.      
158d0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
158e0 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
158f0 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
15900 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
15910 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
15920 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
15930 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
15940 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
15950 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
15960 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
15970 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
15980 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
15990 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
159a0 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
159b0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
159c0 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
159d0 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
159e0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
159f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
15a00 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
15a10 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
15a20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15a30 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
15a40 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
15a50 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
15a60 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
15a70 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
15a80 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
15a90 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
15aa0 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
15ac0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
15ad0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
15ae0 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  e;.#else.       
15af0 20 20 20 2f 2a 20 49 66 20 45 4e 41 42 4c 45 5f     /* If ENABLE_
15b00 55 52 49 5f 30 30 5f 45 52 52 4f 52 20 69 73 20  URI_00_ERROR is 
15b10 64 65 66 69 6e 65 64 2c 20 22 25 30 30 22 20 69  defined, "%00" i
15b20 6e 20 61 20 55 52 49 20 69 73 20 61 6e 20 65 72  n a URI is an er
15b30 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ror. */.        
15b40 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
15b50 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75  lite3_mprintf("u
15b60 6e 65 78 70 65 63 74 65 64 20 25 25 30 30 20 69  nexpected %%00 i
15b70 6e 20 75 72 69 22 29 3b 0a 20 20 20 20 20 20 20  n uri");.       
15b80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
15b90 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
15ba0 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
15bb0 75 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ut;.#endif.     
15bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
15bd0 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65   octet;.      }e
15be0 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d  lse if( eState==
15bf0 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20  1 && (c=='&' || 
15c00 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  c=='=') ){.     
15c10 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75     if( zFile[iOu
15c20 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1]==0 ){.     
15c30 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79       /* An empty
15c40 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67   option name. Ig
15c50 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
15c60 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a   altogether. */.
15c70 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
15c80 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
15c90 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20  ri[iIn]!='#' && 
15ca0 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27  zUri[iIn-1]!='&'
15cb0 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
15cc0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
15cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15ce0 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20  if( c=='&' ){.  
15cf0 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f          zFile[iO
15d00 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
15d10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15d20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
15d30 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
15d40 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
15d50 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74    }else if( (eSt
15d60 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27  ate==0 && c=='?'
15d70 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20  ) || (eState==2 
15d80 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20  && c=='&') ){.  
15d90 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
15da0 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b       eState = 1;
15db0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
15dc0 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63  File[iOut++] = c
15dd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15de0 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c  eState==1 ) zFil
15df0 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
15e00 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
15e10 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
15e20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15e30 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  '\0';..    /* Ch
15e40 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72  eck if there wer
15e50 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70  e any options sp
15e60 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f  ecified that sho
15e70 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74  uld be interpret
15e80 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e  ed .    ** here.
15e90 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72   Options that ar
15ea0 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65  e interpreted he
15eb0 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22  re include "vfs"
15ec0 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a   and those that.
15ed0 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
15ee0 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20  d to flags that 
15ef0 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f  may be passed to
15f00 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65   the sqlite3_ope
15f10 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65  n_v2().    ** me
15f20 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70  thod. */.    zOp
15f30 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74  t = &zFile[sqlit
15f40 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
15f50 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
15f60 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20   zOpt[0] ){.    
15f70 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c    int nOpt = sql
15f80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
15f90 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t);.      char *
15fa0 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70  zVal = &zOpt[nOp
15fb0 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  t+1];.      int 
15fc0 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nVal = sqlite3St
15fd0 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20  rlen30(zVal);.. 
15fe0 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33       if( nOpt==3
15ff0 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22   && memcmp("vfs"
16000 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b  , zOpt, 3)==0 ){
16010 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20  .        zVfs = 
16020 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  zVal;.      }els
16030 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
16040 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20  t OpenMode {.   
16050 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
16060 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  r *z;.          
16070 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  int mode;.      
16080 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a    } *aMode = 0;.
16090 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
160a0 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20  odeType = 0;.   
160b0 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
160c0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
160d0 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  imit = 0;..     
160e0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26     if( nOpt==5 &
160f0 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22  & memcmp("cache"
16100 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b  , zOpt, 5)==0 ){
16110 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
16120 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
16130 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d  e aCacheMode[] =
16140 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
16150 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49   "shared",  SQLI
16160 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
16170 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
16180 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20     { "private", 
16190 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
161a0 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
161b0 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
161c0 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
161d0 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
161e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
161f0 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f  EDCACHE|SQLITE_O
16200 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
16210 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
16220 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a  e = aCacheMode;.
16230 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
16240 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  = mask;.        
16250 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63    zModeType = "c
16260 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d  ache";.        }
16270 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
16280 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==4 && memcmp("
16290 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d  mode", zOpt, 4)=
162a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
162b0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
162c0 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65  enMode aOpenMode
162d0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
162e0 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49     { "ro",  SQLI
162f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
16300 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
16310 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f  { "rw",  SQLITE_
16320 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d  OPEN_READWRITE }
16330 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  , .            {
16340 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f   "rwc", SQLITE_O
16350 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
16360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16370 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  TE },.          
16380 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51    { "memory", SQ
16390 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
163a0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
163b0 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
163c0 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
163d0 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
163e0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53  PEN_READONLY | S
163f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
16400 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
16410 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
16420 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53  _OPEN_CREATE | S
16430 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
16440 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  Y;.          aMo
16450 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a  de = aOpenMode;.
16460 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
16470 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a  = mask & flags;.
16480 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
16490 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a  ype = "access";.
164a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
164b0 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a     if( aMode ){.
164c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
164d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
164e0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
164f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64     for(i=0; aMod
16500 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20  e[i].z; i++){.  
16510 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
16520 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b  char *z = aMode[
16530 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  i].z;.          
16540 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69    if( nVal==sqli
16550 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26  te3Strlen30(z) &
16560 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c  & 0==memcmp(zVal
16570 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20  , z, nVal) ){.  
16580 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
16590 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65   = aMode[i].mode
165a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
165b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
165c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
165d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
165e0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
165f0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
16600 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
16610 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f  f("no such %s mo
16620 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79  de: %s", zModeTy
16630 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
16640 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
16650 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
16660 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
16670 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
16680 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16690 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c  if( (mode & ~SQL
166a0 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
166b0 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  >limit ){.      
166c0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
166d0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
166e0 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61  f("%s mode not a
166f0 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20  llowed: %s",.   
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16720 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20       zModeType, 
16730 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
16740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50     rc = SQLITE_P
16750 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ERM;.           
16760 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
16770 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  out;.          }
16780 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
16790 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73   = (flags & ~mas
167a0 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20  k) | mode;.     
167b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
167c0 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c      zOpt = &zVal
167d0 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a  [nVal+1];.    }.
167e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46  .  }else{.    zF
167f0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
16800 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b 0a  lloc64(nUri+2);.
16810 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
16820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16830 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 69  OMEM_BKPT;.    i
16840 66 28 20 6e 55 72 69 20 29 7b 0a 20 20 20 20 20  f( nUri ){.     
16850 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a   memcpy(zFile, z
16860 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
16870 7d 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  }.    zFile[nUri
16880 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
16890 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c  ile[nUri+1] = '\
168a0 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d  0';.    flags &=
168b0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   ~SQLITE_OPEN_UR
168c0 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73  I;.  }..  *ppVfs
168d0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
168e0 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
168f0 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20   *ppVfs==0 ){.  
16900 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
16910 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
16920 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
16930 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d   zVfs);.    rc =
16940 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
16950 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75   }. parse_uri_ou
16960 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
16970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
16980 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
16990 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30  );.    zFile = 0
169a0 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20  ;.  }.  *pFlags 
169b0 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69  = flags;.  *pzFi
169c0 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65  le = zFile;.  re
169d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
169e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
169f0 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
16a00 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62   opening a datab
16a10 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66  ase on behalf of
16a20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  .** sqlite3_open
16a30 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f  () and sqlite3_o
16a40 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74  pen16(). The dat
16a50 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22  abase filename "
16a60 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20  zFilename"  .** 
16a70 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  is UTF-8 encoded
16a80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16a90 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20  openDatabase(.  
16aa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
16ab0 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61  ename, /* Databa
16ac0 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d  se filename UTF-
16ad0 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73  8 encoded */.  s
16ae0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
16af0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
16b00 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20  turned database 
16b10 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  handle */.  unsi
16b20 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20  gned int flags, 
16b30 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61     /* Operationa
16b40 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  l flags */.  con
16b50 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
16b60 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16b70 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  he VFS to use */
16b80 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
16b90 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
16ba0 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61        /* Store a
16bb0 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20  llocated handle 
16bc0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
16bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
16bf0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
16c00 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20  t isThreadsafe; 
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16c20 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64   True for thread
16c30 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  safe connections
16c40 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65   */.  char *zOpe
16c50 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
16c60 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
16c70 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  e argument to pa
16c80 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28  ss to BtreeOpen(
16c90 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  ) */.  char *zEr
16ca0 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  rMsg = 0;       
16cb0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
16cc0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c  message from sql
16cd0 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a  ite3ParseUri() *
16ce0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16cf0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
16d00 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20  R.  if( ppDb==0 
16d10 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16d20 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
16d30 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b  dif.  *ppDb = 0;
16d40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16d50 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
16d60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
16d70 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
16d80 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16d90 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
16da0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16db0 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30  ig.bCoreMutex==0
16dc0 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
16dd0 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
16de0 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
16df0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
16e00 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
16e10 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
16e20 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
16e30 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
16e40 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
16e50 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20  readsafe = 1;.  
16e60 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72  }else{.    isThr
16e70 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65  eadsafe = sqlite
16e80 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
16e90 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20  ullMutex;.  }.  
16ea0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
16eb0 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
16ec0 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67  ACHE ){.    flag
16ed0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
16ee0 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
16ef0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
16f00 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
16f10 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
16f20 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  d ){.    flags |
16f30 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  = SQLITE_OPEN_SH
16f40 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
16f50 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d    /* Remove harm
16f60 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68  ful bits from th
16f70 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
16f80 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  r.  **.  ** The 
16f90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
16fa0 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  TEX and SQLITE_O
16fb0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c  PEN_FULLMUTEX fl
16fc0 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65  ags were.  ** de
16fd0 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65 20  alt with in the 
16fe0 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c  previous code bl
16ff0 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68  ock.  Besides th
17000 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20  ese, the only.  
17010 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66  ** valid input f
17020 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
17030 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53  _open_v2() are S
17040 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
17050 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  NLY,.  ** SQLITE
17060 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c  _OPEN_READWRITE,
17070 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
17080 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ATE, SQLITE_OPEN
17090 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20  _SHAREDCACHE,.  
170a0 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ** SQLITE_OPEN_P
170b0 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64  RIVATECACHE, and
170c0 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62   some reserved b
170d0 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d  its.  Silently m
170e0 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c  ask.  ** off all
170f0 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20   other flags..  
17100 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e  */.  flags &=  ~
17110 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  ( SQLITE_OPEN_DE
17120 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17140 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
17150 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  VE |.           
17160 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
17170 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20  MAIN_DB |.      
17180 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
17190 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a  OPEN_TEMP_DB | .
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
171b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
171c0 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20  IENT_DB | .     
171d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
171e0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
171f0 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
17200 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17210 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _TEMP_JOURNAL | 
17220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17230 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
17240 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
17250 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
17260 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
17270 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NAL |.          
17280 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17290 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  _NOMUTEX |.     
172a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
172b0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
172c0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
172d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
172e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  .             );
172f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
17300 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 20  the sqlite data 
17310 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64  structure */.  d
17320 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  b = sqlite3Mallo
17330 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71  cZero( sizeof(sq
17340 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20  lite3) );.  if( 
17350 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65  db==0 ) goto ope
17360 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69  ndb_out;.  if( i
17370 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20  sThreadsafe ){. 
17380 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73     db->mutex = s
17390 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
173a0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
173b0 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66  CURSIVE);.    if
173c0 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  ( db->mutex==0 )
173d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
173e0 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20  free(db);.      
173f0 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  db = 0;.      go
17400 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17410 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
17420 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
17430 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
17440 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b  >errMask = 0xff;
17450 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
17460 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
17470 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
17480 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
17490 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61  >aDbStatic;..  a
174a0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
174b0 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
174c0 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
174d0 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
174e0 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
174f0 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
17500 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69  mit));.  db->aLi
17510 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
17520 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
17530 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
17540 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
17550 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
17560 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65  it = 1;.  db->ne
17570 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a  xtAutovac = -1;.
17580 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73    db->szMmap = s
17590 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
175a0 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d  ig.szMmap;.  db-
175b0 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
175c0 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72  0;.  db->nMaxSor
175d0 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46  terMmap = 0x7FFF
175e0 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  FFFF;.  db->flag
175f0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
17600 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49  tColNames | SQLI
17610 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
17620 20 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53   | SQLITE_CacheS
17630 70 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65  pill.#if !define
17640 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  d(SQLITE_DEFAULT
17650 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
17660 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41  ) || SQLITE_DEFA
17670 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
17680 44 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEX.            
17690 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75       | SQLITE_Au
176a0 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23  toIndex.#endif.#
176b0 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
176c0 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a  T_CKPTFULLFSYNC.
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176e0 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75   | SQLITE_CkptFu
176f0 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23  llFSync.#endif.#
17700 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
17710 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a  T_FILE_FORMAT<4.
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17730 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   | SQLITE_Legacy
17740 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23  FileFmt.#endif.#
17750 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17760 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
17770 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
17780 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61      | SQLITE_Loa
17790 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69  dExtension.#endi
177a0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
177b0 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54  AULT_RECURSIVE_T
177c0 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20  RIGGERS.        
177d0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
177e0 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65  E_RecTriggers.#e
177f0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
17800 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
17810 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26  FOREIGN_KEYS) &&
17820 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17830 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20  FOREIGN_KEYS.   
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17850 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
17860 79 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  ys.#endif.#if de
17870 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56  fined(SQLITE_REV
17880 45 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53  ERSE_UNORDERED_S
17890 45 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20 20  ELECTS).        
178a0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
178b0 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23  E_ReverseOrder.#
178c0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
178d0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
178e0 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
178f0 45 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  ECK).           
17900 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43        | SQLITE_C
17910 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66  ellSizeCk.#endif
17920 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
17930 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  ITE_ENABLE_FTS3_
17940 54 4f 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20 20  TOKENIZER).     
17950 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17960 4c 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a  LITE_Fts3Tokeniz
17970 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  er.#endif.#if de
17980 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
17990 42 4c 45 5f 51 50 53 47 29 0a 20 20 20 20 20 20  BLE_QPSG).      
179a0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
179b0 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a 23  ITE_EnableQPSG.#
179c0 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
179d0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
179e0 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
179f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17a00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
17a10 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
17a20 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
17a30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
17a40 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
17a50 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
17a60 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
17a70 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
17a80 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
17a90 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
17aa0 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
17ab0 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
17ac0 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
17ad0 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
17ae0 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
17af0 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
17b00 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
17b10 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lure..  **.  ** 
17b20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
17b30 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74  2786-44878 SQLit
17b40 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20  e defines three 
17b50 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
17b60 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ng.  ** function
17b70 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  s:.  */.  create
17b80 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
17b90 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
17ba0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
17bb0 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
17bc0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
17bd0 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
17be0 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
17bf0 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43  UTF16BE, 0, binC
17c00 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
17c10 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
17c20 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  b, sqlite3StrBIN
17c30 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ARY, SQLITE_UTF1
17c40 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6LE, 0, binCollF
17c50 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
17c60 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
17c70 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
17c80 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
17c90 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
17ca0 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
17cb0 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
17cc0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
17cd0 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46  oid*)1, binCollF
17ce0 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  unc, 0);.  if( d
17cf0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17d00 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
17d10 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a  db_out;.  }.  /*
17d20 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17d30 30 38 33 30 38 2d 31 37 32 32 34 20 54 68 65 20  08308-17224 The 
17d40 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
17d50 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  g function for a
17d60 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20  ll.  ** strings 
17d70 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f  is BINARY. .  */
17d80 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  .  db->pDfltColl
17d90 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
17da0 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
17db0 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74  _UTF8, sqlite3St
17dc0 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61  rBINARY, 0);.  a
17dd0 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74  ssert( db->pDflt
17de0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Coll!=0 );..  /*
17df0 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e   Parse the filen
17e00 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74  ame/URI argument
17e10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c 79 20  .  **.  ** Only 
17e20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
17e30 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
17e40 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
17e50 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
17e60 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
17e70 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
17e80 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
17e90 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
17ea0 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
17eb0 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
17ec0 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
17ed0 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
17ee0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
17ef0 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
17f00 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
17f10 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
17f20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
17f30 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
17f40 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
17f50 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
17f60 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
17f70 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
17f80 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
17f90 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17fa0 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  .  */.  db->open
17fb0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
17fc0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
17fd0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
17fe0 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
17ff0 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
18000 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
18010 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
18020 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
18030 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
18040 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
18050 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
18060 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
18070 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
18080 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
18090 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
180a0 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
180b0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
180c0 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
180d0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
180e0 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
180f0 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
18100 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
18110 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
18120 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  KPT;  /* IMP: R-
18130 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20  65497-44594 */. 
18140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
18150 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
18160 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
18170 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
18180 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
18190 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 69 66  rrMsg);.  }.  if
181a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
181b0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
181c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71  QLITE_NOMEM ) sq
181d0 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62  lite3OomFault(db
181e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  );.    sqlite3Er
181f0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
18200 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  c, zErrMsg ? "%s
18210 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b  " : 0, zErrMsg);
18220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
18230 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
18240 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
18250 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
18260 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
18270 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
18280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
18290 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
182a0 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d   zOpen, db, &db-
182b0 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a  >aDb[0].pBt, 0,.
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182d0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
182e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
182f0 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  _DB);.  if( rc!=
18300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18320 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
18330 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18340 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
18350 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
18360 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20  ror(db, rc);.   
18370 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
18380 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
18390 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44  treeEnter(db->aD
183a0 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
183b0 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
183c0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
183d0 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
183e0 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64  ].pBt);.  if( !d
183f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18400 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45  ) ENC(db) = SCHE
18410 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71  MA_ENC(db);.  sq
18420 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18430 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
18440 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
18450 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
18460 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
18470 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
18480 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
18490 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
184a0 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b 20 66  abase is FULL; f
184b0 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a  or the temp.  **
184c0 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20   database it is 
184d0 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63 68 65  OFF. This matche
184e0 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  s the pager laye
184f0 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20  r defaults.  .  
18500 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  */.  db->aDb[0].
18510 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  zDbSName = "main
18520 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ";.  db->aDb[0].
18530 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53  safety_level = S
18540 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
18550 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64  NCHRONOUS+1;.  d
18560 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e 61  b->aDb[1].zDbSNa
18570 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64  me = "temp";.  d
18580 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79  b->aDb[1].safety
18590 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52 5f 53  _level = PAGER_S
185a0 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a  YNCHRONOUS_OFF;.
185b0 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
185c0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
185d0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
185e0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
185f0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
18600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
18610 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
18620 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
18630 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
18640 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
18650 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
18660 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
18670 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
18680 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
18690 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
186a0 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
186b0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
186c0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
186d0 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 50 65  qlite3RegisterPe
186e0 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c 74  rConnectionBuilt
186f0 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
18700 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18710 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23 69  errcode(db);..#i
18720 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18730 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65 67  LE_FTS5.  /* Reg
18740 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c 74 2d  ister any built-
18750 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 62  in FTS5 module b
18760 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74 68  efore loading th
18770 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a 2a  e automatic.  **
18780 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68 69   extensions. Thi
18790 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61 74  s allows automat
187a0 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 6f  ic extensions to
187b0 20 72 65 67 69 73 74 65 72 20 46 54 53 35 20 0a   register FTS5 .
187c0 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73 20    ** tokenizers 
187d0 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20 66 75  and auxiliary fu
187e0 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69  nctions.  */.  i
187f0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
18800 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
18810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
18820 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69  = sqlite3Fts5Ini
18830 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
18840 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74  f..  /* Load aut
18850 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
18860 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  s - extensions t
18870 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  hat have been re
18880 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73  gistered.  ** us
18890 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
188a0 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73  automatic_extens
188b0 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a  ion() API..  */.
188c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
188d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
188e0 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73  e3AutoLoadExtens
188f0 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63  ions(db);.    rc
18900 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
18910 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  de(db);.    if( 
18920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18930 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
18940 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
18950 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
18960 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69  _ENABLE_FTS1.  i
18970 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
18980 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65  iled ){.    exte
18990 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
189a0 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s1Init(sqlite3*)
189b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
189c0 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a  e3Fts1Init(db);.
189d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
189e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
189f0 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d  _FTS2.  if( !db-
18a00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
18a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18a20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
18a30 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
18a40 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
18a50 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32  rc = sqlite3Fts2
18a60 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
18a70 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
18a80 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20  ITE_ENABLE_FTS3 
18a90 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  /* automatically
18aa0 20 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49   defined by SQLI
18ab0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a  TE_ENABLE_FTS4 *
18ac0 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  /.  if( !db->mal
18ad0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18af0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
18b00 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
18b10 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
18b20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
18b30 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
18b40 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
18b50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75   rc = sqlite3Icu
18b70 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
18b80 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
18b90 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
18ba0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
18bb0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
18bc0 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
18bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65  rc = sqlite3Rtre
18be0 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  eInit(db);.  }.#
18bf0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
18c00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54  LITE_ENABLE_DBST
18c10 41 54 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64  AT_VTAB.  if( !d
18c20 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18c30 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18c40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18c50 74 65 33 44 62 73 74 61 74 52 65 67 69 73 74 65  te3DbstatRegiste
18c60 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  r(db);.  }.#endi
18c70 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
18c80 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20  _ENABLE_JSON1.  
18c90 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18ca0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
18cb0 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
18cc0 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e  = sqlite3Json1In
18cd0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
18ce0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18cf0 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 56 54 41  E_ENABLE_STMTVTA
18d00 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  B.  if( !db->mal
18d10 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18d20 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
18d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 6d   rc = sqlite3Stm
18d40 74 56 74 61 62 49 6e 69 74 28 64 62 29 3b 0a 20  tVtabInit(db);. 
18d50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
18d60 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
18d70 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
18d80 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
18d90 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
18da0 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
18db0 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
18dc0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
18dd0 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
18de0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
18df0 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
18e00 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
18e10 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
18e20 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
18e30 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
18e40 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18e50 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
18e60 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
18e70 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
18e80 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
18e90 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
18ea0 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
18eb0 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
18ec0 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
18ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ee0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18ef0 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
18f00 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 20  endif..  if( rc 
18f10 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64  ) sqlite3Error(d
18f20 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e  b, rc);..  /* En
18f30 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69  able the lookasi
18f40 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  de-malloc subsys
18f50 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f  tem */.  setupLo
18f60 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73  okaside(db, 0, s
18f70 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18f80 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a  ig.szLookaside,.
18f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
18fb0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f  lobalConfig.nLoo
18fc0 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69  kaside);..  sqli
18fd0 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
18fe0 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54  kpoint(db, SQLIT
18ff0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55  E_DEFAULT_WAL_AU
19000 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a  TOCHECKPOINT);..
19010 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66  opendb_out:.  if
19020 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
19030 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
19040 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
19050 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
19060 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
19070 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
19080 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
19090 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
190a0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
190b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
190c0 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73  rcode(db);.  ass
190d0 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63  ert( db!=0 || rc
190e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
190f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19100 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
19110 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
19120 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  );.    db = 0;. 
19130 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
19140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19150 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
19160 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20  TE_MAGIC_SICK;. 
19170 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b   }.  *ppDb = db;
19180 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19190 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69  NABLE_SQLLOG.  i
191a0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
191b0 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29  Config.xSqllog )
191c0 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67  {.    /* Opening
191d0 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f   a db handle. Fo
191e0 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  urth parameter i
191f0 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20  s passed 0. */. 
19200 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20     void *pArg = 
19210 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
19220 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a  fig.pSqllogArg;.
19230 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
19240 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
19250 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e  pArg, db, zFilen
19260 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  ame, 0);.  }.#en
19270 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
19280 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
19290 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ).  if( rc==SQLI
192a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
192b0 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20  st char *zKey;. 
192c0 20 20 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73     if( (zKey = s
192d0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
192e0 65 74 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65 78  eter(zOpen, "hex
192f0 6b 65 79 22 29 29 21 3d 30 20 26 26 20 7a 4b 65  key"))!=0 && zKe
19300 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 75 38  y[0] ){.      u8
19310 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e   iByte;.      in
19320 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20  t i;.      char 
19330 7a 44 65 63 6f 64 65 64 5b 34 30 5d 3b 0a 20 20  zDecoded[40];.  
19340 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79      for(i=0, iBy
19350 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a  te=0; i<sizeof(z
19360 44 65 63 6f 64 65 64 29 2a 32 20 26 26 20 73 71  Decoded)*2 && sq
19370 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 4b  lite3Isxdigit(zK
19380 65 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ey[i]); i++){.  
19390 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69        iByte = (i
193a0 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74  Byte<<4) + sqlit
193b0 65 33 48 65 78 54 6f 49 6e 74 28 7a 4b 65 79 5b  e3HexToInt(zKey[
193c0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i]);.        if(
193d0 20 28 69 26 31 29 21 3d 30 20 29 20 7a 44 65 63   (i&1)!=0 ) zDec
193e0 6f 64 65 64 5b 69 2f 32 5d 20 3d 20 69 42 79 74  oded[i/2] = iByt
193f0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
19400 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28   sqlite3_key_v2(
19410 64 62 2c 20 30 2c 20 7a 44 65 63 6f 64 65 64 2c  db, 0, zDecoded,
19420 20 69 2f 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65   i/2);.    }else
19430 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c   if( (zKey = sql
19440 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
19450 65 72 28 7a 4f 70 65 6e 2c 20 22 6b 65 79 22 29  er(zOpen, "key")
19460 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
19470 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
19480 20 30 2c 20 7a 4b 65 79 2c 20 73 71 6c 69 74 65   0, zKey, sqlite
19490 33 53 74 72 6c 65 6e 33 30 28 7a 4b 65 79 29 29  3Strlen30(zKey))
194a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
194b0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
194c0 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75  e(zOpen);.  retu
194d0 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a  rn rc & 0xff;.}.
194e0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
194f0 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
19500 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
19510 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  3_open(.  const 
19520 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
19530 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
19540 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Db .){.  return 
19550 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
19560 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20  lename, ppDb,.  
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
19590 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
195a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
195b0 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
195c0 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e  3_open_v2(.  con
195d0 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
195e0 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e,   /* Database
195f0 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38   filename (UTF-8
19600 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
19610 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f  *ppDb,         /
19620 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62  * OUT: SQLite db
19630 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
19640 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
19650 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f       /* Flags */
19660 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19670 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  Vfs        /* Na
19680 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65  me of VFS module
19690 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
196a0 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
196b0 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70  ase(filename, pp
196c0 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  Db, (unsigned in
196d0 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  t)flags, zVfs);.
196e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
196f0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
19700 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
19710 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
19720 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
19730 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f  en16(.  const vo
19740 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  id *zFilename, .
19750 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
19760 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
19770 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20   *zFilename8;   
19780 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63  /* zFilename enc
19790 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e  oded in UTF-8 in
197a0 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20  stead of UTF-16 
197b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
197c0 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
197d0 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  rc;..#ifdef SQLI
197e0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
197f0 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d  MOR.  if( ppDb==
19800 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19810 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
19820 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20  endif.  *ppDb = 
19830 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
19840 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
19850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
19860 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
19870 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19880 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  c;.#endif.  if( 
19890 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a  zFilename==0 ) z
198a0 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30  Filename = "\000
198b0 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20  \000";.  pVal = 
198c0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
198d0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
198e0 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
198f0 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51  1, zFilename, SQ
19900 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
19910 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
19920 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d  ;.  zFilename8 =
19930 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
19940 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  t(pVal, SQLITE_U
19950 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  TF8);.  if( zFil
19960 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63  ename8 ){.    rc
19970 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28   = openDatabase(
19980 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62  zFilename8, ppDb
19990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
199a0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
199b0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
199c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
199d0 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  TE, 0);.    asse
199e0 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d  rt( *ppDb || rc=
199f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
19a00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19a10 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73  ITE_OK && !DbHas
19a20 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20  Property(*ppDb, 
19a30 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  0, DB_SchemaLoad
19a40 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48  ed) ){.      SCH
19a50 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d  EMA_ENC(*ppDb) =
19a60 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51   ENC(*ppDb) = SQ
19a70 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
19a80 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
19a90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19aa0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
19ab0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
19ac0 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
19ad0 74 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a  turn rc & 0xff;.
19ae0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19af0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
19b00 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
19b10 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
19b20 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
19b30 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
19b40 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
19b50 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
19b60 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
19b70 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
19b80 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
19b90 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
19ba0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
19bb0 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
19bc0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
19bd0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
19be0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
19bf0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
19c00 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d  tion_v2(db, zNam
19c10 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  e, enc, pCtx, xC
19c20 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f  ompare, 0);.}../
19c30 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
19c40 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
19c50 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
19c60 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
19c70 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
19c80 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
19c90 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
19ca0 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
19cb0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
19cc0 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
19cd0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
19ce0 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
19cf0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
19d00 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
19d10 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
19d20 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
19d30 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
19d40 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
19d50 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
19d60 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
19d70 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
19d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
19d90 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
19da0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
19db0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
19dc0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
19dd0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19de0 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
19df0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
19e00 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70  Name, (u8)enc, p
19e10 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78  Ctx, xCompare, x
19e20 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Del);.  rc = sql
19e30 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
19e40 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
19e50 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
19e60 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
19e70 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
19e80 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
19e90 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
19ea0 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
19eb0 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
19ec0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
19ed0 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
19ee0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
19ef0 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ation16(.  sqlit
19f00 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
19f10 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20   void *zName,.  
19f20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
19f30 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
19f40 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
19f50 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
19f60 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
19f70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
19f80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
19f90 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66  *zName8;..#ifdef
19fa0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
19fb0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
19fc0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
19fd0 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d  ckOk(db) || zNam
19fe0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
19ff0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1a000 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1a010 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1a020 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
1a030 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
1a040 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d  Failed );.  zNam
1a050 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  e8 = sqlite3Utf1
1a060 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  6to8(db, zName, 
1a070 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
1a080 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a  NATIVE);.  if( z
1a090 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  Name8 ){.    rc 
1a0a0 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
1a0b0 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75  n(db, zName8, (u
1a0c0 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
1a0d0 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73  mpare, 0);.    s
1a0e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a0f0 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20   zName8);.  }.  
1a100 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
1a110 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
1a120 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1a130 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1a140 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1a150 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1a160 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
1a170 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
1a180 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1a190 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
1a1a0 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
1a1b0 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
1a1c0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
1a1d0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
1a1e0 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
1a1f0 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
1a200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1a210 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
1a220 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1a230 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
1a240 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
1a250 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
1a260 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
1a270 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
1a280 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65   char*).){.#ifde
1a290 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a2a0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1a2b0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1a2c0 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1a2d0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1a2e0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1a2f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a300 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1a310 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1a320 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b  d = xCollNeeded;
1a330 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
1a340 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  ed16 = 0;.  db->
1a350 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
1a360 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
1a370 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a380 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1a390 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1a3a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1a3b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1a3c0 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
1a3d0 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
1a3e0 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
1a3f0 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
1a400 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1a410 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
1a420 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
1a430 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
1a440 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1a450 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
1a460 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
1a470 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74  eeded16(.  sqlit
1a480 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
1a490 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
1a4a0 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
1a4b0 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73  eeded16)(void*,s
1a4c0 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
1a4d0 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  tRep,const void*
1a4e0 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
1a4f0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1a500 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1a510 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1a520 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1a530 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1a540 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1a550 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1a560 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1a570 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b  xCollNeeded = 0;
1a580 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
1a590 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  ed16 = xCollNeed
1a5a0 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c  ed16;.  db->pCol
1a5b0 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
1a5c0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
1a5d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1a5e0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1a5f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a600 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
1a610 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1a620 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
1a630 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
1a640 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  TED./*.** This f
1a650 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61  unction is now a
1a660 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49  n anachronism. I
1a670 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65  t used to be use
1a680 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  d to recover fro
1a690 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20  m a.** malloc() 
1a6a0 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c  failure, but SQL
1a6b0 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69  ite now does thi
1a6c0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  s automatically.
1a6d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a6e0 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76  global_recover(v
1a6f0 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  oid){.  return S
1a700 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1a710 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  if../*.** Test t
1a720 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
1a730 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
1a740 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
1a750 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a  in autocommit.**
1a760 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54   mode.  Return T
1a770 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64  RUE if it is and
1a780 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20   FALSE if not.  
1a790 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  Autocommit mode 
1a7a0 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61  is on.** by defa
1a7b0 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  ult.  Autocommit
1a7c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20   is disabled by 
1a7d0 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
1a7e0 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a  t and reenabled.
1a7f0 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43  ** by the next C
1a800 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
1a810 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
1a820 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
1a830 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
1a840 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a850 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1a860 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1a870 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
1a880 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
1a890 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1a8a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1a8b0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1a8c0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b   db->autoCommit;
1a8d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
1a8e0 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
1a8f0 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65 73   are substitutes
1a900 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53   for constants S
1a910 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a  QLITE_CORRUPT,.*
1a920 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  * SQLITE_MISUSE,
1a930 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1a940 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61  , SQLITE_NOMEM a
1a950 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65  nd possibly othe
1a960 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74  r error.** const
1a970 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76  ants.  They serv
1a980 65 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a  e two purposes:.
1a990 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76  **.**   1.  Serv
1a9a0 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  e as a convenien
1a9b0 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
1a9c0 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61   breakpoint in a
1a9d0 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20   debugger.**    
1a9e0 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65     to detect whe
1a9f0 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20  n version error 
1aa00 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72  conditions occur
1aa10 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49  s..**.**   2.  I
1aa20 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f  nvoke sqlite3_lo
1aa30 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74  g() to provide t
1aa40 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c  he source code l
1aa50 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  ocation where.**
1aa60 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76         a low-lev
1aa70 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73  el error is firs
1aa80 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 73  t detected..*/.s
1aa90 74 61 74 69 63 20 69 6e 74 20 72 65 70 6f 72 74  tatic int report
1aaa0 45 72 72 6f 72 28 69 6e 74 20 69 45 72 72 2c 20  Error(int iErr, 
1aab0 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73  int lineno, cons
1aac0 74 20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a  t char *zType){.
1aad0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45    sqlite3_log(iE
1aae0 72 72 2c 20 22 25 73 20 61 74 20 6c 69 6e 65 20  rr, "%s at line 
1aaf0 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
1ab10 79 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b  ype, lineno, 20+
1ab20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
1ab30 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 45  ());.  return iE
1ab40 72 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rr;.}.int sqlite
1ab50 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e  3CorruptError(in
1ab60 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1ab70 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1ab80 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1ab90 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
1aba0 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1abb0 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e  E_CORRUPT, linen
1abc0 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f 72  o, "database cor
1abd0 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e 74  ruption");.}.int
1abe0 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
1abf0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1ac00 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1ac10 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ac20 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1ac30 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72  turn reportError
1ac40 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20  (SQLITE_MISUSE, 
1ac50 6c 69 6e 65 6e 6f 2c 20 22 6d 69 73 75 73 65 22  lineno, "misuse"
1ac60 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1ac70 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e  CantopenError(in
1ac80 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1ac90 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1aca0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1acb0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
1acc0 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54  eportError(SQLIT
1acd0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65  E_CANTOPEN, line
1ace0 6e 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  no, "cannot open
1acf0 20 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65   file");.}.#ifde
1ad00 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
1ad10 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
1ad20 74 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c  tPgnoError(int l
1ad30 69 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f  ineno, Pgno pgno
1ad40 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31  ){.  char zMsg[1
1ad50 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  00];.  sqlite3_s
1ad60 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
1ad70 4d 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74  Msg), zMsg, "dat
1ad80 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1ad90 20 70 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29   page %d", pgno)
1ada0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  ;.  testcase( sq
1adb0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1adc0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1add0 65 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f  eturn reportErro
1ade0 72 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  r(SQLITE_CORRUPT
1adf0 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b  , lineno, zMsg);
1ae00 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4e 6f  .}.int sqlite3No
1ae10 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  memError(int lin
1ae20 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1ae30 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1ae40 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1ae50 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74  .  return report
1ae60 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  Error(SQLITE_NOM
1ae70 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d  EM, lineno, "OOM
1ae80 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ");.}.int sqlite
1ae90 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72  3IoerrnomemError
1aea0 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
1aeb0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1aec0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1aed0 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  og!=0 );.  retur
1aee0 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51  n reportError(SQ
1aef0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1af00 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f 4f 20 4f  , lineno, "I/O O
1af10 4f 4d 20 65 72 72 6f 72 22 29 3b 0a 7d 0a 23 65  OM error");.}.#e
1af20 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1af30 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
1af40 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
1af50 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  is a convenience
1af60 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61   routine that ma
1af70 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c  kes sure that al
1af80 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  l thread-specifi
1af90 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68  c.** data for th
1afa0 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65  is thread has be
1afb0 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a  en deallocated..
1afc0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20  **.** SQLite no 
1afd0 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65  longer uses thre
1afe0 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
1aff0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
1b000 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d   is now a.** no-
1b010 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69  op.  It is retai
1b020 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ned for historic
1b030 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  al compatibility
1b040 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b050 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
1b060 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66  (void){.}.#endif
1b070 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d  ../*.** Return m
1b080 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
1b090 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63  about a specific
1b0a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74   column of a dat
1b0b0 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
1b0c0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73  See comment in s
1b0d0 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65  qlite3.h (sqlite
1b0e0 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69  .h.in) for detai
1b0f0 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
1b100 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
1b110 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
1b120 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1b130 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
1b140 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
1b150 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1b160 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
1b170 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
1b180 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
1b190 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
1b1a0 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
1b1b0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
1b1c0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
1b1d0 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
1b1e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
1b1f0 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
1b200 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
1b210 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
1b220 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
1b230 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
1b240 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
1b250 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
1b260 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
1b270 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
1b280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1b290 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
1b2a0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1b2b0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
1b2c0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
1b2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
1b2e0 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
1b2f0 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
1b300 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
1b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b320 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1b330 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
1b340 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
1b350 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1b360 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
1b370 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1b380 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
1b390 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
1b3a0 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  l = 0;.  char co
1b3b0 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d  nst *zDataType =
1b3c0 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
1b3d0 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a   *zCollSeq = 0;.
1b3e0 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20    int notnull = 
1b3f0 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  0;.  int primary
1b400 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  key = 0;.  int a
1b410 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69  utoinc = 0;...#i
1b420 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b430 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1b440 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1b450 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
1b460 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b  zTableName==0 ){
1b470 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b480 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1b490 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1b4a0 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61   Ensure the data
1b4b0 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
1b4c0 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  been loaded */. 
1b4d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1b4e0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1b4f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b500 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72  nterAll(db);.  r
1b510 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28  c = sqlite3Init(
1b520 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  db, &zErrMsg);. 
1b530 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1b540 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  rc ){.    goto e
1b550 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
1b560 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74   /* Locate the t
1b570 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
1b580 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   */.  pTab = sql
1b590 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
1b5a0 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44  , zTableName, zD
1b5b0 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70  bName);.  if( !p
1b5c0 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  Tab || pTab->pSe
1b5d0 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62  lect ){.    pTab
1b5e0 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 0;.    goto e
1b5f0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
1b600 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c   /* Find the col
1b610 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e  umn for which in
1b620 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20  fo is requested 
1b630 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e  */.  if( zColumn
1b640 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
1b650 2a 20 51 75 65 72 79 20 66 6f 72 20 65 78 69 73  * Query for exis
1b660 74 61 6e 63 65 20 6f 66 20 74 61 62 6c 65 20 6f  tance of table o
1b670 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  nly */.  }else{.
1b680 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
1b690 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
1b6a0 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
1b6b0 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
1b6c0 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
1b6d0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
1b6e0 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
1b6f0 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
1b700 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1b710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b720 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
1b730 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
1b740 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
1b750 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 49  Tab) && sqlite3I
1b760 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61  sRowid(zColumnNa
1b770 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  me) ){.        i
1b780 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
1b790 79 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 20  y;.        pCol 
1b7a0 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61  = iCol>=0 ? &pTa
1b7b0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20  b->aCol[iCol] : 
1b7c0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1b7d0 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 30          pTab = 0
1b7e0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1b7f0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  rror_out;.      
1b800 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1b810 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1b820 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
1b830 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
1b840 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
1b850 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
1b860 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
1b870 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
1b880 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
1b890 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
1b8a0 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
1b8b0 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
1b8c0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
1b8d0 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
1b8e0 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
1b8f0 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
1b900 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
1b910 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
1b920 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
1b930 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
1b940 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
1b950 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
1b960 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
1b970 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
1b980 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
1b990 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
1b9a0 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
1b9b0 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
1b9c0 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
1b9d0 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
1b9e0 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
1b9f0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
1ba00 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
1ba10 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
1ba20 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f  Type = sqlite3Co
1ba30 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c 30 29  lumnType(pCol,0)
1ba40 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  ;.    zCollSeq =
1ba50 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20   pCol->zColl;.  
1ba60 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c    notnull = pCol
1ba70 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20  ->notNull!=0;.  
1ba80 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20    primarykey  = 
1ba90 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20  (pCol->colFlags 
1baa0 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
1bab0 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69  Y)!=0;.    autoi
1bac0 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  nc = pTab->iPKey
1bad0 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d  ==iCol && (pTab-
1bae0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
1baf0 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
1bb00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
1bb10 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45  DataType = "INTE
1bb20 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72  GER";.    primar
1bb30 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ykey = 1;.  }.  
1bb40 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b  if( !zCollSeq ){
1bb50 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
1bb60 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1bb70 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
1bb80 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  :.  sqlite3Btree
1bb90 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
1bba0 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20   /* Whether the 
1bbb0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75  function call su
1bbc0 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65  cceeded or faile
1bbd0 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  d, set the outpu
1bbe0 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a  t parameters.  *
1bbf0 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68  * to whatever th
1bc00 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65  eir local counte
1bc10 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20  rparts contain. 
1bc20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  If an error did 
1bc30 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73  occur,.  ** this
1bc40 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
1bc50 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f  of zeroing all o
1bc60 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
1bc70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44  ..  */.  if( pzD
1bc80 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74  ataType ) *pzDat
1bc90 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70  aType = zDataTyp
1bca0 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53  e;.  if( pzCollS
1bcb0 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20  eq ) *pzCollSeq 
1bcc0 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66  = zCollSeq;.  if
1bcd0 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e  ( pNotNull ) *pN
1bce0 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c  otNull = notnull
1bcf0 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79  ;.  if( pPrimary
1bd00 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b  Key ) *pPrimaryK
1bd10 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b  ey = primarykey;
1bd20 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20  .  if( pAutoinc 
1bd30 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75  ) *pAutoinc = au
1bd40 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51  toinc;..  if( SQ
1bd50 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21  LITE_OK==rc && !
1bd60 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
1bd70 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
1bd80 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72  rrMsg);.    zErr
1bd90 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
1bda0 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63  intf(db, "no suc
1bdb0 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
1bdc0 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  %s.%s", zTableNa
1bdd0 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  me,.        zCol
1bde0 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  umnName);.    rc
1bdf0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1be00 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
1be10 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
1be20 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22  c, (zErrMsg?"%s"
1be30 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  :0), zErrMsg);. 
1be40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1be50 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  b, zErrMsg);.  r
1be60 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
1be70 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
1be80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1be90 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1bea0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1beb0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
1bec0 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
1bed0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
1bee0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
1bef0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1bf00 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
1bf10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1bf20 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
1bf30 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
1bf40 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
1bf50 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
1bf60 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
1bf70 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
1bf80 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
1bf90 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
1bfa0 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
1bfb0 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
1bfc0 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
1bfd0 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
1bfe0 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
1bff0 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
1c000 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
1c010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c020 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
1c030 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
1c040 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
1c050 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1c060 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
1c070 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
1c080 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23  b, int onoff){.#
1c090 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c0a0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1c0b0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1c0c0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1c0d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1c0e0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1c0f0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1c100 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1c110 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
1c120 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66  k = onoff ? 0xff
1c130 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20  ffffff : 0xff;. 
1c140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c150 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1c160 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c170 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1c180 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f  voke the xFileCo
1c190 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20  ntrol method on 
1c1a0 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1c1b0 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
1c1c0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
1c1d0 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ol(sqlite3 *db, 
1c1e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1c1f0 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  ame, int op, voi
1c200 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20  d *pArg){.  int 
1c210 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1c220 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  R;.  Btree *pBtr
1c230 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ee;..#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 70 42 74 72  ->mutex);.  pBtr
1c2c0 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  ee = sqlite3DbNa
1c2d0 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1c2e0 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42  bName);.  if( pB
1c2f0 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
1c300 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73  r *pPager;.    s
1c310 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
1c320 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1c330 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1c340 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
1c350 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
1c360 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
1c370 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1c380 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65  .    fd = sqlite
1c390 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
1c3a0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
1c3b0 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  fd!=0 );.    if(
1c3c0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
1c3d0 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
1c3e0 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
1c3f0 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
1c400 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  fd;.      rc = S
1c410 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1c420 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  lse if( op==SQLI
1c430 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49  TE_FCNTL_VFS_POI
1c440 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28  NTER ){.      *(
1c450 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70 41  sqlite3_vfs**)pA
1c460 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rg = sqlite3Page
1c470 72 56 66 73 28 70 50 61 67 65 72 29 3b 0a 20 20  rVfs(pPager);.  
1c480 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c490 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
1c4a0 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
1c4b0 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54  TL_JOURNAL_POINT
1c4c0 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71  ER ){.      *(sq
1c4d0 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72  lite3_file**)pAr
1c4e0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
1c4f0 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67 65 72 29  JrnlFile(pPager)
1c500 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1c510 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1c520 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f  e if( fd->pMetho
1c530 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ds ){.      rc =
1c540 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
1c550 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41  ntrol(fd, op, pA
1c560 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rg);.    }else{.
1c570 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c580 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20  E_NOTFOUND;.    
1c590 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1c5a0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
1c5b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1c5c0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1c5d0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1c5e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  rc;.}../*.** Int
1c5f0 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
1c600 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
1c610 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
1c620 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
1c630 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
1c640 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
1c650 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20 20  TE_UNTESTABLE.  
1c660 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c670 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61  (op);.#else.  va
1c680 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
1c690 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
1c6a0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
1c6b0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76     /*.    ** Sav
1c6c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  e the current st
1c6d0 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e  ate of the PRNG.
1c6e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c6f0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1c700 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20  _PRNG_SAVE: {.  
1c710 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53      sqlite3PrngS
1c720 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  aveState();.    
1c730 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1c740 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
1c750 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20  store the state 
1c760 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74  of the PRNG to t
1c770 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61  he last state sa
1c780 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  ved using.    **
1c790 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20   PRNG_SAVE.  If 
1c7a0 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65  PRNG_SAVE has ne
1c7b0 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
1c7c0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  called, then.   
1c7d0 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63   ** this verb ac
1c7e0 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53  ts like PRNG_RES
1c7f0 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ET..    */.    c
1c800 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c810 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
1c820 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1c830 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74  3PrngRestoreStat
1c840 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
1c850 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1c860 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65      ** Reset the
1c870 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74   PRNG back to it
1c880 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
1c890 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74  state.  The next
1c8a0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
1c8b0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1c8c0 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64  ss() will reseed
1c8d0 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20   the PRNG using 
1c8e0 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20  a single call.  
1c8f0 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e    ** to the xRan
1c900 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f  domness method o
1c910 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  f the default VF
1c920 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  S..    */.    ca
1c930 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c940 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b  RL_PRNG_RESET: {
1c950 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
1c960 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
1c970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c980 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1c990 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1c9a0 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54  control(BITVEC_T
1c9b0 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72  EST, size, progr
1c9c0 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  am).    **.    *
1c9d0 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61  * Run a test aga
1c9e0 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62  inst a Bitvec ob
1c9f0 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54  ject of size.  T
1ca00 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d  he program argum
1ca10 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e  ent.    ** is an
1ca20 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
1ca30 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  rs that defines 
1ca40 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72  the test.  Retur
1ca50 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a  n -1 on a.    **
1ca60 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1ca70 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73  on error, 0 on s
1ca80 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a  uccess, or non-z
1ca90 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72  ero for an error
1caa0 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65  ..    ** See the
1cab0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
1cac0 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20  iltinTest() for 
1cad0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1cae0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
1caf0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1cb00 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54  ESTCTRL_BITVEC_T
1cb10 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EST: {.      int
1cb20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
1cb30 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74   int);.      int
1cb40 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67   *aProg = va_arg
1cb50 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
1cb60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
1cb70 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
1cb80 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20  sz, aProg);.    
1cb90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1cba0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1cbb0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1cbc0 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c  rol(FAULT_INSTAL
1cbd0 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20  L, xCallback).  
1cbe0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61    **.    ** Arra
1cbf0 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43  nge to invoke xC
1cc00 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76  allback() whenev
1cc10 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  er sqlite3FaultS
1cc20 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a  im() is called,.
1cc30 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62      ** if xCallb
1cc40 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ack is not NULL.
1cc50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1cc60 73 20 61 20 74 65 73 74 20 6f 66 20 74 68 65 20  s a test of the 
1cc70 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20  fault simulator 
1cc80 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66  mechanism itself
1cc90 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  , sqlite3FaultSi
1cca0 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63  m(0).    ** is c
1ccb0 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  alled immediatel
1ccc0 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69  y after installi
1ccd0 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62  ng the new callb
1cce0 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75  ack and the retu
1ccf0 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  rn.    ** value 
1cd00 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c  from sqlite3Faul
1cd10 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20  tSim(0) becomes 
1cd20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a  the return from.
1cd30 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74      ** sqlite3_t
1cd40 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20  est_control().. 
1cd50 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1cd60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
1cd70 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a  AULT_INSTALL: {.
1cd80 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
1cd90 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
1cda0 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
1cdb0 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
1cdc0 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
1cdd0 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
1cde0 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
1cdf0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
1ce00 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43  balConfig.xTestC
1ce10 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67  allback = va_arg
1ce20 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29  (ap, int(*)(int)
1ce30 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  );.      */.    
1ce40 20 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54    typedef int(*T
1ce50 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f  ESTCALLBACKFUNC_
1ce60 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  t)(int);.      s
1ce70 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ce80 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b  ig.xTestCallback
1ce90 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45   = va_arg(ap, TE
1cea0 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74  STCALLBACKFUNC_t
1ceb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1cec0 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
1ced0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1cee0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1cef0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1cf00 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e  t_control(BENIGN
1cf10 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78  _MALLOC_HOOKS, x
1cf20 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20  Begin, xEnd).   
1cf30 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73   **.    ** Regis
1cf40 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c  ter hooks to cal
1cf50 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  l to indicate wh
1cf60 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ich malloc() fai
1cf70 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72  lures .    ** ar
1cf80 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f  e benign..    */
1cf90 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1cfa0 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e  _TESTCTRL_BENIGN
1cfb0 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b  _MALLOC_HOOKS: {
1cfc0 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
1cfd0 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74  oid (*void_funct
1cfe0 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20  ion)(void);.    
1cff0 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
1d000 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20  xBenignBegin;.  
1d010 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
1d020 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20  n xBenignEnd;.  
1d030 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e      xBenignBegin
1d040 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1d050 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
1d060 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d      xBenignEnd =
1d070 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1d080 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
1d090 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d    sqlite3BenignM
1d0a0 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69  allocHooks(xBeni
1d0b0 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e  gnBegin, xBenign
1d0c0 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  End);.      brea
1d0d0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d0e0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1d0f0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1d100 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
1d110 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69  NDING_BYTE, unsi
1d120 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20  gned int X).    
1d130 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1d140 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74  e PENDING byte t
1d150 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  o the value in t
1d160 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  he argument, if 
1d170 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65  X>0..    ** Make
1d180 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58   no changes if X
1d190 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ==0.  Return the
1d1a0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65   value of the pe
1d1b0 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a  nding byte.    *
1d1c0 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67  * as it existing
1d1d0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
1d1e0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e  tine was called.
1d1f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1d200 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67  MPORTANT:  Chang
1d210 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
1d220 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30  byte from 0x4000
1d230 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a  0000 results in.
1d240 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70      ** an incomp
1d250 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20  atible database 
1d260 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68  file format.  Ch
1d270 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
1d280 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77  NG byte.    ** w
1d290 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73  hile any databas
1d2a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
1d2b0 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  open results in 
1d2c0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20  undefined and.  
1d2d0 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73    ** deleterious
1d2e0 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a   behavior..    *
1d2f0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1d300 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
1d310 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20  NG_BYTE: {.     
1d320 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59   rc = PENDING_BY
1d330 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  TE;.#ifndef SQLI
1d340 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20  TE_OMIT_WSD.    
1d350 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69    {.        unsi
1d360 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20  gned int newVal 
1d370 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73  = va_arg(ap, uns
1d380 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20  igned int);.    
1d390 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29      if( newVal )
1d3a0 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42   sqlite3PendingB
1d3b0 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20  yte = newVal;.  
1d3c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1d3d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d3e0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1d3f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d400 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1d410 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74  CTRL_ASSERT, int
1d420 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
1d430 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
1d440 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
1d450 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68  e test to see wh
1d460 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20  ether or not.   
1d470 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73   ** assert() was
1d480 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
1d490 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20  ile-time.  If X 
1d4a0 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65  is true and asse
1d4b0 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65  rt().    ** is e
1d4c0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
1d4d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1d4e0 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20   true.  If X is 
1d4f0 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20  true and.    ** 
1d500 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
1d510 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1d520 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
1d530 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20  ero.  If X is.  
1d540 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61    ** false and a
1d550 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
1d560 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73  ed, then the ass
1d570 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64  ertion fires and
1d580 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63   the.    ** proc
1d590 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20  ess aborts.  If 
1d5a0 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61  X is false and a
1d5b0 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1d5c0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  led, then the.  
1d5d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
1d5e0 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e is zero..    *
1d5f0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1d600 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1d610 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74  T: {.      volat
1d620 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20  ile int x = 0;. 
1d630 20 20 20 20 20 61 73 73 65 72 74 28 20 2f 2a 73       assert( /*s
1d640 69 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b 2a 2f  ide-effects-ok*/
1d650 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (x = va_arg(ap,
1d660 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  int))!=0 );.    
1d670 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20    rc = x;.      
1d680 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
1d690 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1d6a0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d6b0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d6c0 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58  RL_ALWAYS, int X
1d6d0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1d6e0 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1d6f0 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1d700 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20  test to see how 
1d710 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20  the ALWAYS and. 
1d720 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72     ** NEVER macr
1d730 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  os were defined 
1d740 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
1d750 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d760 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1d770 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a  is ALWAYS(X).  .
1d780 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1d790 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65  e recommended te
1d7a0 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20  st is X==2.  If 
1d7b0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1d7c0 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e   is 2, that mean
1d7d0 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28  s.    ** ALWAYS(
1d7e0 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1d7f0 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73  e both no-op pas
1d800 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
1d810 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20  , which is the. 
1d820 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65     ** default se
1d830 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  tting.  If the r
1d840 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
1d850 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20  , then ALWAYS() 
1d860 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  is either.    **
1d870 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74   hard-coded to t
1d880 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61  rue or else it a
1d890 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72  sserts if its ar
1d8a0 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e  gument is false.
1d8b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
1d8c0 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64  t behavior (hard
1d8d0 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20  -coded to true) 
1d8e0 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
1d8f0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
1d900 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
1d910 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
1d920 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64   is disabled and
1d930 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
1d940 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73  ** behavior (ass
1d950 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ert if the argum
1d960 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20  ent to ALWAYS() 
1d970 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65  is false) is the
1d980 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1d990 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d9a0 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1d9b0 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  t assert() is en
1d9c0 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  abled..    **.  
1d9d0 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d    ** The run-tim
1d9e0 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
1d9f0 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
1da00 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
1da10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1da20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
1da30 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1da40 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1da50 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20  S, 2)==2 ){.    
1da60 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1da70 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1da80 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  are no-op pass-t
1da90 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20  hrough macros.  
1daa0 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66    **    }else if
1dab0 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
1dac0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1dad0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31  STCTRL_ASSERT, 1
1dae0 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  ) ){.    **     
1daf0 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73   // ALWAYS(x) as
1db00 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20  serts that x is 
1db10 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61  true. NEVER(x) a
1db20 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73  sserts x is fals
1db30 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  e..    **    }el
1db40 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se{.    **      
1db50 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20  // ALWAYS(x) is 
1db60 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e  a constant 1.  N
1db70 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e  EVER(x) is a con
1db80 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20  stant 0..    ** 
1db90 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
1dba0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1dbb0 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20  CTRL_ALWAYS: {. 
1dbc0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
1dbd0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1dbe0 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78     rc = ALWAYS(x
1dbf0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1dc00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1dc10 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    **   sqlite3_t
1dc20 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1dc30 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45  TE_TESTCTRL_BYTE
1dc40 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20  ORDER);.    **. 
1dc50 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65     ** The intege
1dc60 72 20 72 65 74 75 72 6e 65 64 20 72 65 76 65 61  r returned revea
1dc70 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65  ls the byte-orde
1dc80 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65  r of the compute
1dc90 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a  r on which.    *
1dca0 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e  * SQLite is runn
1dcb0 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ing:.    **.    
1dcc0 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 62  **       1     b
1dcd0 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65  ig-endian,    de
1dce0 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d  termined at run-
1dcf0 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  time.    **     
1dd00 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65   10     little-e
1dd10 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1dd20 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20  d at run-time.  
1dd30 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20    **  432101    
1dd40 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20   big-endian,    
1dd50 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f  determined at co
1dd60 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a  mpile-time.    *
1dd70 2a 20 20 31 32 33 34 31 30 20 20 20 20 20 6c 69  *  123410     li
1dd80 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
1dd90 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69  ermined at compi
1dda0 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a  le-time.    */ .
1ddb0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ddc0 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44  TESTCTRL_BYTEORD
1ddd0 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ER: {.      rc =
1dde0 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45   SQLITE_BYTEORDE
1ddf0 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c  R*100 + SQLITE_L
1de00 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b  ITTLEENDIAN*10 +
1de10 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41   SQLITE_BIGENDIA
1de20 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  N;.      break;.
1de30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1de40 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1de50 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1de60 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71  CTRL_RESERVE, sq
1de70 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
1de80 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1de90 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65  Set the nReserve
1dea0 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74   size to N for t
1deb0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1dec0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ded0 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  .    ** connecti
1dee0 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  on db..    */.  
1def0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1df00 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20  STCTRL_RESERVE: 
1df10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
1df20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
1df30 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
1df40 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
1df50 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1df60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1df70 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1df80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1df90 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62  eeSetPageSize(db
1dfa0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
1dfb0 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   x, 0);.      sq
1dfc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1dfd0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1dfe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1dff0 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
1e000 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1e010 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1e020 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71  PTIMIZATIONS, sq
1e030 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
1e040 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1e050 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
1e060 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  e various optimi
1e070 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74  zations for test
1e080 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54  ing purposes.  T
1e090 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d  he .    ** argum
1e0a0 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61  ent N is a bitma
1e0b0 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  sk of optimizati
1e0c0 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ons to be disabl
1e0d0 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a  ed.  For normal.
1e0e0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
1e0f0 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20   N should be 0. 
1e100 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
1e110 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d  t a test program
1e120 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a   (like the.    *
1e130 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74  * SQL Logic Test
1e140 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64   or SLT test mod
1e150 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65  ule) can run the
1e160 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70   same SQL multip
1e170 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20  le times.    ** 
1e180 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74  with various opt
1e190 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62  imizations disab
1e1a0 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68  led to verify th
1e1b0 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
1e1c0 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74  er.    ** is obt
1e1d0 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63  ained in every c
1e1e0 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1e1f0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e200 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1e210 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NS: {.      sqli
1e220 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1e230 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1e240 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46        db->dbOptF
1e250 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f  lags = (u16)(va_
1e260 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30  arg(ap, int) & 0
1e270 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72  xffff);.      br
1e280 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
1e290 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  ef SQLITE_N_KEYW
1e2a0 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  ORD.    /* sqlit
1e2b0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e2c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e2d0 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74  ISKEYWORD, const
1e2e0 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20   char *zWord).  
1e2f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a    **.    ** If z
1e300 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72  Word is a keywor
1e310 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20  d recognized by 
1e320 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e  the parser, then
1e330 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20   return the.    
1e340 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79  ** number of key
1e350 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57  words.  Or if zW
1e360 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79  ord is not a key
1e370 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a  word, return 0..
1e380 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54      ** .    ** T
1e390 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72 65  his test feature
1e3a0 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
1e3b0 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61  le in the amalga
1e3c0 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20  mation since.   
1e3d0 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e   ** the SQLITE_N
1e3e0 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69  _KEYWORD macro i
1e3f0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e  s not defined in
1e400 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53 51   this file if SQ
1e410 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  Lite.    ** is b
1e420 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72  uilt using separ
1e430 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73  ate source files
1e440 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e450 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e460 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20  L_ISKEYWORD: {. 
1e470 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1e480 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28  *zWord = va_arg(
1e490 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
1e4a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
1e4b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1e4c0 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63  zWord);.      rc
1e4d0 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f   = (sqlite3Keywo
1e4e0 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72  rdCode((u8*)zWor
1e4f0 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20  d, n)!=TK_ID) ? 
1e500 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
1e510 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   : 0;.      brea
1e520 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
1e530 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1e540 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e550 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e560 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c  LOCALTIME_FAULT,
1e570 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20   int onoff);.   
1e580 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70 61   **.    ** If pa
1e590 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69 73  rameter onoff is
1e5a0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69   non-zero, confi
1e5b0 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65 72  gure the wrapper
1e5c0 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20  s so that all.  
1e5d0 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
1e5e0 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69  calls to localti
1e5f0 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e 74  me() and variant
1e600 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66  s fail. If onoff
1e610 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a   is zero,.    **
1e620 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74 69   undo this setti
1e630 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ng..    */.    c
1e640 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e650 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
1e660 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ULT: {.      sql
1e670 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1e680 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74  .bLocaltimeFault
1e690 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1e6a0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1e6b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1e6c0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e6d0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e6e0 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
1e6f0 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a  UPT, int);.    *
1e700 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20  *.    ** Set or 
1e710 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68 61  clear a flag tha
1e720 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
1e730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e740 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c  le is always wel
1e750 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64  l-.    ** formed
1e760 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75   and never corru
1e770 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69  pt.  This flag i
1e780 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61 75  s clear by defau
1e790 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lt, indicating t
1e7a0 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  hat.    ** datab
1e7b0 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20  ase files might 
1e7c0 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20 63  have arbitrary c
1e7d0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74  orruption.  Sett
1e7e0 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75 72  ing the flag dur
1e7f0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69  ing.    ** testi
1e800 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61 69  ng causes certai
1e810 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1e820 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64  ments in the cod
1e830 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74 65  e to be activate
1e840 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65  d.    ** that de
1e850 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61  monstrat invaria
1e860 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d  nts on well-form
1e870 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1e880 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
1e890 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1e8a0 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
1e8b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1e8c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65  3GlobalConfig.ne
1e8d0 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f  verCorrupt = va_
1e8e0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1e8f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e900 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1e910 20 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77 68   threshold at wh
1e920 69 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e  ich OP_Once coun
1e930 74 65 72 73 20 72 65 73 65 74 20 62 61 63 6b 20  ters reset back 
1e940 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 20  to zero..    ** 
1e950 42 79 20 64 65 66 61 75 6c 74 20 74 68 69 73 20  By default this 
1e960 69 73 20 30 78 37 66 66 66 66 66 66 65 20 28 6f  is 0x7ffffffe (o
1e970 76 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c 20  ver 2 billion), 
1e980 62 75 74 20 74 68 61 74 20 76 61 6c 75 65 20 69  but that value i
1e990 73 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69 67  s.    ** too big
1e9a0 20 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72 65   to test in a re
1e9b0 61 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74 20  asonable amount 
1e9c0 6f 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69 73  of time, so this
1e9d0 20 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20 20   control is.    
1e9e0 2a 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20 73  ** provided to s
1e9f0 65 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20 65  et a small and e
1ea00 61 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65 20  asily reachable 
1ea10 72 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20 20  reset value..   
1ea20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ea30 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e 43  ITE_TESTCTRL_ONC
1ea40 45 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f 4c  E_RESET_THRESHOL
1ea50 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
1ea60 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1ea70 4f 6e 63 65 52 65 73 65 74 54 68 72 65 73 68 6f  OnceResetThresho
1ea80 6c 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ld = va_arg(ap, 
1ea90 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1eaa0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1eab0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1eac0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1ead0 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56  ESTCTRL_VDBE_COV
1eae0 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b  ERAGE, xCallback
1eaf0 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20  , ptr);.    **. 
1eb00 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44     ** Set the VD
1eb10 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c  BE coverage call
1eb20 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f  back function to
1eb30 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20   xCallback with 
1eb40 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20  context .    ** 
1eb50 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20  pointer ptr..   
1eb60 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1eb70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42  ITE_TESTCTRL_VDB
1eb80 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69  E_COVERAGE: {.#i
1eb90 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
1eba0 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20  _COVERAGE.      
1ebb0 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62  typedef void (*b
1ebc0 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28  ranch_callback)(
1ebd0 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29  void*,int,u8,u8)
1ebe0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1ebf0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62  lobalConfig.xVdb
1ec00 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67  eBranch = va_arg
1ec10 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62  (ap,branch_callb
1ec20 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ack);.      sqli
1ec30 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ec40 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d  pVdbeBranchArg =
1ec50 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a   va_arg(ap,void*
1ec60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1ec70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ec80 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1ec90 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1eca0 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
1ecb0 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61  ER_MMAP, db, nMa
1ecc0 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  x); */.    case 
1ecd0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ece0 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20  SORTER_MMAP: {. 
1ecf0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1ed00 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
1ed10 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64  lite3*);.      d
1ed20 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61  b->nMaxSorterMma
1ed30 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
1ed40 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
1ed50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ed60 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ed70 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ed80 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a  STCTRL_ISINIT);.
1ed90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
1eda0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1edb0 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65 65  f SQLite has bee
1edc0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  n initialized an
1edd0 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  d SQLITE_ERROR i
1ede0 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20  f.    ** not..  
1edf0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ee00 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
1ee10 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  INIT: {.      if
1ee20 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1ee30 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20  onfig.isInit==0 
1ee40 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ) rc = SQLITE_ER
1ee50 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
1ee60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ee70 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ee80 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1ee90 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
1eea0 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66  db, dbName, onOf
1eeb0 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a  f, tnum);.    **
1eec0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
1eed0 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65  t control is use
1eee0 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f  d to create impo
1eef0 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64  ster tables.  "d
1ef00 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a  b" is a pointer.
1ef10 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61      ** to the da
1ef20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1ef30 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68  n.  dbName is th
1ef40 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1ef50 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20  (ex: "main" or. 
1ef60 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68     ** "temp") wh
1ef70 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65  ich will receive
1ef80 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20   the imposter.  
1ef90 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d  "onOff" turns im
1efa0 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20  poster mode on. 
1efb0 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22     ** or off.  "
1efc0 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f  tnum" is the roo
1efd0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
1efe0 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74 68  tree to which th
1eff0 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a  e imposter.    *
1f000 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63  * table should c
1f010 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20  onnect..    **. 
1f020 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70     ** Enable imp
1f030 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20  oster mode only 
1f040 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
1f050 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f060 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20   parsed.  Then. 
1f070 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67     ** run a sing
1f080 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  le CREATE TABLE 
1f090 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e  statement to con
1f0a0 73 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73  struct the impos
1f0b0 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20  ter table in.   
1f0c0 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 73   ** the parsed s
1f0d0 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72  chema.  Then tur
1f0e0 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20  n imposter mode 
1f0f0 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a  back off again..
1f100 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1f110 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e   onOff==0 and tn
1f120 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20  um>0 then reset 
1f130 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61  the schema for a
1f140 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63 61  ll databases, ca
1f150 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  using.    ** the
1f160 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65   schema to be re
1f170 70 61 72 73 65 64 20 74 68 65 20 6e 65 78 74 20  parsed the next 
1f180 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65  time it is neede
1f190 64 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65  d.  This has the
1f1a0 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f  .    ** effect o
1f1b0 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d  f erasing all im
1f1c0 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20  poster tables.. 
1f1d0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1f1e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1f1f0 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  MPOSTER: {.     
1f200 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1f210 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1f220 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  3*);.      sqlit
1f230 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1f240 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1f250 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20   db->init.iDb = 
1f260 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
1f270 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c  e(db, va_arg(ap,
1f280 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20  const char*));. 
1f290 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75       db->init.bu
1f2a0 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d  sy = db->init.im
1f2b0 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61  posterTable = va
1f2c0 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
1f2d0 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77      db->init.new
1f2e0 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70  Tnum = va_arg(ap
1f2f0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ,int);.      if(
1f300 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
1f310 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  0 && db->init.ne
1f320 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20  wTnum>0 ){.     
1f330 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41     sqlite3ResetA
1f340 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65  llSchemasOfConne
1f350 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20  ction(db);.     
1f360 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1f370 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1f380 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
1f390 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1f3a0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65    va_end(ap);.#e
1f3b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55  ndif /* SQLITE_U
1f3c0 4e 54 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20 72  NTESTABLE */.  r
1f3d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f3e0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
1f3f0 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73  lity routine, us
1f400 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c  eful to VFS impl
1f410 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61  ementations, tha
1f420 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73  t checks.** to s
1f430 65 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65  ee if a database
1f440 20 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20   file was a URI 
1f450 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61  that contained a
1f460 20 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20   specific query 
1f470 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61  .** parameter, a
1f480 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73  nd if so obtains
1f490 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1f4a0 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
1f4b0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  r..**.** The zFi
1f4c0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
1f4d0 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  is the filename 
1f4e0 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69  pointer passed i
1f4f0 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a  nto the xOpen().
1f500 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56  ** method of a V
1f510 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
1f520 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61  n.  The zParam a
1f530 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
1f540 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75  ame of the.** qu
1f550 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65  ery parameter we
1f560 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75   seek.  This rou
1f570 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1f580 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50   value of the zP
1f590 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65  aram.** paramete
1f5a0 72 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  r if it exists. 
1f5b0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
1f5c0 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  r does not exist
1f5d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
1f5e0 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c  * returns a NULL
1f5f0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e   pointer..*/.con
1f600 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1f610 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63  _uri_parameter(c
1f620 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1f630 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  name, const char
1f640 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28   *zParam){.  if(
1f650 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c   zFilename==0 ||
1f660 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72 65 74   zParam==0 ) ret
1f670 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61  urn 0;.  zFilena
1f680 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
1f690 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
1f6a0 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a   + 1;.  while( z
1f6b0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
1f6c0 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d     int x = strcm
1f6d0 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  p(zFilename, zPa
1f6e0 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ram);.    zFilen
1f6f0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
1f700 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
1f710 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78  ) + 1;.    if( x
1f720 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69  ==0 ) return zFi
1f730 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c  lename;.    zFil
1f740 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
1f750 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
1f760 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72  me) + 1;.  }.  r
1f770 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f780 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65  * Return a boole
1f790 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71  an value for a q
1f7a0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
1f7b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75  */.int sqlite3_u
1f7c0 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74  ri_boolean(const
1f7d0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1f7e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1f7f0 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29  aram, int bDflt)
1f800 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1f810 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
1f820 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e  parameter(zFilen
1f830 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
1f840 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30  bDflt = bDflt!=0
1f850 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73  ;.  return z ? s
1f860 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e  qlite3GetBoolean
1f870 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66  (z, bDflt) : bDf
1f880 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  lt;.}../*.** Ret
1f890 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74  urn a 64-bit int
1f8a0 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61  eger value for a
1f8b0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1f8c0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1f8d0 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69  64 sqlite3_uri_i
1f8e0 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68  nt64(.  const ch
1f8f0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
1f900 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73    /* Filename as
1f910 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e   passed to xOpen
1f920 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1f930 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20   *zParam,       
1f940 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72  /* URI parameter
1f950 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c   sought */.  sql
1f960 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74  ite3_int64 bDflt
1f970 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e         /* return
1f980 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73   if parameter is
1f990 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20   missing */.){. 
1f9a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1f9b0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
1f9c0 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65  ameter(zFilename
1f9d0 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c  , zParam);.  sql
1f9e0 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20  ite3_int64 v;.  
1f9f0 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33  if( z && sqlite3
1fa00 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c  DecOrHexToI64(z,
1fa10 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   &v)==SQLITE_OK 
1fa20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
1fa30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
1fa40 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
1fa50 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
1fa60 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
1fa70 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
1fa80 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1fa90 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
1faa0 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
1fab0 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
1fac0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1fad0 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
1fae0 74 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65 20  t iDb = zDbName 
1faf0 3f 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  ? sqlite3FindDbN
1fb00 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
1fb10 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 69   : 0;.  return i
1fb20 44 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e 61  Db<0 ? 0 : db->a
1fb30 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a 0a  Db[iDb].pBt;.}..
1fb40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1fb50 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65   filename of the
1fb60 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
1fb70 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
1fb80 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
1fb90 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
1fba0 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  r *sqlite3_db_fi
1fbb0 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  lename(sqlite3 *
1fbc0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1fbd0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
1fbe0 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
1fbf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1fc00 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1fc10 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1fc20 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
1fc30 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
1fc40 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
1fc50 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
1fc60 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
1fc70 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1fc80 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
1fc90 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
1fca0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
1fcb0 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a  me(pBt) : 0;.}..
1fcc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  /*.** Return 1 i
1fcd0 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  f database is re
1fce0 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20  ad-only or 0 if 
1fcf0 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74  read/write.  Ret
1fd00 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20  urn -1 if.** no 
1fd10 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78  such database ex
1fd20 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ists..*/.int sql
1fd30 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
1fd40 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1fd50 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1fd60 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
1fd70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1fd80 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1fd90 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1fda0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1fdb0 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
1fdc0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1fdd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
1fde0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42  .  }.#endif.  pB
1fdf0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
1fe00 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1fe10 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1fe20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
1fe30 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74  eeIsReadonly(pBt
1fe40 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65  ) : -1;.}..#ifde
1fe50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1fe60 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f  SNAPSHOT./*.** O
1fe70 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f 74  btain a snapshot
1fe80 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
1fe90 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74 61  snapshot of data
1fea0 62 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e 74  base zDb current
1feb0 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61  ly .** being rea
1fec0 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a  d by handle db..
1fed0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1fee0 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 73  napshot_get(.  s
1fef0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
1ff00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a  onst char *zDb,.
1ff10 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
1ff20 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a  ot **ppSnapshot.
1ff30 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1ff40 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e  LITE_ERROR;.#ifn
1ff50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ff60 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
1ff70 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1ff80 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1ff90 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1ffa0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
1ffb0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1ffc0 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
1ffd0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ffe0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1fff0 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 61 75  );..  if( db->au
20000 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20  toCommit==0 ){. 
20010 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
20020 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
20030 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
20040 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31   iDb==0 || iDb>1
20050 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20   ){.      Btree 
20060 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
20070 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  Db].pBt;.      i
20080 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
20090 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
200a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
200b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
200c0 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b  inTrans(pBt, 0);
200d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
200e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
200f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20100 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
20110 74 47 65 74 28 73 71 6c 69 74 65 33 42 74 72 65  tGet(sqlite3Btre
20120 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 70 53  ePager(pBt), ppS
20130 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
20140 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20150 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
20160 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
20170 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
20180 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
20190 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
201a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
201b0 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
201c0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e 61  ction on the sna
201d0 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65 64  pshot idendified
201e0 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a 2a   by pSnapshot..*
201f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
20200 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 73  apshot_open(.  s
20210 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
20220 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
20230 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
20240 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a 29  hot *pSnapshot.)
20250 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20260 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64  ITE_ERROR;.#ifnd
20270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
20280 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  AL..#ifdef SQLIT
20290 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
202a0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
202b0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
202c0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
202d0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
202e0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
202f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20300 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
20310 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  ;.  if( db->auto
20320 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
20330 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69 44   int iDb;.    iD
20340 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
20350 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
20360 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c      if( iDb==0 |
20370 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20  | iDb>1 ){.     
20380 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
20390 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
203a0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
203b0 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
203c0 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  dTrans(pBt) ){. 
203d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
203e0 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
203f0 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65  Open(sqlite3Btre
20400 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 53 6e  ePager(pBt), pSn
20410 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20  apshot);.       
20420 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20430 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
20440 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20450 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
20460 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
20470 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
20480 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42  hotOpen(sqlite3B
20490 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
204a0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
204b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
204c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
204d0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
204e0 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
204f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
20500 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
20510 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 76 65 72 20  ../*.** Recover 
20520 61 73 20 6d 61 6e 79 20 73 6e 61 70 73 68 6f 74  as many snapshot
20530 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  s as possible fr
20540 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65 20  om the wal file 
20550 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
20560 2a 2a 20 73 63 68 65 6d 61 20 7a 44 62 20 6f 66  ** schema zDb of
20570 20 64 61 74 61 62 61 73 65 20 64 62 2e 0a 2a 2f   database db..*/
20580 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61  .int sqlite3_sna
20590 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 73 71  pshot_recover(sq
205a0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
205b0 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 69   char *zDb){.  i
205c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
205d0 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b  RROR;.  int iDb;
205e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
205f0 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66  OMIT_WAL..#ifdef
20600 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
20610 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
20620 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
20630 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
20640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
20650 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
20660 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
20670 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
20680 3e 6d 75 74 65 78 29 3b 0a 20 20 69 44 62 20 3d  >mutex);.  iDb =
20690 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
206a0 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 69  me(db, zDb);.  i
206b0 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62  f( iDb==0 || iDb
206c0 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20  >1 ){.    Btree 
206d0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
206e0 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  Db].pBt;.    if(
206f0 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65   0==sqlite3Btree
20700 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42  IsInReadTrans(pB
20710 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
20720 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
20730 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b  inTrans(pBt, 0);
20740 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
20750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20760 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20770 50 61 67 65 72 53 6e 61 70 73 68 6f 74 52 65 63  PagerSnapshotRec
20780 6f 76 65 72 28 73 71 6c 69 74 65 33 42 74 72 65  over(sqlite3Btre
20790 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20  ePager(pBt));.  
207a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
207b0 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  eeCommit(pBt);. 
207c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
207d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
207e0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
207f0 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53  );.#endif   /* S
20800 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
20810 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
20820 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73  ../*.** Free a s
20830 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f  napshot handle o
20840 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
20850 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
20860 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  t()..*/.void sql
20870 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
20880 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  ee(sqlite3_snaps
20890 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b  hot *pSnapshot){
208a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
208b0 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65  pSnapshot);.}.#e
208c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
208d0 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
208e0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
208f0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50  E_OMIT_COMPILEOP
20900 54 49 4f 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a  TION_DIAGS./*.**
20910 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
20920 6f 66 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  of a compile-tim
20930 65 20 6f 70 74 69 6f 6e 2c 20 72 65 74 75 72 6e  e option, return
20940 20 74 72 75 65 20 69 66 20 74 68 61 74 20 6f 70   true if that op
20950 74 69 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64  tion.** was used
20960 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
20970 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d  t..**.** The nam
20980 65 20 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79  e can optionally
20990 20 62 65 67 69 6e 20 77 69 74 68 20 22 53 51 4c   begin with "SQL
209a0 49 54 45 5f 22 20 62 75 74 20 74 68 65 20 22 53  ITE_" but the "S
209b0 51 4c 49 54 45 5f 22 20 70 72 65 66 69 78 0a 2a  QLITE_" prefix.*
209c0 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  * is not require
209d0 64 20 66 6f 72 20 61 20 6d 61 74 63 68 2e 0a 2a  d for a match..*
209e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
209f0 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64  mpileoption_used
20a00 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70  (const char *zOp
20a10 74 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c  tName){.  int i,
20a20 20 6e 3b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a   n;.  int nOpt;.
20a30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61    const char **a
20a40 7a 43 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a 23  zCompileOpt;. .#
20a50 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
20a60 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
20a70 20 7a 4f 70 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a   zOptName==0 ){.
20a80 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
20a90 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
20aa0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
20ab0 23 65 6e 64 69 66 0a 0a 20 20 61 7a 43 6f 6d 70  #endif..  azComp
20ac0 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  ileOpt = sqlite3
20ad0 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26  CompileOptions(&
20ae0 6e 4f 70 74 29 3b 0a 0a 20 20 69 66 28 20 73 71  nOpt);..  if( sq
20af0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f  lite3StrNICmp(zO
20b00 70 74 4e 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f  ptName, "SQLITE_
20b10 22 2c 20 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e  ", 7)==0 ) zOptN
20b20 61 6d 65 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20  ame += 7;.  n = 
20b30 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
20b40 7a 4f 70 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  zOptName);..  /*
20b50 20 53 69 6e 63 65 20 6e 4f 70 74 20 69 73 20 6e   Since nOpt is n
20b60 6f 72 6d 61 6c 6c 79 20 69 6e 20 73 69 6e 67 6c  ormally in singl
20b70 65 20 64 69 67 69 74 73 2c 20 61 20 6c 69 6e 65  e digits, a line
20b80 61 72 20 73 65 61 72 63 68 20 69 73 20 0a 20 20  ar search is .  
20b90 2a 2a 20 61 64 65 71 75 61 74 65 2e 20 4e 6f 20  ** adequate. No 
20ba0 6e 65 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72  need for a binar
20bb0 79 20 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20 66  y search. */.  f
20bc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20  or(i=0; i<nOpt; 
20bd0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
20be0 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f  lite3StrNICmp(zO
20bf0 70 74 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c  ptName, azCompil
20c00 65 4f 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20  eOpt[i], n)==0. 
20c10 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
20c20 49 64 43 68 61 72 28 28 75 6e 73 69 67 6e 65 64  IdChar((unsigned
20c30 20 63 68 61 72 29 61 7a 43 6f 6d 70 69 6c 65 4f   char)azCompileO
20c40 70 74 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20  pt[i][n])==0.   
20c50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20c60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
20c70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20c80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 4e 2d  ** Return the N-
20c90 74 68 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  th compile-time 
20ca0 6f 70 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20  option string.  
20cb0 49 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  If N is out of r
20cc0 61 6e 67 65 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  ange,.** return 
20cd0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
20ce0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
20cf0 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70  qlite3_compileop
20d00 74 69 6f 6e 5f 67 65 74 28 69 6e 74 20 4e 29 7b  tion_get(int N){
20d10 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63  .  int nOpt;.  c
20d20 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f  onst char **azCo
20d30 6d 70 69 6c 65 4f 70 74 3b 0a 20 20 61 7a 43 6f  mpileOpt;.  azCo
20d40 6d 70 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74  mpileOpt = sqlit
20d50 65 33 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73  e3CompileOptions
20d60 28 26 6e 4f 70 74 29 3b 0a 20 20 69 66 28 20 4e  (&nOpt);.  if( N
20d70 3e 3d 30 20 26 26 20 4e 3c 6e 4f 70 74 20 29 7b  >=0 && N<nOpt ){
20d80 0a 20 20 20 20 72 65 74 75 72 6e 20 61 7a 43 6f  .    return azCo
20d90 6d 70 69 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d  mpileOpt[N];.  }
20da0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
20db0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
20dc0 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
20dd0 4f 4e 5f 44 49 41 47 53 20 2a 2f 0a              ON_DIAGS */.