/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact fdd95737fe28db3ad2b740c8a134b40592c6b20a:


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 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69   Initialize SQLi
0a10: 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  te.  .**.** This
0a20: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
0a30: 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69   called to initi
0a40: 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
0a50: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20   allocation,.** 
0a60: 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73  VFS, and mutex s
0a70: 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20  ubsystems prior 
0a80: 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72  to doing any ser
0a90: 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a  ious work with.*
0aa0: 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61  * SQLite.  But a
0ab0: 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f  s long as you do
0ac0: 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74   not compile wit
0ad0: 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  h SQLITE_OMIT_AU
0ae0: 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72  TOINIT.** this r
0af0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
0b00: 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61  alled automatica
0b10: 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69  lly by key routi
0b20: 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73  nes such as.** s
0b30: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20  qlite3_open().  
0b40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0b50: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65  ine is a no-op e
0b60: 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72  xcept on its ver
0b70: 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72  y first call for
0b80: 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a   the process,.**
0b90: 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72 73   or for the firs
0ba0: 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63  t call after a c
0bb0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
0bc0: 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54  hutdown..**.** T
0bd0: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
0be0: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  to call this rou
0bf0: 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e  tine runs the in
0c00: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a  itialization to.
0c10: 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20  ** completion.  
0c20: 49 66 20 73 75 62 73 65 71 75 65 6e 74 20 74 68  If subsequent th
0c30: 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20  reads call this 
0c40: 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74  routine before t
0c50: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65  he first.** thre
0c60: 61 64 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ad has finished 
0c70: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0c80: 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e  on process, then
0c90: 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a   the subsequent.
0ca0: 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74 20  ** threads must 
0cb0: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  block until the 
0cc0: 66 69 72 73 74 20 74 68 72 65 61 64 20 66 69 6e  first thread fin
0cd0: 69 73 68 65 73 20 77 69 74 68 20 74 68 65 20 69  ishes with the i
0ce0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a  nitialization..*
0cf0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0d00: 68 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c  hread might call
0d10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
0d20: 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75  cursively.  Recu
0d30: 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74  rsive.** calls t
0d40: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  o this routine s
0d50: 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c  hould not block,
0d60: 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68   of course.  Oth
0d70: 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e  erwise the.** in
0d80: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
0d90: 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72  cess would never
0da0: 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a   complete..**.**
0db0: 20 4c 65 74 20 58 20 62 65 20 74 68 65 20 66 69   Let X be the fi
0dc0: 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e  rst thread to en
0dd0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
0de0: 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65  .  Let Y be some
0df0: 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64   other.** thread
0e00: 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68  .  Then while th
0e10: 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61  e initial invoca
0e20: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75  tion of this rou
0e30: 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20  tine by X is.** 
0e40: 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69  incomplete, it i
0e50: 73 20 72 65 71 75 69 72 65 64 20 74 68 61 74 3a  s required that:
0e60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c  .**.**    *  Cal
0e70: 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ls to this routi
0e80: 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62  ne from Y must b
0e90: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f  lock until the o
0ea0: 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20  uter-most.**    
0eb0: 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d     call by X com
0ec0: 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  pletes..**.**   
0ed0: 20 2a 20 20 52 65 63 75 72 73 69 76 65 20 63 61   *  Recursive ca
0ee0: 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  lls to this rout
0ef0: 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20  ine from thread 
0f00: 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  X return immedia
0f10: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69  tely.**       wi
0f20: 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a  thout blocking..
0f30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  */.int sqlite3_i
0f40: 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b  nitialize(void){
0f50: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
0f60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
0f70: 4d 61 73 74 65 72 3b 20 29 20 20 20 20 20 20 20  Master; )       
0f80: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74  /* The main stat
0f90: 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e  ic mutex */.  in
0fa0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
0fd0: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  sult code */..#i
0fe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0ff0: 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69  _WSD.  rc = sqli
1000: 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39  te3_wsd_init(409
1010: 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63  6, 24);.  if( rc
1020: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1030: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1040: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1050: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
1060: 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  ady completely i
1070: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
1080: 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20   this call.  ** 
1090: 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  to sqlite3_initi
10a0: 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62  alize() should b
10b0: 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  e a no-op.  But 
10c0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
10d0: 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  on.  ** must be 
10e0: 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73  complete.  So is
10f0: 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65  Init must not be
1100: 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76   set until the v
1110: 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ery end.  ** of 
1120: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20  this routine..  
1130: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1140: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1150: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
1160: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61  ITE_OK;..  /* Ma
1170: 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75 74 65  ke sure the mute
1180: 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69  x subsystem is i
1190: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20  nitialized.  If 
11a0: 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20  unable to .  ** 
11b0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
11c0: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20  utex subsystem, 
11d0: 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74  return early wit
11e0: 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a  h the error..  *
11f0: 2a 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20  * If the system 
1200: 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20  is so sick that 
1210: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1220: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65   allocate a mute
1230: 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  x,.  ** there is
1240: 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65   not much SQLite
1250: 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20   is going to be 
1260: 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a  able to do..  **
1270: 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  .  ** The mutex 
1280: 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74  subsystem must t
1290: 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72 69  ake care of seri
12a0: 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a  alizing its own.
12b0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74    ** initializat
12c0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
12d0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69   sqlite3MutexIni
12e0: 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  t();.  if( rc ) 
12f0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1300: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1310: 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20  malloc() system 
1320: 61 6e 64 20 74 68 65 20 72 65 63 75 72 73 69 76  and the recursiv
1330: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1340: 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70  ex..  ** This op
1350: 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65  eration is prote
1360: 63 74 65 64 20 62 79 20 74 68 65 20 53 54 41 54  cted by the STAT
1370: 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e  IC_MASTER mutex.
1380: 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a    Note that.  **
1390: 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73   MutexAlloc() is
13a0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74   called for a st
13b0: 61 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72  atic mutex prior
13c0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   to initializing
13d0: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   the.  ** malloc
13e0: 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69   subsystem - thi
13f0: 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
1400: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  he allocation of
1410: 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d   a static.  ** m
1420: 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65  utex must not re
1430: 71 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72  quire support fr
1440: 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75  om the malloc su
1450: 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20  bsystem..  */.  
1460: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61  MUTEX_LOGIC( pMa
1470: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
1480: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1490: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14a0: 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  TER); ).  sqlite
14b0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
14c0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
14d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
14e0: 4d 75 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20  MutexInit = 1;. 
14f0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1500: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
1510: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  ocInit ){.    rc
1520: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1530: 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66  Init();.  }.  if
1540: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1550: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
1560: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
1570: 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  locInit = 1;.   
1580: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1590: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
15a0: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71  utex ){.      sq
15b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15c0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20  g.pInitMutex =. 
15d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15e0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15f0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1600: 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  VE);.      if( s
1610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1620: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26  ig.bCoreMutex &&
1630: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1640: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1650: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1660: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1680: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1690: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
16a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16b0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b  nRefInitMutex++;
16c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
16d0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
16e0: 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63  er);..  /* If rc
16f0: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
1700: 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  K at this point,
1710: 20 74 68 65 6e 20 65 69 74 68 65 72 20 74 68 65   then either the
1720: 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62   malloc.  ** sub
1730: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74  system could not
1740: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1750: 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20 66 61  or the system fa
1760: 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
1770: 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d  .  ** the pInitM
1780: 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75  utex mutex. Retu
1790: 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65  rn an error in e
17a0: 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a  ither case.  */.
17b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17d0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17e0: 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  Do the rest of t
17f0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1800: 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65 63 75  n under the recu
1810: 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20  rsive mutex so. 
1820: 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c   ** that we will
1830: 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64   be able to hand
1840: 6c 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  le recursive cal
1850: 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ls into.  ** sql
1860: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1870: 29 2e 20 20 54 68 65 20 72 65 63 75 72 73 69 76  ).  The recursiv
1880: 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79  e calls normally
1890: 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20   come through.  
18a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ** sqlite3_os_in
18b0: 69 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76  it() when it inv
18c0: 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73  okes sqlite3_vfs
18d0: 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62 75 74  _register(), but
18e0: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75   other.  ** recu
18f0: 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68  rsive calls migh
1900: 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62  t also be possib
1910: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d  le..  **.  ** IM
1920: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1930: 20 52 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53   R-00140-37445 S
1940: 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61  QLite automatica
1950: 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63  lly serializes c
1960: 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  alls.  ** to the
1970: 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73   xInit method, s
1980: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1990: 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74  od need not be t
19a0: 68 72 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a  hreadsafe..  **.
19b0: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
19c0: 6e 67 20 6d 75 74 65 78 20 69 73 20 77 68 61 74  ng mutex is what
19d0: 20 73 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65   serializes acce
19e0: 73 73 20 74 6f 20 74 68 65 20 61 70 70 64 65 66  ss to the appdef
19f0: 20 70 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20   pcache xInit.  
1a00: 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ** methods.  The
1a10: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
1a20: 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20  methods.xInit() 
1a30: 61 6c 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20  all is embedded 
1a40: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c  in the.  ** call
1a50: 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
1a60: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20  eInitialize().. 
1a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1a80: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
1a90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1aa0: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28  nitMutex);.  if(
1ab0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1ac0: 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26  nfig.isInit==0 &
1ad0: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
1ae0: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 75 6e 63 44  ==0 ){.    FuncD
1b00: 65 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  efHash *pHash = 
1b10: 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48  &GLOBAL(FuncDefH
1b20: 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  ash, sqlite3Glob
1b30: 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20  alFunctions);.  
1b40: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1b50: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1b60: 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 1;.    memset
1b70: 28 70 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  (pHash, 0, sizeo
1b80: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46  f(sqlite3GlobalF
1b90: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
1ba0: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 47  sqlite3RegisterG
1bb0: 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29  lobalFunctions()
1bc0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1bd0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1be0: 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b  PCacheInit==0 ){
1bf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c00: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1c10: 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ize();.    }.   
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1c40: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c50: 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31  isPCacheInit = 1
1c60: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1c70: 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20  ite3OsInit();.  
1c80: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1c90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ca0: 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65     sqlite3PCache
1cb0: 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71 6c  BufferSetup( sql
1cc0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1cd0: 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20  .pPage, .       
1ce0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1cf0: 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73  Config.szPage, s
1d00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1d10: 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  ig.nPage);.     
1d20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d30: 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b  nfig.isInit = 1;
1d40: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1d60: 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  nProgress = 0;. 
1d70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1d80: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
1d90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1da0: 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  itMutex);..  /* 
1db0: 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68  Go back under th
1dc0: 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 61  e static mutex a
1dd0: 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  nd clean up the 
1de0: 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d  recursive.  ** m
1df0: 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20  utex to prevent 
1e00: 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e  a resource leak.
1e10: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1e20: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
1e30: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  ter);.  sqlite3G
1e40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
1e50: 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69  InitMutex--;.  i
1e60: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1e70: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1e80: 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61  utex<=0 ){.    a
1e90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c  ssert( sqlite3Gl
1ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
1eb0: 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  nitMutex==0 );. 
1ec0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1ed0: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f  _free(sqlite3Glo
1ee0: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1ef0: 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  utex);.    sqlit
1f00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1f10: 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20  InitMutex = 0;. 
1f20: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1f30: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1f40: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1f50: 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61  lowing is just a
1f60: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f   sanity check to
1f70: 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74   make sure SQLit
1f80: 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20  e has.  ** been 
1f90: 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74  compiled correct
1fa0: 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72  ly.  It is impor
1fb0: 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73  tant to run this
1fc0: 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20   code, but.  ** 
1fd0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
1fe0: 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65   run it too ofte
1ff0: 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50  n and soak up CP
2000: 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a  U cycles for no.
2010: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f    ** reason.  So
2020: 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20   we run it once 
2030: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
2040: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ation..  */.#ifn
2050: 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64  def NDEBUG.#ifnd
2060: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
2070: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
2080: 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  /* This section 
2090: 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22  of code's only "
20a0: 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20 61  output" is via a
20b0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
20c0: 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63  ts. */.  if ( rc
20d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20e0: 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75 36     u64 x = (((u6
20f0: 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20  4)1)<<63)-1;.   
2100: 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61   double y;.    a
2110: 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d  ssert(sizeof(x)=
2120: 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  =8);.    assert(
2130: 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f  sizeof(x)==sizeo
2140: 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  f(y));.    memcp
2150: 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20  y(&y, &x, 8);.  
2160: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2170: 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d  3IsNaN(y) );.  }
2180: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
2190: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69 6e    /* Do extra in
21a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  itialization ste
21b0: 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79 20  ps requested by 
21c0: 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52 41  the SQLITE_EXTRA
21d0: 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70 69  _INIT.  ** compi
21e0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a  le-time option..
21f0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2200: 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20  TE_EXTRA_INIT.  
2210: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2220: 4b 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  K && sqlite3Glob
2230: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2240: 29 7b 0a 20 20 20 20 69 6e 74 20 53 51 4c 49 54  ){.    int SQLIT
2250: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 63 6f 6e  E_EXTRA_INIT(con
2260: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 72  st char*);.    r
2270: 63 20 3d 20 53 51 4c 49 54 45 5f 45 58 54 52 41  c = SQLITE_EXTRA
2280: 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23 65  _INIT(0);.  }.#e
2290: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
22a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  c;.}../*.** Undo
22b0: 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
22c0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
22d0: 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20  ze().  Must not 
22e0: 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a  be called while.
22f0: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  ** there are out
2300: 73 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73  standing databas
2310: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2320: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2330: 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20  ons or.** while 
2340: 61 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69  any part of SQLi
2350: 74 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  te is otherwise 
2360: 69 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68  in use in any th
2370: 72 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  read.  This.** r
2380: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  outine is not th
2390: 72 65 61 64 73 61 66 65 2e 20 20 42 75 74 20 69  readsafe.  But i
23a0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76  t is safe to inv
23b0: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
23c0: 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69  .** on when SQLi
23d0: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68  te is already sh
23e0: 75 74 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c  ut down.  If SQL
23f0: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ite is already s
2400: 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e  hut down.** when
2410: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2420: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74   invoked, then t
2430: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
2440: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
2450: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2460: 73 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a  shutdown(void){.
2470: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2480: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
2490: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
24a0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
24b0: 0a 20 20 20 20 76 6f 69 64 20 53 51 4c 49 54 45  .    void SQLITE
24c0: 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28  _EXTRA_SHUTDOWN(
24d0: 76 6f 69 64 29 3b 0a 20 20 20 20 53 51 4c 49 54  void);.    SQLIT
24e0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
24f0: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ();.#endif.    s
2500: 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b  qlite3_os_end();
2510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2520: 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f  et_auto_extensio
2530: 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n();.    sqlite3
2540: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2550: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  nit = 0;.  }.  i
2560: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2570: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
2580: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2590: 65 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e  e3PcacheShutdown
25a0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
25b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
25c0: 61 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20  acheInit = 0;.  
25d0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
25e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
25f0: 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20  llocInit ){.    
2600: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64  sqlite3MallocEnd
2610: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2620: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
2630: 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20 20  llocInit = 0;.  
2640: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2650: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2660: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2670: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2690: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
26a0: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
26b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
26d0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
26e0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
26f0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2700: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2710: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2720: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2730: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2740: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2750: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2760: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2770: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2780: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2790: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
27a0: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
27b0: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
27c0: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
27d0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
27e0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
27f0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2800: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2810: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2820: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
2830: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2840: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
2850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
2860: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
2870: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
2880: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
2890: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
28a0: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
28b0: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
28c0: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
28d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
28e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
28f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
2900: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
2910: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
2920: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
2930: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
2940: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2950: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
2960: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
2970: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
2980: 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66  ile. .    */.#if
2990: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
29a0: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53  THREADSAFE) && S
29b0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
29c0: 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
29d0: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
29e0: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
29f0: 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d  /* Disable all m
2a00: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2a10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2a20: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2a30: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
2a40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2a50: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a70: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2a80: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
2a90: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2aa0: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e   Disable mutexin
2ab0: 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  g of database co
2ac0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
2ad0: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74     /* Enable mut
2ae0: 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61  exing of core da
2af0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
2b00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2b10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
2b20: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
2b30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b40: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2b50: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
2b60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2b70: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2b80: 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20  ERIALIZED: {.   
2b90: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c     /* Enable all
2ba0: 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20   mutexing */.   
2bb0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2bc0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2bd0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2be0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2bf0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b  .bFullMutex = 1;
2c00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2c10: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2c20: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58  ITE_CONFIG_MUTEX
2c30: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
2c40: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
2c50: 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ive mutex implem
2c60: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2c70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2c80: 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76  onfig.mutex = *v
2c90: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2ca0: 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a  3_mutex_methods*
2cb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2cc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2cd0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
2ce0: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
2cf0: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
2d00: 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70  urrent mutex imp
2d10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
2d20: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
2d30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
2d40: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
2d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2d60: 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61  utex;.      brea
2d70: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
2d80: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
2d90: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
2da0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
2db0: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
2dc0: 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d  ve malloc implem
2dd0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2de0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2df0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72  onfig.m = *va_ar
2e00: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
2e10: 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  m_methods*);.   
2e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2e30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2e40: 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43  CONFIG_GETMALLOC
2e50: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74  : {.      /* Ret
2e60: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
2e70: 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65  t malloc() imple
2e80: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
2e90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
2eb0: 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65  lloc==0 ) sqlite
2ec0: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
2ed0: 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  ;.      *va_arg(
2ee0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
2ef0: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
2f00: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2f10: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
2f20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2f30: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
2f40: 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20  STATUS: {.      
2f50: 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  /* Enable or dis
2f60: 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  able the malloc 
2f70: 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f  status collectio
2f80: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
2f90: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2fa0: 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67  Memstat = va_arg
2fb0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
2fc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2fd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2fe0: 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a  NFIG_SCRATCH: {.
2ff0: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
3000: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
3010: 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73  scratch memory s
3020: 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  pace */.      sq
3030: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3040: 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.pScratch = va_
3050: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
3060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3070: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
3080: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
3090: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
30a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
30b0: 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .nScratch = va_a
30c0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
30d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30f0: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
3100: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
3110: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
3120: 66 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d  for page cache m
3130: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
3140: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3150: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d  alConfig.pPage =
3160: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3170: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3180: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
3190: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
31a0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
31b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
31c0: 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67  g.nPage = va_arg
31d0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
31e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
31f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3200: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
3210: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
3220: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3230: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3240: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
3250: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3260: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
3270: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
3280: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
32a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
32b0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
32c0: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
32d0: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
32e0: 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c   page cache impl
32f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3300: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3310: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20  lConfig.pcache2 
3320: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
3330: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3340: 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62  hods2*);.      b
3350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3360: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3370: 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b  IG_GETPCACHE2: {
3380: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
33a0: 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20  cache2.xInit==0 
33b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
33c0: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
33d0: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
33e0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
33f0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
3400: 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69  ethods2*) = sqli
3410: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3420: 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62  pcache2;.      b
3430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
3440: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3450: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
3460: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3470: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3480: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
3490: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
34a0: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
34b0: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
34c0: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
34d0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
34e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
34f0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
3500: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
3510: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3520: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
3530: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3540: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3550: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3560: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3570: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3590: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
35a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
35b0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
35c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
35d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
35e0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
35f0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
3600: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
3610: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
3620: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
3630: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3640: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
3650: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
3660: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3670: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
3680: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
3690: 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72  the heap pointer
36a0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72   is NULL, then r
36b0: 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f  estore the mallo
36c0: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
36d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
36e0: 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72   to NULL pointer
36f0: 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c  s too.  This wil
3700: 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c  l cause the mall
3710: 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20  oc to go.       
3720: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
3730: 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e  default implemen
3740: 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69  tation when sqli
3750: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
3760: 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   is.        ** r
3770: 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  un..        */. 
3780: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
3790: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
37a0: 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ig.m, 0, sizeof(
37b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37c0: 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d  fig.m));.      }
37d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
37e0: 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   The heap pointe
37f0: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
3800: 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20  hen install one 
3810: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
3820: 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20  * mem5.c/mem3.c 
3830: 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74  methods. If neit
3840: 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  her ENABLE_MEMSY
3850: 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a  S3 nor.        *
3860: 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  * ENABLE_MEMSYS5
3870: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74   is defined, ret
3880: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
3890: 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
38a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
38b0: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
38c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
38d0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
38e0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
38f0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3900: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
3910: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
3920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3930: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
3940: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
3950: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
3960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3970: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3980: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
3990: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
39a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39b0: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
39c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
39d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
39e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
39f0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
3a00: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3a10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3a20: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
3a30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3a40: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69  e logger funccti
3a50: 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74  on and its first
3a60: 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a   argument..    *
3a70: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73  * The default is
3a80: 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20   NULL.  Logging 
3a90: 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74  is disabled if t
3aa0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
3ab0: 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55  ter is.    ** NU
3ac0: 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
3ad0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3ae0: 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f  G_LOG: {.      /
3af0: 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
3b00: 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
3b10: 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
3b20: 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
3b30: 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
3b40: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
3b50: 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
3b60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3b70: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
3b80: 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69  (ap, void(*)(voi
3b90: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
3ba0: 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  r*));.      */. 
3bb0: 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
3bc0: 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  d(*LOGFUNC_t)(vo
3bd0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3be0: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
3bf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c00: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
3c10: 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20  , LOGFUNC_t);.  
3c20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3c30: 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20  lConfig.pLogArg 
3c40: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3c50: 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d*);.      break
3c60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3c70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3c80: 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  URI: {.      sql
3c90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3ca0: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
3cb0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3cd0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
3ce0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3cf0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3d10: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3d20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3d30: 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c  .** Set up the l
3d40: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73  ookaside buffers
3d50: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
3d60: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52  connection..** R
3d70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3d80: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a  on success.  .**
3d90: 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73   If lookaside is
3da0: 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c   already active,
3db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
3dc0: 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  USY..**.** The s
3dd0: 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  z parameter is t
3de0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
3df0: 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61  es in each looka
3e00: 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68  side slot..** Th
3e10: 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20  e cnt parameter 
3e20: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3e30: 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61   slots.  If pSta
3e40: 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a  rt is NULL the.*
3e50: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
3e60: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
3e70: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3e80: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3e90: 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74  ()..** If pStart
3ea0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3eb0: 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62  n it is sz*cnt b
3ec0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74  ytes of memory t
3ed0: 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65  o use for.** the
3ee0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
3ef0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3f00: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
3f10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3f20: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c  d *pBuf, int sz,
3f30: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69   int cnt){.  voi
3f40: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
3f50: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
3f60: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
3f70: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
3f80: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
3f90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
3fa0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
3fb0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
3fc0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
3fd0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
3fe0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
3ff0: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
4000: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
4010: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
4020: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
4030: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
4040: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
4050: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
4060: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
4070: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
4080: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
4090: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
40a0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
40b0: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
40c0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
40d0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
40e0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
40f0: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
4100: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
4110: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
4120: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
4130: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
4140: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
4150: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
4160: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
4170: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
4180: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
4190: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
41a0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
41b0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
41c0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
41d0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
41e0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
41f0: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
4200: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
4210: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4220: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
4230: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
4240: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
4250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4260: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
4270: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
4280: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
4290: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
42a0: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
42b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
42c0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
42d0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
42e0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
42f0: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
4300: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
4310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
4320: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
4330: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4340: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
4350: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
4360: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
4370: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
4380: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
4390: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
43a0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
43b0: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
43c0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
43d0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
43e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
43f0: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
4400: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
4410: 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62  bled = 1;.    db
4420: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
4430: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
4440: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
4450: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4460: 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64  .pEnd = 0;.    d
4470: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
4480: 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64  abled = 0;.    d
4490: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
44a0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
44b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
44c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
44d0: 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73  urn the mutex as
44e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
44f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4500: 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ion..*/.sqlite3_
4510: 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64  mutex *sqlite3_d
4520: 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20  b_mutex(sqlite3 
4530: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
4540: 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a  b->mutex;.}../*.
4550: 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d 75  ** Free up as mu
4560: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20  ch memory as we 
4570: 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76  can from the giv
4580: 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  en database.** c
4590: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  onnection..*/.in
45a0: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c  t sqlite3_db_rel
45b0: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69  ease_memory(sqli
45c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
45d0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  i;.  sqlite3_mut
45e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
45f0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
4600: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
4610: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
4620: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4630: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
4640: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
4650: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
4660: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
4670: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
4680: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
4690: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
46a0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
46b0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
46c0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
46d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
46e0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
46f0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
4700: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4710: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
4720: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
4730: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
4740: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
4750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
4760: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
4770: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
4780: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
4790: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
47a0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
47b0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
47c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
47d0: 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  BCONFIG_LOOKASID
47e0: 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  E: {.      void 
47f0: 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61  *pBuf = va_arg(a
4800: 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d  p, void*); /* IM
4810: 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34  P: R-26835-10964
4820: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
4830: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4840: 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50  t);       /* IMP
4850: 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20  : R-47871-25994 
4860: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
4870: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4880: 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  t);      /* IMP:
4890: 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a   R-04460-53386 *
48a0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74  /.      rc = set
48b0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
48c0: 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a  pBuf, sz, cnt);.
48d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
48e0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
48f0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
4900: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
4910: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
4920: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
4930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
4940: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b  mask;    /* Mask
4950: 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73   of the bit in s
4960: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20  qlite3.flags to 
4970: 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20  set/clear */.   
4980: 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d     } aFlagOp[] =
4990: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c   {.        { SQL
49a0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
49b0: 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c  BLE_FKEY,    SQL
49c0: 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20  ITE_ForeignKeys 
49d0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
49e0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
49f0: 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20  ENABLE_TRIGGER, 
4a00: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
4a10: 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d  gger  },.      }
4a20: 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  ;.      unsigned
4a30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63   int i;.      rc
4a40: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
4a50: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30   /* IMP: R-42790
4a60: 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20  -23372 */.      
4a70: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4a80: 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69  Size(aFlagOp); i
4a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
4aa0: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d   aFlagOp[i].op==
4ab0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  op ){.          
4ac0: 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61  int onoff = va_a
4ad0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4ae0: 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73         int *pRes
4af0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4b00: 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t*);.          i
4b10: 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62  nt oldFlags = db
4b20: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  ->flags;.       
4b30: 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29     if( onoff>0 )
4b40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  {.            db
4b50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67  ->flags |= aFlag
4b60: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
4b70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4b80: 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  onoff==0 ){.    
4b90: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
4ba0: 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d  s &= ~aFlagOp[i]
4bb0: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
4bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4bd0: 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66   oldFlags!=db->f
4be0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
4bf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
4c00: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
4c10: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
4c20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
4c30: 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20  f( pRes ){.     
4c40: 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28         *pRes = (
4c50: 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61  db->flags & aFla
4c60: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b  gOp[i].mask)!=0;
4c70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4c80: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
4c90: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
4ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4cb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4cd0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
4ce0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
4cf0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
4d00: 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  e if the buffer 
4d10: 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69  z[0..n-1] contai
4d20: 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a  ns all spaces..*
4d30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
4d40: 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61  Spaces(const cha
4d50: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
4d60: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b  while( n>0 && z[
4d70: 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d  n-1]==' ' ){ n--
4d80: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d  ; }.  return n==
4d90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
4da0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
4db0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
4dc0: 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59  on named "BINARY
4dd0: 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79  " which is alway
4de0: 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a  s.** available..
4df0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64  **.** If the pad
4e00: 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
4e10: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73   not NULL then s
4e20: 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20  pace padding at 
4e30: 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74  the end.** of st
4e40: 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64  rings is ignored
4e50: 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e  .  This implemen
4e60: 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c  ts the RTRIM col
4e70: 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lation..*/.stati
4e80: 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e  c int binCollFun
4e90: 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c  c(.  void *padFl
4ea0: 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ag,.  int nKey1,
4eb0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
4ec0: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
4ed0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
4ee0: 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  y2.){.  int rc, 
4ef0: 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e  n;.  n = nKey1<n
4f00: 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e  Key2 ? nKey1 : n
4f10: 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d  Key2;.  rc = mem
4f20: 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
4f30: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
4f40: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64  0 ){.    if( pad
4f50: 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c  Flag.     && all
4f60: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
4f70: 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e  Key1)+n, nKey1-n
4f80: 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  ).     && allSpa
4f90: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
4fa0: 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20  2)+n, nKey2-n). 
4fb0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c     ){.      /* L
4fc0: 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65  eave rc unchange
4fd0: 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65  d at 0 */.    }e
4fe0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
4ff0: 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20  nKey1 - nKey2;. 
5000: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5010: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
5020: 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20  nother built-in 
5030: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
5040: 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a  ce: NOCASE. .**.
5050: 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e  ** This collatin
5060: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e  g sequence is in
5070: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
5080: 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65  d for "case inde
5090: 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61  pendant.** compa
50a0: 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73  rison". SQLite's
50b0: 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70   knowledge of up
50c0: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61  per and lower ca
50d0: 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a  se equivalents.*
50e0: 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74  * extends only t
50f0: 6f 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74  o the 26 charact
5100: 65 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  ers used in the 
5110: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
5120: 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d  ..**.** At the m
5130: 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f  oment there is o
5140: 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c  nly a UTF-8 impl
5150: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ementation..*/.s
5160: 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65  tatic int nocase
5170: 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20  CollatingFunc(. 
5180: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
5190: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
51a0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
51b0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
51c0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
51d0: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69  {.  int r = sqli
51e0: 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20  te3StrNICmp(.   
51f0: 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a     (const char *
5200: 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63  )pKey1, (const c
5210: 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b  har *)pKey2, (nK
5220: 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31  ey1<nKey2)?nKey1
5230: 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45  :nKey2);.  UNUSE
5240: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
5250: 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72  sed);.  if( 0==r
5260: 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79   ){.    r = nKey
5270: 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72  1-nKey2;.  }.  r
5280: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
5290: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57  * Return the ROW
52a0: 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ID of the most r
52b0: 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a  ecent insert.*/.
52c0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c  sqlite_int64 sql
52d0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
52e0: 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  _rowid(sqlite3 *
52f0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
5300: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a  ->lastRowid;.}..
5310: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5320: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
5330: 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72  es in the most r
5340: 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
5350: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f  lite3_exec()..*/
5360: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61  .int sqlite3_cha
5370: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
5380: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5390: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
53a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
53b0: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
53c0: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
53d0: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
53e0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
53f0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
5400: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5410: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f    return db->nTo
5420: 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  talChange;.}../*
5430: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70  .** Close all op
5440: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54  en savepoints. T
5450: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
5460: 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69  y manipulates fi
5470: 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64  elds of the.** d
5480: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
5490: 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e  bject, it does n
54a0: 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76  ot close any sav
54b0: 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79  epoints that may
54c0: 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74   be open.** at t
54d0: 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20  he b-tree/pager 
54e0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  level..*/.void s
54f0: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
5500: 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  oints(sqlite3 *d
5510: 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d  b){.  while( db-
5520: 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  >pSavepoint ){. 
5530: 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54     Savepoint *pT
5540: 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  mp = db->pSavepo
5550: 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61  int;.    db->pSa
5560: 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
5570: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
5580: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d  e3DbFree(db, pTm
5590: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53  p);.  }.  db->nS
55a0: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
55b0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
55c0: 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e   0;.  db->isTran
55d0: 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
55e0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
55f0: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
5600: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73  ctor function as
5610: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75  sociated with Fu
5620: 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e  ncDef p, if any.
5630: 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74   Except,.** if t
5640: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  his is not the l
5650: 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ast copy of the 
5660: 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74  function, do not
5670: 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74   invoke it. Mult
5680: 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f  iple.** copies o
5690: 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74  f a single funct
56a0: 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20  ion are created 
56b0: 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63  when create_func
56c0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
56d0: 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f  .** with SQLITE_
56e0: 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ANY as the encod
56f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5700: 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  oid functionDest
5710: 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  roy(sqlite3 *db,
5720: 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20   FuncDef *p){.  
5730: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
5740: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d  pDestructor = p-
5750: 3e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  >pDestructor;.  
5760: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
5770: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
5780: 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  or->nRef--;.    
5790: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d  if( pDestructor-
57a0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
57b0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78    pDestructor->x
57c0: 44 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63  Destroy(pDestruc
57d0: 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b  tor->pUserData);
57e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
57f0: 46 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75  Free(db, pDestru
5800: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ctor);.    }.  }
5810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
5820: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
5830: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69  te database.*/.i
5840: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
5850: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5860: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20   HashElem *i;   
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69   /* Hash table i
5890: 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  terator */.  int
58a0: 20 6a 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29   j;..  if( !db )
58b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
58c0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
58d0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
58e0: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
58f0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
5900: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
5910: 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
5920: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
5930: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
5940: 46 6f 72 63 65 20 78 44 65 73 74 72 6f 79 20 63  Force xDestroy c
5950: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
5960: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
5970: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
5980: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d  rnalSchema(db, -
5990: 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  1);..  /* If a t
59a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
59b0: 65 6e 2c 20 74 68 65 20 52 65 73 65 74 49 6e 74  en, the ResetInt
59c0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 29 20 63 61  ernalSchema() ca
59d0: 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69  ll above.  ** wi
59e0: 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c  ll not have call
59f0: 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ed the xDisconne
5a00: 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61  ct() method on a
5a10: 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  ny virtual.  ** 
5a20: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62  tables in the db
5a30: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
5a40: 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  y. The following
5a50: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
5a60: 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c  back().  ** call
5a70: 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20   will do so. We 
5a80: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
5a90: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
5aa0: 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a   for active.  **
5ab0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
5ac0: 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d  below, as the v-
5ad0: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
5ae0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72  tion may be stor
5af0: 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72  ing.  ** some pr
5b00: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
5b10: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  s internally..  
5b20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  */.  sqlite3Vtab
5b30: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20  Rollback(db);.. 
5b40: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
5b50: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
5b60: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 53 51 4c   VMs, return SQL
5b70: 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69  ITE_BUSY. */.  i
5b80: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
5b90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5ba0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
5bb0: 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
5bc0: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
5bd0: 74 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64 20 73  to unfinalised s
5be0: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
5bf0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
5c00: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
5c10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5c20: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61  TE_BUSY;.  }.  a
5c30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 61  ssert( sqlite3Sa
5c40: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
5c50: 6b 28 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72 28  k(db) );..  for(
5c60: 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20  j=0; j<db->nDb; 
5c70: 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  j++){.    Btree 
5c80: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a  *pBt = db->aDb[j
5c90: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
5ca0: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Bt && sqlite3Btr
5cb0: 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74  eeIsInBackup(pBt
5cc0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
5cd0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
5ce0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
5cf0: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63      "unable to c
5d00: 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69  lose due to unfi
5d10: 6e 69 73 68 65 64 20 62 61 63 6b 75 70 20 6f 70  nished backup op
5d20: 65 72 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20  eration");.     
5d30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
5d40: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
5d50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
5d60: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
5d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
5d80: 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
5d90: 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
5da0: 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ures. */.  sqlit
5db0: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
5dc0: 73 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d  s(db);..  for(j=
5dd0: 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b  0; j<db->nDb; j+
5de0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
5df0: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
5e00: 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[j];.    if( pD
5e10: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
5e20: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
5e30: 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20  e(pDb->pBt);.   
5e40: 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b     pDb->pBt = 0;
5e50: 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20  .      if( j!=1 
5e60: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
5e70: 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  pSchema = 0;.   
5e80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5e90: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
5ea0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
5eb0: 2d 31 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20  -1);..  /* Tell 
5ec0: 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69  the code in noti
5ed0: 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f  fy.c that the co
5ee0: 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67  nnection no long
5ef0: 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a  er holds any.  *
5f00: 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73  * locks and does
5f10: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
5f20: 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d   further unlock-
5f30: 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
5f40: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
5f50: 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64  ConnectionClosed
5f60: 28 64 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  (db);..  assert(
5f70: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20   db->nDb<=2 );. 
5f80: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
5f90: 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  ==db->aDbStatic 
5fa0: 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  );.  for(j=0; j<
5fb0: 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46  ArraySize(db->aF
5fc0: 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20  unc.a); j++){.  
5fd0: 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74    FuncDef *pNext
5fe0: 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20  , *pHash, *p;.  
5ff0: 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e    for(p=db->aFun
6000: 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61  c.a[j]; p; p=pHa
6010: 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68  sh){.      pHash
6020: 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20   = p->pHash;.   
6030: 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20     while( p ){. 
6040: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44         functionD
6050: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20  estroy(db, p);. 
6060: 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
6070: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
6080: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6090: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
60a0: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
60b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
60c0: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
60d0: 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  rst(&db->aCollSe
60e0: 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  q); i; i=sqliteH
60f0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
6100: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
6110: 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c  = (CollSeq *)sql
6120: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
6130: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e      /* Invoke an
6140: 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65  y destructors re
6150: 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c  gistered for col
6160: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
6170: 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20  user data. */.  
6180: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
6190: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
61a0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b  pColl[j].xDel ){
61b0: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a  .        pColl[j
61c0: 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e  ].xDel(pColl[j].
61d0: 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pUser);.      }.
61e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
61f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
6200: 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  l);.  }.  sqlite
6210: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
6220: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
6230: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
6240: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f  IRTUALTABLE.  fo
6250: 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(i=sqliteHashFi
6260: 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  rst(&db->aModule
6270: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
6280: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
6290: 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28  Module *pMod = (
62a0: 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48  Module *)sqliteH
62b0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
62c0: 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72  if( pMod->xDestr
62d0: 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64  oy ){.      pMod
62e0: 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d  ->xDestroy(pMod-
62f0: 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20  >pAux);.    }.  
6300: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6310: 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20  db, pMod);.  }. 
6320: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
6330: 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  r(&db->aModule);
6340: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
6350: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
6360: 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65  TE_OK, 0); /* De
6370: 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61  allocates any ca
6380: 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e  ched error strin
6390: 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  gs. */.  if( db-
63a0: 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >pErr ){.    sql
63b0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
63c0: 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  ->pErr);.  }.  s
63d0: 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e  qlite3CloseExten
63e0: 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62  sions(db);..  db
63f0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
6400: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
6410: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
6420: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
6430: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
6440: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
6450: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
6460: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
6470: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
6480: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
6490: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
64a0: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
64b0: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
64c0: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
64d0: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
64e0: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
64f0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
6500: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
6510: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
6520: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
6530: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
6540: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
6550: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6560: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
6570: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
6580: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6590: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
65a0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
65b0: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
65c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
65d0: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
65e0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
65f0: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
6600: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
6610: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
6620: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
6630: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
6640: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
6650: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
6660: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
6670: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6680: 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 72 65 74  _free(db);.  ret
6690: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
66a0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
66b0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
66c0: 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64  les.  If tripCod
66d0: 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
66e0: 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20  OK, then.** any 
66f0: 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 61 72 65  open cursors are
6700: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74   invalidated ("t
6710: 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20  ripped" - as in 
6720: 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63  "tripping a circ
6730: 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29  uit.** breaker")
6740: 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74   and made to ret
6750: 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20  urn tripCode if 
6760: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75  there are any fu
6770: 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74  rther.** attempt
6780: 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75  s to use that cu
6790: 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rsor..*/.void sq
67a0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
67b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
67c0: 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
67d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72  nt i;.  int inTr
67e0: 61 6e 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ans = 0;.  asser
67f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6800: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
6810: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
6820: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
6830: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
6840: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6850: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
6860: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
6870: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
6880: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
6890: 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a  IsInTrans(p) ){.
68a0: 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20          inTrans 
68b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
68c0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
68d0: 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43  ollback(p, tripC
68e0: 6f 64 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  ode);.      db->
68f0: 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d  aDb[i].inTrans =
6900: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
6910: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
6920: 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ack(db);.  sqlit
6930: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
6940: 63 28 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  c();..  if( db->
6950: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74  flags&SQLITE_Int
6960: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
6970: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
6980: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
6990: 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  s(db);.    sqlit
69a0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
69b0: 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20  chema(db, -1);. 
69c0: 20 7d 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66   }..  /* Any def
69d0: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
69e0: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65   violations have
69f0: 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76   now been resolv
6a00: 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65  ed. */.  db->nDe
6a10: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
6a20: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
6a30: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
6a40: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
6a50: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
6a60: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
6a70: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
6a80: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
6a90: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
6aa0: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
6ab0: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
6ac0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
6ad0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6ae0: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
6af0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
6b00: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
6b10: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
6b20: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
6b30: 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ment..*/.const c
6b40: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53  har *sqlite3ErrS
6b50: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74  tr(int rc){.  st
6b60: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a  atic const char*
6b70: 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20   const aMsg[] = 
6b80: 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  {.    /* SQLITE_
6b90: 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22  OK          */ "
6ba0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20  not an error",. 
6bb0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52     /* SQLITE_ERR
6bc0: 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c  OR       */ "SQL
6bd0: 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20   logic error or 
6be0: 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65  missing database
6bf0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6c00: 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20  _INTERNAL    */ 
6c10: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
6c20: 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20  _PERM        */ 
6c30: 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69  "access permissi
6c40: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
6c50: 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  /* SQLITE_ABORT 
6c60: 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61        */ "callba
6c70: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
6c80: 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f  ry abort",.    /
6c90: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20  * SQLITE_BUSY   
6ca0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
6cb0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
6cc0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b    /* SQLITE_LOCK
6cd0: 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  ED      */ "data
6ce0: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
6cf0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
6d00: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20  LITE_NOMEM      
6d10: 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f   */ "out of memo
6d20: 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ry",.    /* SQLI
6d30: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a  TE_READONLY    *
6d40: 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72  / "attempt to wr
6d50: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
6d60: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
6d70: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
6d80: 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70  T   */ "interrup
6d90: 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ted",.    /* SQL
6da0: 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20  ITE_IOERR       
6db0: 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72  */ "disk I/O err
6dc0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
6dd0: 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a  TE_CORRUPT     *
6de0: 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b  / "database disk
6df0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
6e00: 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  med",.    /* SQL
6e10: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20  ITE_NOTFOUND    
6e20: 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72  */ "unknown oper
6e30: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53  ation",.    /* S
6e40: 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20  QLITE_FULL      
6e50: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f    */ "database o
6e60: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c  r disk is full",
6e70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
6e80: 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75  ANTOPEN    */ "u
6e90: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
6ea0: 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20  tabase file",.  
6eb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54    /* SQLITE_PROT
6ec0: 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b  OCOL    */ "lock
6ed0: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20  ing protocol",. 
6ee0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50     /* SQLITE_EMP
6ef0: 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62  TY       */ "tab
6f00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  le contains no d
6f10: 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ata",.    /* SQL
6f20: 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20  ITE_SCHEMA      
6f30: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68  */ "database sch
6f40: 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
6f50: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6f60: 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22  TOOBIG      */ "
6f70: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74  string or blob t
6f80: 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20  oo big",.    /* 
6f90: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
6fa0: 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e  T  */ "constrain
6fb0: 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f  t failed",.    /
6fc0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  * SQLITE_MISMATC
6fd0: 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70  H    */ "datatyp
6fe0: 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20  e mismatch",.   
6ff0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53   /* SQLITE_MISUS
7000: 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61  E      */ "libra
7010: 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65  ry routine calle
7020: 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63  d out of sequenc
7030: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
7040: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
7050: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
7060: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
7070: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7080: 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20  _AUTH        */ 
7090: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64  "authorization d
70a0: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
70b0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20  QLITE_FORMAT    
70c0: 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20    */ "auxiliary 
70d0: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
70e0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
70f0: 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20  QLITE_RANGE     
7100: 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f    */ "bind or co
7110: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
7120: 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a  f range",.    /*
7130: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20   SQLITE_NOTADB  
7140: 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20      */ "file is 
7150: 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20  encrypted or is 
7160: 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c  not a database",
7170: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
7180: 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e  ar *zErr = "unkn
7190: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77  own error";.  sw
71a0: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
71b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
71c0: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20  T_ROLLBACK: {.  
71d0: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72      zErr = "abor
71e0: 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43  t due to ROLLBAC
71f0: 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  K";.      break;
7200: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
7210: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26  lt: {.      rc &
7220: 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66  = 0xff;.      if
7230: 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20  ( ALWAYS(rc>=0) 
7240: 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28  && rc<ArraySize(
7250: 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63  aMsg) && aMsg[rc
7260: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
7270: 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b  zErr = aMsg[rc];
7280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
72a0: 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d    return zErr;.}
72b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
72c0: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
72d0: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
72e0: 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20  that sleeps and 
72f0: 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75  tries.** again u
7300: 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76  ntil a timeout v
7310: 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e  alue is reached.
7320: 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61    The timeout va
7330: 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74  lue is.** an int
7340: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d  eger number of m
7350: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73  illiseconds pass
7360: 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72  ed in as the fir
7370: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  st.** argument..
7380: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
7390: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
73a0: 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a  allback(. void *
73b0: 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
73c0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
73d0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e  onnection */. in
73e0: 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20  t count         
73f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7400: 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20   of times table 
7410: 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f  has been busy */
7420: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
7430: 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65  S_WIN || (define
7440: 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
7450: 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20  & HAVE_USLEEP). 
7460: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
7470: 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20   delays[] =.    
7480: 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20   { 1, 2, 5, 10, 
7490: 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20  15, 20, 25, 25, 
74a0: 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31   25,  50,  50, 1
74b0: 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  00 };.  static c
74c0: 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d  onst u8 totals[]
74d0: 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20   =.     { 0, 1, 
74e0: 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35  3,  8, 18, 33, 5
74f0: 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c  3, 78, 103, 128,
7500: 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64   178, 228 };.# d
7510: 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72  efine NDELAY Arr
7520: 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20  aySize(delays). 
7530: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
7540: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
7550: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64   int timeout = d
7560: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
7570: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
7580: 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  or;..  assert( c
7590: 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ount>=0 );.  if(
75a0: 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20   count < NDELAY 
75b0: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  ){.    delay = d
75c0: 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  elays[count];.  
75d0: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
75e0: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65  [count];.  }else
75f0: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
7600: 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a  lays[NDELAY-1];.
7610: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
7620: 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64  ls[NDELAY-1] + d
7630: 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45  elay*(count-(NDE
7640: 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69  LAY-1));.  }.  i
7650: 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79  f( prior + delay
7660: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
7670: 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75    delay = timeou
7680: 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69  t - prior;.    i
7690: 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65  f( delay<=0 ) re
76a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
76b0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
76c0: 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30  >pVfs, delay*100
76d0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
76e0: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20  #else.  sqlite3 
76f0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
7700: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
7710: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
7720: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
7730: 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e  out;.  if( (coun
7740: 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65  t+1)*1000 > time
7750: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
7760: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
7770: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
7780: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
7790: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
77a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
77b0: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
77c0: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
77d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
77e0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
77f0: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77  eration failed w
7800: 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49  ith a lock..** I
7810: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
7820: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
7830: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
7840: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
7850: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
7860: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
7870: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
7880: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
7890: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
78a0: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
78b0: 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e  andler *p){.  in
78c0: 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45  t rc;.  if( NEVE
78d0: 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46  R(p==0) || p->xF
78e0: 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75  unc==0 || p->nBu
78f0: 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  sy<0 ) return 0;
7900: 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63  .  rc = p->xFunc
7910: 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75  (p->pArg, p->nBu
7920: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  sy);.  if( rc==0
7930: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
7940: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
7950: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
7960: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7970: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
7980: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
7990: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
79a0: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
79b0: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
79c0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
79d0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
79e0: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
79f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7a00: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
7a10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
7a20: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
7a30: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
7a40: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
7a50: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
7a60: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
7a70: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
7a80: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
7a90: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
7aa0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
7ab0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
7ac0: 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  y = 0;.  sqlite3
7ad0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
7ae0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
7af0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7b00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7b10: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
7b20: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
7b30: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
7b40: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
7b50: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
7b60: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
7b70: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
7b80: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
7b90: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
7ba0: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
7bb0: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
7bc0: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
7bd0: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
7be0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7bf0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
7c00: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
7c10: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
7c20: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
7c30: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
7c40: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
7c50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7c60: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7c70: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
7c80: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
7c90: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
7ca0: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
7cb0: 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64  ps = nOps;.    d
7cc0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
7cd0: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
7ce0: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
7cf0: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
7d00: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
7d10: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
7d20: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
7d30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7d40: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7d50: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
7d60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7d70: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
7d80: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
7d90: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
7da0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
7db0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
7dc0: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
7dd0: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
7de0: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
7df0: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
7e00: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69  db, int ms){.  i
7e10: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64  f( ms>0 ){.    d
7e20: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
7e30: 20 6d 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ms;.    sqlite3
7e40: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
7e50: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
7e60: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
7e70: 69 64 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65  id*)db);.  }else
7e80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
7e90: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
7ea0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
7eb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7ec0: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
7ed0: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
7ee0: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
7ef0: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
7f00: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
7f10: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
7f20: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
7f30: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
7f40: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
7f50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7f60: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
7f70: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
7f80: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7f90: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
7fa0: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
7fb0: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
7fc0: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
7fd0: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
7fe0: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
7ff0: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
8000: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
8010: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
8020: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
8030: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
8040: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
8050: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
8060: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
8070: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
8080: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
8090: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
80a0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
80b0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
80c0: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
80d0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
80e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
80f0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
8100: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
8110: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
8120: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
8130: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
8140: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
8150: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8160: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
8170: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
8180: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
8190: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
81a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
81b0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
81c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
81d0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
81e0: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
81f0: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
8200: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
8210: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
8220: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
8230: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
8240: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
8250: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
8260: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
8270: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
8280: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
8290: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
82a0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
82b0: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
82c0: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
82d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
82e0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23  E_BKPT;.  }.  .#
82f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8300: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
8310: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
8320: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
8330: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
8340: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
8350: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
8360: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
8370: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
8380: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
8390: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
83a0: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
83b0: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
83c0: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
83d0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
83e0: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
83f0: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
8400: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
8410: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
8420: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
8430: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
8440: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
8450: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
8460: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
8470: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
8480: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
8490: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
84a0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
84b0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
84c0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
84d0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
84e0: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
84f0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
8500: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
8510: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8520: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8530: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
8540: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
8550: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
8560: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a  SQLITE_UTF16LE,.
8570: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
8580: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
8590: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
85a0: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
85b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
85c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
85d0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
85e0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
85f0: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
8600: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
8610: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
8620: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
8630: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
8640: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
8650: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
8660: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
8670: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
8680: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
8690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
86a0: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
86b0: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
86c0: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
86d0: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
86e0: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
86f0: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
8700: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
8710: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
8720: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
8730: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
8740: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
8750: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
8760: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
8770: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
8780: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
8790: 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45  ( p && p->iPrefE
87a0: 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  nc==enc && p->nA
87b0: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
87c0: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
87d0: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
87e0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
87f0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
8800: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
8810: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
8820: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
8830: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
8840: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
8850: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
8860: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
8870: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8880: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
8890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
88a0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
88b0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
88c0: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
88d0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
88e0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
88f0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
8900: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
8910: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
8920: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
8930: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
8940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
8950: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
8960: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
8970: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
8980: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
8990: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
89a0: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
89b0: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
89c0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
89d0: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
89e0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
89f0: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
8a00: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
8a10: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
8a20: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
8a30: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
8a40: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
8a50: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e  flags = 0;.  p->
8a60: 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20  xFunc = xFunc;. 
8a70: 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65   p->xStep = xSte
8a80: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
8a90: 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d  e = xFinal;.  p-
8aa0: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
8ab0: 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72  erData;.  p->nAr
8ac0: 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20  g = (u16)nArg;. 
8ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8ae0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
8af0: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
8b00: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
8b10: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8b20: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
8b30: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
8b40: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
8b50: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
8b60: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
8b70: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
8b80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
8b90: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
8ba0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
8bb0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
8bc0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
8bd0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
8be0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
8bf0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
8c00: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
8c10: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8c20: 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63  ion_v2(db, zFunc
8c30: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
8c40: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  xFunc, xStep,.  
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a    xFinal, 0);.}.
8c80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
8c90: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
8ca0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
8cb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8cc0: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
8cd0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
8ce0: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
8cf0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
8d00: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8d10: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
8d20: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
8d30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
8d40: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
8d50: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
8d60: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
8d70: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
8d80: 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f  d (*xDestroy)(vo
8d90: 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  id *).){.  int r
8da0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
8db0: 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ;.  FuncDestruct
8dc0: 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20  or *pArg = 0;.  
8dd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
8de0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
8df0: 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29    if( xDestroy )
8e00: 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75  {.    pArg = (Fu
8e10: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73  ncDestructor *)s
8e20: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
8e30: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75  ro(db, sizeof(Fu
8e40: 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a  ncDestructor));.
8e50: 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b      if( !pArg ){
8e60: 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28  .      xDestroy(
8e70: 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  p);.      goto o
8e80: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ut;.    }.    pA
8e90: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
8ea0: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
8eb0: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
8ec0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
8ed0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
8ee0: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
8ef0: 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  enc, p, xFunc, x
8f00: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41  Step, xFinal, pA
8f10: 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20  rg);.  if( pArg 
8f20: 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30  && pArg->nRef==0
8f30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8f40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
8f50: 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29  .    xDestroy(p)
8f60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
8f70: 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ree(db, pArg);. 
8f80: 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d   }.. out:.  rc =
8f90: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
8fa0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
8fb0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8fc0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
8fd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
8fe0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
8ff0: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
9000: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
9010: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
9020: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
9030: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
9040: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
9050: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
9060: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
9070: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
9080: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
9090: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
90a0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
90b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
90c0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
90d0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
90e0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
90f0: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
9100: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
9110: 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  nc8;.  sqlite3_m
9120: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9130: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
9140: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
9150: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
9160: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
9170: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
9180: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
9190: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72  TF16NATIVE);.  r
91a0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
91b0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
91c0: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
91d0: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
91e0: 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20  p, xFinal,0);.  
91f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9200: 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
9210: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
9220: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
9230: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9240: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
9250: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
9260: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  f.../*.** Declar
9270: 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f  e that a functio
9280: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c  n has been overl
9290: 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75  oaded by a virtu
92a0: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
92b0: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
92c0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
92d0: 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62  s a regular glob
92e0: 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  al function, the
92f0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
9300: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
9310: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
9320: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
9330: 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20  hen create.** a 
9340: 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77  new one that alw
9350: 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e  ays throws a run
9360: 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a  -time error.  .*
9370: 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61  *.** When virtua
9380: 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20  l tables intend 
9390: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76  to provide an ov
93a0: 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f  erloaded functio
93b0: 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  n, they.** shoul
93c0: 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  d call this rout
93d0: 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ine to make sure
93e0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
93f0: 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20  tion exists..** 
9400: 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  A global functio
9410: 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20  n must exist in 
9420: 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72  order for name r
9430: 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72  esolution to wor
9440: 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  k.** properly..*
9450: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76  /.int sqlite3_ov
9460: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
9470: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
9480: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
9490: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a  ame,.  int nArg.
94a0: 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  ){.  int nName =
94b0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
94c0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72  (zName);.  int r
94d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
94e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
94f0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
9500: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
9510: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
9520: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
9530: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
9540: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  0)==0 ){.    rc 
9550: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
9560: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
9570: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
9580: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
95a0: 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
95b0: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  nction, 0, 0, 0)
95c0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
95d0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
95e0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
95f0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9600: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9610: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
9620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9630: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
9640: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
9650: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
9660: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
9670: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
9680: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
9690: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
96a0: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
96b0: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
96c0: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
96d0: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
96e0: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
96f0: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
9700: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
9710: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
9720: 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74  f each.** SQL st
9730: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
9740: 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28   *sqlite3_trace(
9750: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
9760: 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64  d (*xTrace)(void
9770: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20  *,const char*), 
9780: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76  void *pArg){.  v
9790: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
97a0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
97b0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
97c0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65  Old = db->pTrace
97d0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  Arg;.  db->xTrac
97e0: 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62  e = xTrace;.  db
97f0: 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
9800: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
9810: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9820: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
9830: 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67  Old;.}./*.** Reg
9840: 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20  ister a profile 
9850: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
9860: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
9870: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
9880: 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66  ed .** profile f
9890: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72  unction is retur
98a0: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
98b0: 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  ULL profile func
98c0: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
98d0: 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20  no profiling is 
98e0: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
98f0: 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65  -NULL.** profile
9900: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
9910: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
9920: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
9930: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
9940: 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61  .** each SQL sta
9950: 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
9960: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  un..*/.void *sql
9970: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20  ite3_profile(.  
9980: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
9990: 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28  oid (*xProfile)(
99a0: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
99b0: 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29  *,sqlite_uint64)
99c0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
99d0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
99e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
99f0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
9a00: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
9a10: 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62  ProfileArg;.  db
9a20: 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72  ->xProfile = xPr
9a30: 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72  ofile;.  db->pPr
9a40: 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b  ofileArg = pArg;
9a50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9a60: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9a70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
9a80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9a90: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
9aa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
9ab0: 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f  er a function to
9ac0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e   be invoked when
9ad0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
9ae0: 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68  ommits..** If th
9af0: 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69  e invoked functi
9b00: 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
9b10: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ero, then the co
9b20: 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a  mmit becomes a.*
9b30: 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76  * rollback..*/.v
9b40: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d  oid *sqlite3_com
9b50: 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  mit_hook(.  sqli
9b60: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
9b70: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
9b80: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
9b90: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
9ba0: 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  nt (*xCallback)(
9bb0: 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63  void*),  /* Func
9bc0: 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f  tion to invoke o
9bd0: 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f  n each commit */
9be0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9c00: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
9c10: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
9c20: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
9c30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9c40: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
9c50: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
9c60: 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
9c70: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
9c80: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
9c90: 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
9ca0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
9cb0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9cc0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
9cd0: 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
9ce0: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
9cf0: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
9d00: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
9d10: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
9d20: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
9d30: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
9d40: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9d50: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
9d60: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
9d70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d90: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
9da0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
9db0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
9dc0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
9dd0: 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
9de0: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
9df0: 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
9e00: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
9e10: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
9e20: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
9e30: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
9e40: 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
9e50: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
9e60: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
9e70: 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
9e80: 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
9e90: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
9ea0: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
9eb0: 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
9ec0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9ed0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9ee0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
9ef0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
9f00: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
9f10: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
9f20: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
9f30: 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
9f40: 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
9f50: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
9f60: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
9f70: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
9f80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fa0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
9fb0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
9fc0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
9fd0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
9fe0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
9ff0: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
a000: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
a010: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
a020: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
a030: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
a040: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
a050: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
a060: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
a070: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b  b->pRollbackArg;
a080: 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  .  db->xRollback
a090: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
a0a0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c  back;.  db->pRol
a0b0: 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b  lbackArg = pArg;
a0c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a0d0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a0e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
a0f0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
a100: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
a110: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  ** The sqlite3_w
a120: 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
a130: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
a140: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
a150: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a  ocheckpoint()..*
a160: 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  * Invoke sqlite3
a170: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
a180: 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
a190: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
a1a0: 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  og file.** is gr
a1b0: 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74  eater than sqlit
a1c0: 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20  e3.pWalArg cast 
a1d0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74  to an integer (t
a1e0: 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
a1f0: 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75  red by.** wal_au
a200: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e  tocheckpoint()).
a210: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
a220: 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a  WalDefaultHook(.
a230: 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44    void *pClientD
a240: 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75  ata,     /* Argu
a250: 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
a260: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
a270: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a   /* Connection *
a280: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
a290: 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  zDb,       /* Da
a2a0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
a2b0: 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20  nFrame          
a2c0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41     /* Size of WA
a2d0: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46  L */.){.  if( nF
a2e0: 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52  rame>=SQLITE_PTR
a2f0: 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44  _TO_INT(pClientD
a300: 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ata) ){.    sqli
a310: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
a320: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
a330: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
a340: 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  nt(db, zDb);.   
a350: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
a360: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20  nMalloc();.  }. 
a370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a380: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
a390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
a3a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  /../*.** Configu
a3b0: 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61  re an sqlite3_wa
a3c0: 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
a3d0: 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  k to automatical
a3e0: 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a  ly checkpoint.**
a3f0: 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65   a database afte
a400: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
a410: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
a420: 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f  ere are nFrame o
a430: 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73  r.** more frames
a440: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
a450: 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f  . Passing zero o
a460: 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  r a negative val
a470: 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72  ue as the.** nFr
a480: 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69  ame parameter di
a490: 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63  sables automatic
a4a0: 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74   checkpoints ent
a4b0: 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  irely..**.** The
a4c0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
a4d0: 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
a4e0: 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61  ction replaces a
a4f0: 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c  ny existing call
a500: 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72  back.** register
a510: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
a520: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b  _wal_hook(). Lik
a530: 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69  ewise, registeri
a540: 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ng a callback.**
a550: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
a560: 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c  al_hook() disabl
a570: 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  es the automatic
a580: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68   checkpoint mech
a590: 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75  anism.** configu
a5a0: 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
a5b0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
a5c0: 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
a5d0: 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
a5e0: 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29  *db, int nFrame)
a5f0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
a600: 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45  OMIT_WAL.  UNUSE
a610: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
a620: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a630: 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c  TER(nFrame);.#el
a640: 73 65 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  se.  if( nFrame>
a650: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
a660: 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71  _wal_hook(db, sq
a670: 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
a680: 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ook, SQLITE_INT_
a690: 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b  TO_PTR(nFrame));
a6a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
a6b0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
a6c0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  b, 0, 0);.  }.#e
a6d0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
a6e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a6f0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
a700: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
a710: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
a720: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77  transaction is w
a730: 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74  ritten.** into t
a740: 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c  he write-ahead-l
a750: 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62  og by this datab
a760: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
a770: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
a780: 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  _wal_hook(.  sql
a790: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a7b0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
a7c0: 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c  to this db handl
a7d0: 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c  e */.  int(*xCal
a7e0: 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73  lback)(void *, s
a7f0: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
a800: 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f  har*, int),.  vo
a810: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a830: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
a840: 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62  passed to xCallb
a850: 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ack() */.){.#ifn
a860: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a870: 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  WAL.  void *pRet
a880: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a890: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
a8a0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
a8b0: 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e  >pWalArg;.  db->
a8c0: 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78  xWalCallback = x
a8d0: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
a8e0: 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a  pWalArg = pArg;.
a8f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a900: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
a910: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
a920: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
a930: 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
a940: 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
a950: 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69  tabase zDb..*/.i
a960: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
a970: 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20  heckpoint_v2(.  
a980: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
a9b0: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
a9c0: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  ar *zDb,        
a9d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
a9e0: 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
a9f0: 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  base (or NULL) *
aa00: 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20  /.  int eMode,  
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48      /* SQLITE_CH
aa30: 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65  ECKPOINT_* value
aa40: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67   */.  int *pnLog
aa50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
aa60: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
aa70: 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e  ze of WAL log in
aa80: 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74   frames */.  int
aa90: 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20   *pnCkpt        
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aab0: 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65  OUT: Total numbe
aac0: 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63  r of frames chec
aad0: 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23  kpointed */.){.#
aae0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
aaf0: 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53  T_WAL.  return S
ab00: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
ab10: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
ab40: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
ab50: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
ab60: 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  HED;  /* sqlite3
ab70: 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20  .aDb[] index of 
ab80: 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  db to checkpoint
ab90: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   */..  /* Initia
aba0: 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20  lize the output 
abb0: 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20  variables to -1 
abc0: 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
abd0: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66   occurs. */.  if
abe0: 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67  ( pnLog ) *pnLog
abf0: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43   = -1;.  if( pnC
ac00: 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20  kpt ) *pnCkpt = 
ac10: 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53  -1;..  assert( S
ac20: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
ac30: 5f 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45  _FULL>SQLITE_CHE
ac40: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20  CKPOINT_PASSIVE 
ac50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
ac60: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
ac70: 55 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b  ULL<SQLITE_CHECK
ac80: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b  POINT_RESTART );
ac90: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
aca0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
acb0: 53 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43  SIVE+2==SQLITE_C
acc0: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
acd0: 54 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  T );.  if( eMode
ace0: 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  <SQLITE_CHECKPOI
acf0: 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d  NT_PASSIVE || eM
ad00: 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode>SQLITE_CHECK
ad10: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b  POINT_RESTART ){
ad20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ad30: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a  TE_MISUSE;.  }..
ad40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ad50: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
ad60: 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a  ;.  if( zDb && z
ad70: 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62  Db[0] ){.    iDb
ad80: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
ad90: 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
ada0: 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29   }.  if( iDb<0 )
adb0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
adc0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
add0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
ade0: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
adf0: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
ae00: 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
ae10: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
ae20: 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  te3Checkpoint(db
ae30: 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e  , iDb, eMode, pn
ae40: 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
ae50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
ae60: 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20  b, rc, 0);.  }. 
ae70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
ae80: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
ae90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
aea0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
aeb0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
aec0: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
aed0: 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
aee0: 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73  e zDb. If zDb is
aef0: 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65   NULL, or if the
af00: 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e   buffer zDb poin
af10: 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e  ts.** to contain
af20: 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  s a zero-length 
af30: 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61  string, all atta
af40: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
af50: 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  re .** checkpoin
af60: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
af70: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
af80: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
af90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
afa0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
afb0: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
afc0: 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51  t_v2(db, zDb, SQ
afd0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
afe0: 50 41 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a  PASSIVE, 0, 0);.
aff0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
b000: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
b010: 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   Run a checkpoin
b020: 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44  t on database iD
b030: 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  b. This is a no-
b040: 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69  op if database i
b050: 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72  Db is.** not cur
b060: 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57  rently open in W
b070: 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  AL mode..**.** I
b080: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
b090: 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  is open on the d
b0a0: 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68  atabase being ch
b0b0: 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73  eckpointed, this
b0c0: 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
b0d0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
b0e0: 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70  KED and a checkp
b0f0: 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65  oint is not atte
b100: 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e  mpted. If .** an
b110: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
b120: 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ile running the 
b130: 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53  checkpoint, an S
b140: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
b150: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
b160: 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f   (i.e. SQLITE_IO
b170: 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  ERR). Otherwise,
b180: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
b190: 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  * The mutex on d
b1a0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
b1b0: 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  b should be held
b1c0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
b1d0: 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73  The mutex.** ass
b1e0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
b1f0: 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65   specific b-tree
b200: 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
b210: 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a  ted is taken by.
b220: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
b230: 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b   while the check
b240: 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67  point is running
b250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69  ..**.** If iDb i
b260: 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f  s passed SQLITE_
b270: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68  MAX_ATTACHED, th
b280: 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  en all attached 
b290: 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a  databases are.**
b2a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49   checkpointed. I
b2b0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
b2c0: 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
b2d0: 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
b2e0: 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74  tely -.** no att
b2f0: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
b300: 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72  checkpoint any r
b310: 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73  emaining databas
b320: 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  es..**.** Parame
b330: 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65  ter eMode is one
b340: 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   of SQLITE_CHECK
b350: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46  POINT_PASSIVE, F
b360: 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a  ULL or RESTART..
b370: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
b380: 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
b390: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
b3a0: 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70  nt eMode, int *p
b3b0: 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70  nLog, int *pnCkp
b3c0: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
b3d0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
b3e0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
b3f0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
b420: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
b430: 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62  ough attached db
b440: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79  s */.  int bBusy
b450: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b460: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
b470: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61  f SQLITE_BUSY ha
b480: 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  s been encounter
b490: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
b4a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b4b0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
b4c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c  ;.  assert( !pnL
b4d0: 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31  og || *pnLog==-1
b4e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
b4f0: 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74  nCkpt || *pnCkpt
b500: 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69  ==-1 );..  for(i
b510: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26  =0; i<db->nDb &&
b520: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
b530: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
b540: 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c  =iDb || iDb==SQL
b550: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
b560: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
b570: 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b  qlite3BtreeCheck
b580: 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d  point(db->aDb[i]
b590: 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c  .pBt, eMode, pnL
b5a0: 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
b5b0: 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20     pnLog = 0;.  
b5c0: 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a      pnCkpt = 0;.
b5d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b5e0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
b5f0: 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a       bBusy = 1;.
b600: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
b610: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
b620: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
b630: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
b640: 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53  OK && bBusy) ? S
b650: 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b  QLITE_BUSY : rc;
b660: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b670: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
b680: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b690: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75  tion returns tru
b6a0: 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79  e if main-memory
b6b0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
b6c0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20  instead of.** a 
b6d0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66  temporary file f
b6e0: 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67  or transient pag
b6f0: 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61  er files and sta
b700: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
b710: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
b720: 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f  turned depends o
b730: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64  n the value of d
b740: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72  b->temp_store (r
b750: 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65  untime.** parame
b760: 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d  ter) and the com
b770: 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20  pile time value 
b780: 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  of SQLITE_TEMP_S
b790: 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c  TORE. The.** fol
b7a0: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
b7b0: 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74  cribes the relat
b7c0: 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
b7d0: 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73  these two values
b7e0: 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e  .** and this fun
b7f0: 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61  ctions return va
b800: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  lue..**.**   SQL
b810: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20  ITE_TEMP_STORE  
b820: 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72     db->temp_stor
b830: 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f  e     Location o
b840: 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  f temporary data
b850: 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  base.**   ------
b860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
b870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
b880: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
b890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b8a0: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
b8e0: 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
b910: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
b920: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
b950: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
b960: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
b970: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
b980: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
b990: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
b9a0: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
b9b0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
b9c0: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
b9e0: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
b9f0: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
ba20: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
ba30: 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   1).**   2      
ba40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
ba70: 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20  urn 1).**   3   
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
baa0: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
bab0: 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74  return 1).*/.int
bac0: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
bad0: 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74  mory(const sqlit
bae0: 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c  e3 *db){.#if SQL
baf0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
bb00: 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  1.  return ( db-
bb10: 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29  >temp_store==2 )
bb20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
bb30: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
bb40: 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  2.  return ( db-
bb50: 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29  >temp_store!=1 )
bb60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
bb70: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
bb80: 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  3.  return 1;.#e
bb90: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
bba0: 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20  TEMP_STORE<1 || 
bbb0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
bbc0: 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  E>3.  return 0;.
bbd0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
bbe0: 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63  Return UTF-8 enc
bbf0: 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
bc00: 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
bc10: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
bc20: 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
bc30: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
bc40: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
bc50: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
bc60: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
bc70: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
bc80: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
bc90: 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
bca0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
bcb0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
bcc0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
bcd0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
bce0: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49  ErrStr(SQLITE_MI
bcf0: 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a  SUSE_BKPT);.  }.
bd00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bd10: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
bd20: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
bd30: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
bd40: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
bd50: 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
bd60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
bd70: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
bd80: 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e  _value_text(db->
bd90: 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72  pErr);.    asser
bda0: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
bdb0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
bdc0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z==0 ){.      z 
bdd0: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
bde0: 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20  db->errCode);.  
bdf0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
be00: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
be10: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
be20: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
be30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
be40: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  16./*.** Return 
be50: 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45  UTF-16 encoded E
be60: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
be70: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
be80: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
be90: 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
bea0: 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  t void *sqlite3_
beb0: 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33  errmsg16(sqlite3
bec0: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
bed0: 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d  const u16 outOfM
bee0: 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27  em[] = {.    'o'
bef0: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
bf00: 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
bf10: 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27  'm', 'e', 'm', '
bf20: 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a  o', 'r', 'y', 0.
bf30: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
bf40: 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d  nst u16 misuse[]
bf50: 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69   = {.    'l', 'i
bf60: 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27  ', 'b', 'r', 'a'
bf70: 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c  , 'r', 'y', ' ',
bf80: 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20   .    'r', 'o', 
bf90: 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27  'u', 't', 'i', '
bfa0: 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20  n', 'e', ' ', . 
bfb0: 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27     'c', 'a', 'l'
bfc0: 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c  , 'l', 'e', 'd',
bfd0: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
bfe0: 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a  'u', 't', ' ', .
bff0: 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20      'o', 'f', ' 
c000: 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27  ', .    's', 'e'
c010: 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c  , 'q', 'u', 'e',
c020: 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20   'n', 'c', 'e', 
c030: 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20  0.  };..  const 
c040: 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21  void *z;.  if( !
c050: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
c060: 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
c070: 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  m;.  }.  if( !sq
c080: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
c090: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
c0a0: 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
c0b0: 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20   *)misuse;.  }. 
c0c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
c0d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
c0e0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
c0f0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
c100: 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66   = (void *)outOf
c110: 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Mem;.  }else{.  
c120: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
c130: 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
c140: 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  Err);.    if( z=
c150: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
c160: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
c170: 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c  b->pErr, -1, sql
c180: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
c190: 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20  rrCode),.       
c1a0: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
c1b0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
c1c0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
c1d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
c1e0: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d  db->pErr);.    }
c1f0: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  .    /* A malloc
c200: 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c  () may have fail
c210: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
c220: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ll to sqlite3_va
c230: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20  lue_text16().   
c240: 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68   ** above. If th
c250: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
c260: 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c  then the db->mal
c270: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e  locFailed flag n
c280: 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
c290: 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
c2a0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74   returning. Do t
c2b0: 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  his directly, in
c2c0: 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20  stead of via.   
c2d0: 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78   ** sqlite3ApiEx
c2e0: 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73  it(), to avoid s
c2f0: 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  etting the datab
c300: 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  ase handle error
c310: 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f   message..    */
c320: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
c330: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  ailed = 0;.  }. 
c340: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
c350: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
c360: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
c370: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c380: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
c390: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c3a0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
c3b0: 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  r code generated
c3c0: 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f   by an SQLite ro
c3d0: 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69  utine. If NULL i
c3e0: 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74  s.** passed to t
c3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65  his function, we
c400: 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63   assume a malloc
c410: 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67  () failed during
c420: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
c430: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
c440: 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
c450: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
c460: 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
c470: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
c480: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
c490: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
c4a0: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
c4b0: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
c4c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
c4d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c4e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
c4f0: 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
c500: 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
c510: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
c520: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
c530: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
c540: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
c550: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
c560: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
c570: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
c580: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
c590: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
c5a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
c5b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c5c0: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
c5d0: 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a  db->errCode;.}..
c5e0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
c5f0: 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ew collating fun
c600: 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61  ction for databa
c610: 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61  se "db".  The na
c620: 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61  me is zName.** a
c630: 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  nd the encoding 
c640: 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69  is enc..*/.stati
c650: 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c  c int createColl
c660: 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
c670: 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  * db,.  const ch
c680: 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38  ar *zName, .  u8
c690: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43   enc,.  void* pC
c6a0: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
c6b0: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
c6c0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
c6d0: 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
c6e0: 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
c6f0: 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
c700: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
c710: 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  2;.  int nName =
c720: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c730: 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73  (zName);.  .  as
c740: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c750: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
c760: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
c770: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
c780: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
c790: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
c7a0: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
c7b0: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
c7c0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
c7d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
c7e0: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
c7f0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
c800: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
c810: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
c820: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
c830: 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a  /.  enc2 = enc;.
c840: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
c850: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
c860: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
c870: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
c880: 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66  _ALIGNED );.  if
c890: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
c8a0: 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51  TF16 || enc2==SQ
c8b0: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
c8c0: 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d  ED ){.    enc2 =
c8d0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
c8e0: 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  IVE;.  }.  if( e
c8f0: 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20  nc2<SQLITE_UTF8 
c900: 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55  || enc2>SQLITE_U
c910: 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65  TF16BE ){.    re
c920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
c930: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
c940: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
c950: 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
c960: 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
c970: 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
c980: 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
c990: 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
c9a0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
c9b0: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
c9c0: 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
c9d0: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
c9e0: 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
c9f0: 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
ca00: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
ca10: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
ca20: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
ca30: 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
ca40: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 0);.  if( pCo
ca50: 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
ca60: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  p ){.    if( db-
ca70: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
ca80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ca90: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
caa0: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
cab0: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
cac0: 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f  /modify collatio
cad0: 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74  n sequence due t
cae0: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
caf0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  nts");.      ret
cb00: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
cb10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
cb20: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
cb30: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
cb40: 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
cb50: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
cb60: 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
cb70: 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
cb80: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
cb90: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
cba0: 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
cbb0: 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
cbc0: 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
cbd0: 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
cbe0: 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
cbf0: 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
cc00: 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
cc10: 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
cc20: 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
cc30: 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
cc40: 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
cc50: 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
cc60: 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
cc70: 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
cc80: 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
cc90: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
cca0: 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
ccb0: 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
ccc0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
ccd0: 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
cce0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
ccf0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
cd00: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
cd10: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
cd20: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
cd30: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
cd40: 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
cd50: 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
cd60: 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
cd70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
cd80: 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
cd90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
cda0: 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
cdb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
cdc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
cdd0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
cde0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
cdf0: 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
ce00: 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
ce10: 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
ce20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ce30: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43  pColl->xCmp = xC
ce40: 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d  ompare;.  pColl-
ce50: 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20  >pUser = pCtx;. 
ce60: 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78   pColl->xDel = x
ce70: 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e  Del;.  pColl->en
ce80: 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20  c = (u8)(enc2 | 
ce90: 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54  (enc & SQLITE_UT
cea0: 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20  F16_ALIGNED));. 
ceb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
cec0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
ced0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cee0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
cef0: 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
cf00: 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
cf10: 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
cf20: 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
cf30: 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
cf40: 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
cf50: 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
cf60: 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
cf70: 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
cf80: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
cf90: 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
cfa0: 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
cfb0: 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
cfc0: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
cfd0: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
cfe0: 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
cff0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
d000: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
d010: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
d020: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
d030: 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
d040: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
d050: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
d060: 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
d070: 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
d080: 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
d090: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
d0a0: 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f  UMBER,.  SQLITE_
d0b0: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
d0c0: 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  H,.};../*.** Mak
d0d0: 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20  e sure the hard 
d0e0: 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74  limits are set t
d0f0: 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c  o reasonable val
d100: 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ues.*/.#if SQLIT
d110: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30  E_MAX_LENGTH<100
d120: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
d130: 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  MAX_LENGTH must 
d140: 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a  be at least 100.
d150: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d160: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
d170: 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
d180: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
d190: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
d1a0: 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23  ast 100.#endif.#
d1b0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  if SQLITE_MAX_SQ
d1c0: 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f  L_LENGTH>SQLITE_
d1d0: 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72  MAX_LENGTH.# err
d1e0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
d1f0: 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f  L_LENGTH must no
d200: 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
d210: 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  n SQLITE_MAX_LEN
d220: 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  GTH.#endif.#if S
d230: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
d240: 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72  ND_SELECT<2.# er
d250: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
d260: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d  OMPOUND_SELECT m
d270: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
d280: 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  2.#endif.#if SQL
d290: 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c  ITE_MAX_VDBE_OP<
d2a0: 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  40.# error SQLIT
d2b0: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75  E_MAX_VDBE_OP mu
d2c0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34  st be at least 4
d2d0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
d2e0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
d2f0: 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45  _ARG<0 || SQLITE
d300: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
d310: 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53  G>1000.# error S
d320: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
d330: 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62  ON_ARG must be b
d340: 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30  etween 0 and 100
d350: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
d360: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
d370: 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
d380: 5f 41 54 54 41 43 48 45 44 3e 36 32 0a 23 20 65  _ATTACHED>62.# e
d390: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
d3a0: 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65  ATTACHED must be
d3b0: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 36   between 0 and 6
d3c0: 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  2.#endif.#if SQL
d3d0: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
d3e0: 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20  TERN_LENGTH<1.# 
d3f0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
d400: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
d410: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
d420: 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
d430: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
d440: 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72  LUMN>32767.# err
d450: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
d460: 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78  LUMN must not ex
d470: 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69  ceed 32767.#endi
d480: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d490: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31  _TRIGGER_DEPTH<1
d4a0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
d4b0: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
d4c0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
d4d0: 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  st 1.#endif.../*
d4e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
d4f0: 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e  alue of a limit.
d500: 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64    Report the old
d510: 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e   value..** If an
d520: 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69   invalid limit i
d530: 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64  ndex is supplied
d540: 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20  , report -1..** 
d550: 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
d560: 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74  but still report
d570: 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69   the old value i
d580: 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d  f the.** new lim
d590: 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
d5a0: 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65  **.** A new lowe
d5b0: 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74  r limit does not
d5c0: 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67   shrink existing
d5d0: 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20   constructs..** 
d5e0: 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e  It merely preven
d5f0: 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74  ts new construct
d600: 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68  s that exceed th
d610: 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20  e limit.** from 
d620: 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  forming..*/.int 
d630: 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71  sqlite3_limit(sq
d640: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c  lite3 *db, int l
d650: 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c  imitId, int newL
d660: 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64  imit){.  int old
d670: 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56  Limit;...  /* EV
d680: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31  IDENCE-OF: R-301
d690: 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63  89-54097 For eac
d6a0: 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79  h limit category
d6b0: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41   SQLITE_LIMIT_NA
d6c0: 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ME.  ** there is
d6d0: 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f   a hard upper bo
d6e0: 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69  und set at compi
d6f0: 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70  le-time by a C p
d700: 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a  reprocessor.  **
d710: 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51   macro called SQ
d720: 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28  LITE_MAX_NAME. (
d730: 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e  The "_LIMIT_" in
d740: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61   the name is cha
d750: 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d  nged to.  ** "_M
d760: 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73  AX_".).  */.  as
d770: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d780: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
d790: 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
d7a0: 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  X_LENGTH );.  as
d7b0: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d7c0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  [SQLITE_LIMIT_SQ
d7d0: 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  L_LENGTH]==SQLIT
d7e0: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
d7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
d800: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d810: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53  LIMIT_COLUMN]==S
d820: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
d830: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
d840: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d850: 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
d860: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  ]==SQLITE_MAX_EX
d870: 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  PR_DEPTH );.  as
d880: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d890: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
d8a0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d  MPOUND_SELECT]==
d8b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
d8c0: 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61  UND_SELECT);.  a
d8d0: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
d8e0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
d8f0: 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f  DBE_OP]==SQLITE_
d900: 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20  MAX_VDBE_OP );. 
d910: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
d920: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
d930: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d  _FUNCTION_ARG]==
d940: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
d950: 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73  ION_ARG );.  ass
d960: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
d970: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
d980: 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ACHED]==SQLITE_M
d990: 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20  AX_ATTACHED );. 
d9a0: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
d9b0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
d9c0: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
d9d0: 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20  NGTH]==.        
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
da10: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
da20: 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
da30: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
da40: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
da50: 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c  BLE_NUMBER]==SQL
da60: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
da70: 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65  _NUMBER);.  asse
da80: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
da90: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
daa0: 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  GER_DEPTH]==SQLI
dab0: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
dac0: 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
dad0: 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  ( SQLITE_LIMIT_T
dae0: 52 49 47 47 45 52 5f 44 45 50 54 48 3d 3d 28 53  RIGGER_DEPTH==(S
daf0: 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29  QLITE_N_LIMIT-1)
db00: 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69   );...  if( limi
db10: 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64  tId<0 || limitId
db20: 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  >=SQLITE_N_LIMIT
db30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
db40: 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69  1;.  }.  oldLimi
db50: 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c  t = db->aLimit[l
db60: 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e  imitId];.  if( n
db70: 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20  ewLimit>=0 ){   
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d  /* IMP: R-52476-
dba0: 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28  28732 */.    if(
dbb0: 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c   newLimit>aHardL
dbc0: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b  imit[limitId] ){
dbd0: 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20  .      newLimit 
dbe0: 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  = aHardLimit[lim
dbf0: 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20  itId];  /* IMP: 
dc00: 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f  R-51463-25634 */
dc10: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
dc20: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d  Limit[limitId] =
dc30: 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   newLimit;.  }. 
dc40: 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74   return oldLimit
dc50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc60: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
dc70: 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d  53341-35419 */.}
dc80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
dc90: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
dca0: 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49 73   parse both URIs
dcb0: 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   and non-URI fil
dcc0: 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62 79  enames passed by
dcd0: 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20   the.** user to 
dce0: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71  API functions sq
dcf0: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20  lite3_open() or 
dd00: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
dd10: 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62  ), and for datab
dd20: 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63  ase.** URIs spec
dd30: 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
dd40: 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e   ATTACH statemen
dd50: 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ts..**.** The fi
dd60: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
dd70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
dd80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
dd90: 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a   VFS to use (or.
dda0: 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67  ** a NULL to sig
ddb0: 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c 74  nify the default
ddc0: 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52 49   VFS) if the URI
ddd0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
dde0: 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a  n a "vfs=xxx".**
ddf0: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
de00: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
de10: 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74  ument contains t
de20: 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55  he URI (or non-U
de30: 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20  RI filename).** 
de40: 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69  itself. When thi
de50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
de60: 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73  lled the *pFlags
de70: 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
de80: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20   contain.** the 
de90: 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f  default flags to
dea0: 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
deb0: 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20  se handle with. 
dec0: 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  The value stored
ded0: 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d   in.** *pFlags m
dee0: 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62 65  ay be updated be
def0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
df00: 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61  f the URI filena
df10: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20  me contains .** 
df20: 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22  "cache=xxx" or "
df30: 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79 20  mode=xxx" query 
df40: 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a  parameters..**.*
df50: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
df60: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
df70: 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
df80: 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20 73  case *ppVfs is s
df90: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
dfa0: 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20 73  * the VFS that s
dfb0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  hould be used to
dfc0: 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
dfd0: 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65  se file. *pzFile
dfe0: 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f   is set to.** po
dff0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
e000: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
e010: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
e020: 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74  to open. It is t
e030: 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
e040: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
e050: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
e060: 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  y call sqlite3_f
e070: 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65  ree() to release
e080: 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e  .** this buffer.
e090: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
e0a0: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
e0b0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
e0c0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
e0d0: 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a   and *pzErrMsg.*
e0e0: 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  * may be set to 
e0f0: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
e100: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
e110: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
e120: 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
e130: 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
e140: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
e150: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
e160: 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
e170: 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
e180: 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
e190: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e  e3_free()..*/.in
e1a0: 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  t sqlite3ParseUr
e1b0: 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i(.  const char 
e1c0: 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20  *zDefaultVfs,   
e1d0: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
e1e0: 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78  se if no "vfs=xx
e1f0: 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20  x" query option 
e200: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e210: 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20 20  *zUri,          
e220: 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
e230: 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70 61  inated URI to pa
e240: 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rse */.  unsigne
e250: 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20  d int *pFlags,  
e260: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
e270: 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  UT: SQLITE_OPEN_
e280: 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73  XXX flags */.  s
e290: 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56  qlite3_vfs **ppV
e2a0: 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
e2b0: 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73  * OUT: VFS to us
e2c0: 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70  e */ .  char **p
e2d0: 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  zFile,          
e2e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
e2f0: 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65  Filename compone
e300: 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63  nt of URI */.  c
e310: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e330: 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73  * OUT: Error mes
e340: 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c  sage (if rc!=SQL
e350: 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20  ITE_OK) */.){.  
e360: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e370: 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  OK;.  unsigned i
e380: 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61  nt flags = *pFla
e390: 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  gs;.  const char
e3a0: 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c   *zVfs = zDefaul
e3b0: 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46  tVfs;.  char *zF
e3c0: 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  ile;.  char c;. 
e3d0: 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69   int nUri = sqli
e3e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69  te3Strlen30(zUri
e3f0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  );..  assert( *p
e400: 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20  zErrMsg==0 );.. 
e410: 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20 53   if( ((flags & S
e420: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
e430: 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
e440: 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29  Config.bOpenUri)
e450: 20 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20   .   && nUri>=5 
e460: 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20  && memcmp(zUri, 
e470: 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 0a  "file:", 5)==0 .
e480: 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a    ){.    char *z
e490: 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74  Opt;.    int eSt
e4a0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
e4b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
e4c0: 20 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73   state when pars
e4d0: 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69  ing URI */.    i
e4e0: 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20  nt iIn;         
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e500: 49 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20  Input character 
e510: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
e520: 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   iOut = 0;      
e530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
e540: 74 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  tput character i
e550: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
e560: 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20  nByte = nUri+2; 
e570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e580: 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61  es of space to a
e590: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20  llocate */..    
e5a0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
e5b0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
e5c0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
e5d0: 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20  indicate to the 
e5e0: 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a  VFS xOpen .    *
e5f0: 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68  * method that th
e600: 65 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61  ere may be extra
e610: 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c   parameters foll
e620: 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e  owing the file-n
e630: 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61  ame.  */.    fla
e640: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
e650: 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28  N_URI;..    for(
e660: 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b  iIn=0; iIn<nUri;
e670: 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d   iIn++) nByte +=
e680: 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27   (zUri[iIn]=='&'
e690: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73  );.    zFile = s
e6a0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
e6b0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  yte);.    if( !z
e6c0: 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
e6d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20  LITE_NOMEM;..   
e6e0: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
e6f0: 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f  scheme and autho
e700: 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66  rity segments of
e710: 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20   the URI. */.   
e720: 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f   if( zUri[5]=='/
e730: 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f  ' && zUri[6]=='/
e740: 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  ' ){.      iIn =
e750: 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   7;.      while(
e760: 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
e770: 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69  ri[iIn]!='/' ) i
e780: 49 6e 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28  In++;..      if(
e790: 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21   iIn!=7 && (iIn!
e7a0: 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c  =16 || memcmp("l
e7b0: 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69  ocalhost", &zUri
e7c0: 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20  [7], 9)) ){.    
e7d0: 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
e7e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
e7f0: 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74  "invalid uri aut
e800: 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a  hority: %.*s", .
e810: 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d              iIn-
e820: 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20  7, &zUri[7]);.  
e830: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
e840: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
e850: 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
e860: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
e870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 49   }else{.      iI
e880: 6e 20 3d 20 35 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 5;.    }..  
e890: 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69    /* Copy the fi
e8a0: 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71  lename and any q
e8b0: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20  uery parameters 
e8c0: 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62  into the zFile b
e8d0: 75 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44  uffer. .    ** D
e8e0: 65 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65  ecode %HH escape
e8f0: 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65   codes along the
e900: 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20   way. .    **.  
e910: 20 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73    ** Within this
e920: 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20   loop, variable 
e930: 65 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65  eState may be se
e940: 74 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20  t to 0, 1 or 2, 
e950: 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a  depending.    **
e960: 20 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20   on the parsing 
e970: 63 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c  context. As foll
e980: 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ows:.    **.    
e990: 2a 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20  **   0: Parsing 
e9a0: 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a  file-name..    *
e9b0: 2a 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e  *   1: Parsing n
e9c0: 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  ame section of a
e9d0: 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
e9e0: 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
e9f0: 20 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67   **   2: Parsing
ea00: 20 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f   value section o
ea10: 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
ea20: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
ea30: 20 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74      */.    eStat
ea40: 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  e = 0;.    while
ea50: 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
ea60: 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29  )!=0 && c!='#' )
ea70: 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20  {.      iIn++;. 
ea80: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20       if( c=='%' 
ea90: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
eaa0: 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
eab0: 69 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26  iIn]) .       &&
eac0: 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
ead0: 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20  (zUri[iIn+1]) . 
eae0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
eaf0: 69 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c  int octet = (sql
eb00: 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
eb10: 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b  i[iIn++]) << 4);
eb20: 0a 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b  .        octet +
eb30: 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e  = sqlite3HexToIn
eb40: 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a  t(zUri[iIn++]);.
eb50: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
eb60: 20 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74   octet>=0 && oct
eb70: 65 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20  et<256 );.      
eb80: 20 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29    if( octet==0 )
eb90: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
eba0: 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
ebb0: 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61  ken when "%00" a
ebc0: 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68  ppears within th
ebd0: 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20  e URI. In this. 
ebe0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
ebf0: 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74   we ignore all t
ec00: 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ext in the remai
ec10: 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68  nder of the path
ec20: 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20  , name or.      
ec30: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72      ** value cur
ec40: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72  rently being par
ec50: 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  sed. So ignore t
ec60: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
ec70: 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  cter.          *
ec80: 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68  * and skip to th
ec90: 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20  e next "?", "=" 
eca0: 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f  or "&", as appro
ecb0: 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  priate. */.     
ecc0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
ecd0: 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
ece0: 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20  & c!='#' .      
ecf0: 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
ed00: 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29  te!=0 || c!='?')
ed10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
ed20: 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20  & (eState!=1 || 
ed30: 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26  (c!='=' && c!='&
ed40: 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')).            
ed50: 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20    && (eState!=2 
ed60: 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20  || c!='&').     
ed70: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
ed80: 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
ed90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
eda0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
edb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
edc0: 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65   octet;.      }e
edd0: 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d  lse if( eState==
ede0: 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20  1 && (c=='&' || 
edf0: 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  c=='=') ){.     
ee00: 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75     if( zFile[iOu
ee10: 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t-1]==0 ){.     
ee20: 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79       /* An empty
ee30: 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67   option name. Ig
ee40: 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
ee50: 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a   altogether. */.
ee60: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
ee70: 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
ee80: 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20  ri[iIn]!='#' && 
ee90: 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27  zUri[iIn-1]!='&'
eea0: 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20   ) iIn++;.      
eeb0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
eec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eed0: 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20  if( c=='&' ){.  
eee0: 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f          zFile[iO
eef0: 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
ef00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ef10: 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
ef20: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
ef30: 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
ef40: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74    }else if( (eSt
ef50: 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27  ate==0 && c=='?'
ef60: 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20  ) || (eState==2 
ef70: 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20  && c=='&') ){.  
ef80: 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
ef90: 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b       eState = 1;
efa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
efb0: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63  File[iOut++] = c
efc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
efd0: 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c  eState==1 ) zFil
efe0: 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
eff0: 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
f000: 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
f010: 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
f020: 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  '\0';..    /* Ch
f030: 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72  eck if there wer
f040: 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70  e any options sp
f050: 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f  ecified that sho
f060: 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74  uld be interpret
f070: 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e  ed .    ** here.
f080: 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72   Options that ar
f090: 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65  e interpreted he
f0a0: 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22  re include "vfs"
f0b0: 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a   and those that.
f0c0: 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e      ** correspon
f0d0: 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20  d to flags that 
f0e0: 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f  may be passed to
f0f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65   the sqlite3_ope
f100: 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65  n_v2().    ** me
f110: 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70  thod. */.    zOp
f120: 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74  t = &zFile[sqlit
f130: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
f140: 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
f150: 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20   zOpt[0] ){.    
f160: 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c    int nOpt = sql
f170: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
f180: 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  t);.      char *
f190: 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70  zVal = &zOpt[nOp
f1a0: 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  t+1];.      int 
f1b0: 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nVal = sqlite3St
f1c0: 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20  rlen30(zVal);.. 
f1d0: 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33       if( nOpt==3
f1e0: 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22   && memcmp("vfs"
f1f0: 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b  , zOpt, 3)==0 ){
f200: 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20  .        zVfs = 
f210: 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  zVal;.      }els
f220: 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
f230: 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20  t OpenMode {.   
f240: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
f250: 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  r *z;.          
f260: 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  int mode;.      
f270: 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a    } *aMode = 0;.
f280: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d          char *zM
f290: 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20  odeType = 0;.   
f2a0: 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20       int mask = 
f2b0: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  0;.        int l
f2c0: 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  imit = 0;..     
f2d0: 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26     if( nOpt==5 &
f2e0: 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22  & memcmp("cache"
f2f0: 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b  , zOpt, 5)==0 ){
f300: 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
f310: 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64  c struct OpenMod
f320: 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d  e aCacheMode[] =
f330: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
f340: 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49   "shared",  SQLI
f350: 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
f360: 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  CHE },.         
f370: 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20     { "private", 
f380: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
f390: 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  ATECACHE },.    
f3a0: 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
f3b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
f3c0: 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
f3d0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
f3e0: 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f  EDCACHE|SQLITE_O
f3f0: 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
f400: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
f410: 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a  e = aCacheMode;.
f420: 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
f430: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  = mask;.        
f440: 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63    zModeType = "c
f450: 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d  ache";.        }
f460: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
f470: 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==4 && memcmp("
f480: 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d  mode", zOpt, 4)=
f490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f4a0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
f4b0: 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65  enMode aOpenMode
f4c0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
f4d0: 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49     { "ro",  SQLI
f4e0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
f4f0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
f500: 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f  { "rw",  SQLITE_
f510: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d  OPEN_READWRITE }
f520: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  , .            {
f530: 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f   "rwc", SQLITE_O
f540: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
f550: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
f560: 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  TE },.          
f570: 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 0a 20 20    { "memory",.  
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
f5a0: 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
f5b0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 0a 20 20  _OPEN_CREATE .  
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50       | SQLITE_OP
f5e0: 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20  EN_MEMORY },.   
f5f0: 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
f600: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
f610: 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
f620: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
f630: 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f  DONLY | SQLITE_O
f640: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
f670: 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
f680: 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20  PEN_MEMORY;.    
f690: 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f        aMode = aO
f6a0: 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  penMode;.       
f6b0: 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20     limit = mask 
f6c0: 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  & flags;.       
f6d0: 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
f6e0: 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20  access";.       
f6f0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
f700: 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  aMode ){.       
f710: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
f720: 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30      int mode = 0
f730: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
f740: 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  i=0; aMode[i].z;
f750: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
f760: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f770: 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20   = aMode[i].z;. 
f780: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
f790: 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  Val==sqlite3Strl
f7a0: 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65  en30(z) && 0==me
f7b0: 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56  mcmp(zVal, z, nV
f7c0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
f7d0: 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64       mode = aMod
f7e0: 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20  e[i].mode;.     
f7f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f800: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
f810: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f820: 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20      if( mode==0 
f830: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
f840: 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
f850: 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
f860: 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22  uch %s mode: %s"
f870: 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61  , zModeType, zVa
f880: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
f890: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
f8a0: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  R;.            g
f8b0: 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
f8c0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
f8d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f           if( (mo
f8e0: 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  de & ~SQLITE_OPE
f8f0: 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20  N_MEMORY)>limit 
f900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
f910: 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
f920: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d  e3_mprintf("%s m
f930: 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a  ode not allowed:
f940: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d                zM
f970: 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
f980: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
f990: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
f9a0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
f9b0: 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
f9c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f9d0: 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61      flags = (fla
f9e0: 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f  gs & ~mask) | mo
f9f0: 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  de;.        }.  
fa00: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70      }..      zOp
fa10: 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31  t = &zVal[nVal+1
fa20: 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  ];.    }..  }els
fa30: 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73  e{.    zFile = s
fa40: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55  qlite3_malloc(nU
fa50: 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21  ri+2);.    if( !
fa60: 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
fa70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
fa80: 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a   memcpy(zFile, z
fa90: 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
faa0: 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c  zFile[nUri] = '\
fab0: 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55  0';.    zFile[nU
fac0: 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ri+1] = '\0';.  
fad0: 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
fae0: 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d  TE_OPEN_URI;.  }
faf0: 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c  ..  *ppVfs = sql
fb00: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56  ite3_vfs_find(zV
fb10: 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66  fs);.  if( *ppVf
fb20: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45  s==0 ){.    *pzE
fb30: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
fb40: 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
fb50: 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29   vfs: %s", zVfs)
fb60: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
fb70: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61  E_ERROR;.  }. pa
fb80: 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69  rse_uri_out:.  i
fb90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fba0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
fbb0: 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  free(zFile);.   
fbc0: 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a   zFile = 0;.  }.
fbd0: 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67    *pFlags = flag
fbe0: 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a  s;.  *pzFile = z
fbf0: 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  File;.  return r
fc00: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
fc10: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
fc20: 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69  he work of openi
fc30: 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e  ng a database on
fc40: 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71   behalf of.** sq
fc50: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64  lite3_open() and
fc60: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
fc70: 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ). The database 
fc80: 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e  filename "zFilen
fc90: 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46  ame"  .** is UTF
fca0: 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73  -8 encoded..*/.s
fcb0: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61  tatic int openDa
fcc0: 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20  tabase(.  const 
fcd0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
fce0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
fcf0: 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f  ename UTF-8 enco
fd00: 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
fd10: 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
fd20: 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64  /* OUT: Returned
fd30: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
fd40: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
fd50: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20  nt flags,    /* 
fd60: 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67  Operational flag
fd70: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
fd80: 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a  r *zVfs       /*
fd90: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   Name of the VFS
fda0: 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
fdb0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74  /* Store allocat
fde0: 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  ed handle here *
fdf0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe10: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
fe20: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68  de */.  int isTh
fe30: 72 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20  readsafe;       
fe40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
fe50: 66 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63  for threadsafe c
fe60: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
fe70: 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b  char *zOpen = 0;
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  /* Filename argu
fea0: 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
feb0: 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20  BtreeOpen() */. 
fec0: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
fed0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
fee0: 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
fef0: 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61  e from sqlite3Pa
ff00: 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a  rseUri() */..  *
ff10: 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
ff20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ff30: 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
ff40: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
ff50: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
ff60: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
ff70: 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f  ..  /* Only allo
ff80: 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69  w sensible combi
ff90: 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20  nations of bits 
ffa0: 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72 67  in the flags arg
ffb0: 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68  ument.  .  ** Th
ffc0: 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
ffd0: 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f  any non-sense co
ffe0: 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65  mbination is use
fff0: 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64  d.  If we.  ** d
10000 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65  o not block ille
10010 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  gal combinations
10020 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20   here, it could 
10030 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73  trigger.  ** ass
10040 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
10050 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72   in deeper layer
10060 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d  s.  Sensible com
10070 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61  binations.  ** a
10080 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31  re:.  **.  **  1
10090 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
100a0 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a  EADONLY.  **  2:
100b0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
100c0 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a  ADWRITE.  **  6:
100d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
100e0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
100f0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a  _OPEN_CREATE.  *
10100 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  /.  assert( SQLI
10110 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
10120 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61    == 0x01 );.  a
10130 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
10140 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20  EN_READWRITE == 
10150 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74  0x02 );.  assert
10160 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  ( SQLITE_OPEN_CR
10170 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20  EATE    == 0x04 
10180 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
10190 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
101a0 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e  x02 ); /* READON
101b0 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  LY */.  testcase
101c0 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
101d0 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41  ==0x04 ); /* REA
101e0 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74  DWRITE */.  test
101f0 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
10200 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a  &7))==0x40 ); /*
10210 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45   READWRITE | CRE
10220 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31  ATE */.  if( ((1
10230 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30  <<(flags&7)) & 0
10240 78 34 36 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  x46)==0 ) return
10250 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
10260 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  KPT;..  if( sqli
10270 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
10280 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b  bCoreMutex==0 ){
10290 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
102a0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
102b0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
102c0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29  E_OPEN_NOMUTEX )
102d0 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
102e0 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
102f0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
10300 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
10310 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
10320 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  dsafe = 1;.  }el
10330 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64  se{.    isThread
10340 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c  safe = sqlite3Gl
10350 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
10360 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  Mutex;.  }.  if(
10370 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
10380 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
10390 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26  E ){.    flags &
103a0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  = ~SQLITE_OPEN_S
103b0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65  HAREDCACHE;.  }e
103c0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47  lse if( sqlite3G
103d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
103e0 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
103f0 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
10400 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
10410 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f  DCACHE;.  }..  /
10420 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c  * Remove harmful
10430 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66   bits from the f
10440 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20  lags parameter. 
10450 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
10460 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
10470 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e   and SQLITE_OPEN
10480 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73  _FULLMUTEX flags
10490 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74   were.  ** dealt
104a0 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65   with in the pre
104b0 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b  vious code block
104c0 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65  .  Besides these
104d0 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20  , the only.  ** 
104e0 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67  valid input flag
104f0 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  s for sqlite3_op
10500 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49  en_v2() are SQLI
10510 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
10520 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
10530 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51  EN_READWRITE, SQ
10540 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
10550 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  , SQLITE_OPEN_SH
10560 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20  AREDCACHE,.  ** 
10570 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
10580 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f  ATECACHE, and so
10590 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73  me reserved bits
105a0 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b  .  Silently mask
105b0 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74  .  ** off all ot
105c0 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a  her flags..  */.
105d0 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53    flags &=  ~( S
105e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
105f0 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
10600 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10610 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
10620 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
10630 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
10640 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20  N_DB |.         
10650 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
10660 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20  N_TEMP_DB | .   
10670 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
10680 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
10690 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  T_DB | .        
106a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
106b0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
106c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
106d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
106e0 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  MP_JOURNAL | .  
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
10700 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
10710 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
10720 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
10730 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
10740 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
10750 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f    SQLITE_OPEN_NO
10760 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
10770 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
10780 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20  EN_FULLMUTEX |. 
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
107a0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
107b0 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
107c0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
107d0 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
107e0 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
107f0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
10800 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
10810 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
10820 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
10830 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68  _out;.  if( isTh
10840 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20  readsafe ){.    
10850 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
10860 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
10870 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
10880 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
10890 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
108a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
108b0 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
108c0 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
108d0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
108e0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
108f0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
10900 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
10910 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
10920 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
10930 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
10940 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
10950 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
10960 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
10970 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
10980 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
10990 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
109a0 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
109b0 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
109c0 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
109d0 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f  ));.  db->autoCo
109e0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e  mmit = 1;.  db->
109f0 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31  nextAutovac = -1
10a00 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  ;.  db->nextPage
10a10 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  size = 0;.  db->
10a20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
10a30 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20  ShortColNames | 
10a40 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
10a50 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   | SQLITE_Enable
10a60 54 72 69 67 67 65 72 0a 23 69 66 20 53 51 4c 49  Trigger.#if SQLI
10a70 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10a80 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20  FORMAT<4.       
10a90 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
10aa0 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
10ab0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
10ac0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41  QLITE_ENABLE_LOA
10ad0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
10af0 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73  QLITE_LoadExtens
10b00 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ion.#endif.#if S
10b10 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45  QLITE_DEFAULT_RE
10b20 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53  CURSIVE_TRIGGERS
10b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10b40 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72    | SQLITE_RecTr
10b50 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69  iggers.#endif.#i
10b60 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
10b70 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
10b80 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45  _KEYS) && SQLITE
10b90 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
10ba0 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20  _KEYS.          
10bb0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
10bc0 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64  ForeignKeys.#end
10bd0 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c  if.      ;.  sql
10be0 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
10bf0 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66  ->aCollSeq);.#if
10c00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10c10 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
10c20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
10c30 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
10c40 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
10c50 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
10c60 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
10c70 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f  INARY. BINARY wo
10c80 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46  rks for both UTF
10c90 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d  -8.  ** and UTF-
10ca0 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72  16, so add a ver
10cb0 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f  sion for each to
10cc0 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63   avoid any unnec
10cd0 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76  essary.  ** conv
10ce0 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ersions. The onl
10cf0 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e  y error that can
10d00 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61   occur here is a
10d10 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
10d20 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  e..  */.  create
10d30 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
10d40 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
10d50 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  TF8, 0, binCollF
10d60 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
10d70 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
10d80 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
10d90 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43  UTF16BE, 0, binC
10da0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
10db0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
10dc0 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
10dd0 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20  ITE_UTF16LE, 0, 
10de0 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
10df0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
10e00 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20  on(db, "RTRIM", 
10e10 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
10e20 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75  id*)1, binCollFu
10e30 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
10e40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
10e50 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
10e60 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
10e70 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
10e80 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
10e90 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
10ea0 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20   "BINARY", 0);. 
10eb0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
10ec0 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
10ed0 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54  /* Also add a UT
10ee0 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  F-8 case-insensi
10ef0 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  tive collation s
10f00 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72  equence. */.  cr
10f10 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
10f20 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49  , "NOCASE", SQLI
10f30 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61  TE_UTF8, 0, noca
10f40 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c  seCollatingFunc,
10f50 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65   0);..  /* Parse
10f60 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52   the filename/UR
10f70 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20  I argument. */. 
10f80 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d   db->openFlags =
10f90 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73   flags;.  rc = s
10fa0 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a  qlite3ParseUri(z
10fb0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
10fc0 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66  &flags, &db->pVf
10fd0 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72  s, &zOpen, &zErr
10fe0 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Msg);.  if( rc!=
10ff0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11000 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11010 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c  NOMEM ) db->mall
11020 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
11030 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11040 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f  b, rc, zErrMsg ?
11050 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d   "%s" : 0, zErrM
11060 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
11070 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
11080 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
11090 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  out;.  }..  /* O
110a0 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20  pen the backend 
110b0 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20  database driver 
110c0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
110d0 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
110e0 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20  Vfs, zOpen, db, 
110f0 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  &db->aDb[0].pBt,
11100 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
11110 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67              flag
11120 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s | SQLITE_OPEN_
11130 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20  MAIN_DB);.  if( 
11140 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11150 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11160 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
11170 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11180 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11190 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
111a0 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20  or(db, rc, 0);. 
111b0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
111c0 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44  ut;.  }.  db->aD
111d0 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[0].pSchema = s
111e0 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
111f0 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  db, db->aDb[0].p
11200 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  Bt);.  db->aDb[1
11210 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
11220 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
11230 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20   0);...  /* The 
11240 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c  default safety_l
11250 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69  evel for the mai
11260 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66  n database is 'f
11270 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65  ull'; for the te
11280 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  mp.  ** database
11290 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54   it is 'NONE'. T
112a0 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
112b0 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61  pager layer defa
112c0 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64  ults.  .  */.  d
112d0 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20  b->aDb[0].zName 
112e0 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e  = "main";.  db->
112f0 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[0].safety_le
11300 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61  vel = 3;.  db->a
11310 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74  Db[1].zName = "t
11320 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  emp";.  db->aDb[
11330 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  1].safety_level 
11340 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  = 1;..  db->magi
11350 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
11360 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d  _OPEN;.  if( db-
11370 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11380 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
11390 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
113a0 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69  Register all bui
113b0 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c  lt-in functions,
113c0 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65   but do not atte
113d0 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a  mpt to read the.
113e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63    ** database sc
113f0 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69  hema yet. This i
11400 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  s delayed until 
11410 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
11420 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
11430 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20   is accessed..  
11440 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  */.  sqlite3Erro
11450 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
11460 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65   0);.  sqlite3Re
11470 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
11480 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f  ctions(db);..  /
11490 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63  * Load automatic
114a0 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78   extensions - ex
114b0 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61  tensions that ha
114c0 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  ve been register
114d0 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  ed.  ** using th
114e0 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61  e sqlite3_automa
114f0 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20  tic_extension() 
11500 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  API..  */.  rc =
11510 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
11520 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  (db);.  if( rc==
11530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11540 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
11550 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
11560 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11570 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
11580 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
115a0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
115b0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
115c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
115d0 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S1.  if( !db->ma
115e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
115f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
11600 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c  ite3Fts1Init(sql
11610 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
11620 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
11630 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
11640 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11650 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66  ENABLE_FTS2.  if
11660 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
11670 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
11680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65  E_OK ){.    exte
11690 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
116a0 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s2Init(sqlite3*)
116b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
116c0 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a  e3Fts2Init(db);.
116d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
116e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
116f0 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d  _FTS3.  if( !db-
11700 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
11710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11720 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11730 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a  e3Fts3Init(db);.
11740 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
11750 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11760 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e  _ICU.  if( !db->
11770 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
11780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11790 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
117a0 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20  3IcuInit(db);.  
117b0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
117c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52   SQLITE_ENABLE_R
117d0 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e  TREE.  if( !db->
117e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
117f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
11800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11810 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20  RtreeInit(db);. 
11820 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
11830 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
11840 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51  , 0);..  /* -DSQ
11850 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
11860 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65  KING_MODE=1 make
11870 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20  s EXCLUSIVE the 
11880 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
11890 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51    ** mode.  -DSQ
118a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
118b0 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65  KING_MODE=0 make
118c0 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
118d0 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
118e0 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f   mode.  Doing no
118f0 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73  thing at all als
11900 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74  o makes NORMAL t
11910 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  he default..  */
11920 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
11930 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
11940 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f  ODE.  db->dfltLo
11950 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ckMode = SQLITE_
11960 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
11970 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50  MODE;.  sqlite3P
11980 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
11990 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
119a0 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  r(db->aDb[0].pBt
119b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
119d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
119e0 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69  ING_MODE);.#endi
119f0 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74  f..  /* Enable t
11a00 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c  he lookaside-mal
11a10 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f  loc subsystem */
11a20 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  .  setupLookasid
11a30 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33  e(db, 0, sqlite3
11a40 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c  GlobalConfig.szL
11a50 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20  ookaside,.      
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
11a80 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65  onfig.nLookaside
11a90 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  );..  sqlite3_wa
11aa0 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
11ab0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  (db, SQLITE_DEFA
11ac0 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43  ULT_WAL_AUTOCHEC
11ad0 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62  KPOINT);..opendb
11ae0 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f  _out:.  sqlite3_
11af0 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69  free(zOpen);.  i
11b00 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73  f( db ){.    ass
11b10 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d  ert( db->mutex!=
11b20 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66  0 || isThreadsaf
11b30 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47  e==0 || sqlite3G
11b40 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
11b50 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  lMutex==0 );.   
11b60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11b70 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
11b80 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
11b90 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
11ba0 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
11bb0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
11bc0 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63  OMEM );.  if( rc
11bd0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11be0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  {.    sqlite3_cl
11bf0 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20  ose(db);.    db 
11c00 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
11c10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11c20 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
11c30 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53  = SQLITE_MAGIC_S
11c40 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62  ICK;.  }.  *ppDb
11c50 20 3d 20 64 62 3b 0a 20 20 72 65 74 75 72 6e 20   = db;.  return 
11c60 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
11c70 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
11c80 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
11c90 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
11ca0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  nt sqlite3_open(
11cb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11cc0 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
11cd0 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a  ite3 **ppDb .){.
11ce0 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
11cf0 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  abase(zFilename,
11d00 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
11d20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
11d30 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
11d40 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69  _CREATE, 0);.}.i
11d50 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
11d60 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  v2(.  const char
11d70 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a   *filename,   /*
11d80 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
11d90 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  me (UTF-8) */.  
11da0 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
11db0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11dc0 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65  SQLite db handle
11dd0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11df0 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   Flags */.  cons
11e00 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
11e10 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56      /* Name of V
11e20 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65  FS module to use
11e30 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
11e40 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c  openDatabase(fil
11e50 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e  ename, ppDb, (un
11e60 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73  signed int)flags
11e70 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
11e80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11e90 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
11ea0 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
11eb0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
11ec0 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
11ed0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
11ee0 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
11ef0 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
11f00 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
11f10 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
11f20 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
11f30 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
11f40 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
11f50 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
11f60 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
11f70 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
11f80 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
11f90 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d  pDb );.  *ppDb =
11fa0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
11fb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
11fc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
11fd0 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
11fe0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
11ff0 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61  rc;.#endif.  pVa
12000 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
12010 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
12020 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
12030 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  l, -1, zFilename
12040 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
12050 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41  TIVE, SQLITE_STA
12060 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  TIC);.  zFilenam
12070 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  e8 = sqlite3Valu
12080 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
12090 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20  TE_UTF8);.  if( 
120a0 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20  zFilename8 ){.  
120b0 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62    rc = openDatab
120c0 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20  ase(zFilename8, 
120d0 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
120e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
120f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
12100 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
12110 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20  CREATE, 0);.    
12120 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c  assert( *ppDb ||
12130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
12140 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  M );.    if( rc=
12150 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44  =SQLITE_OK && !D
12160 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70  bHasProperty(*pp
12170 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  Db, 0, DB_Schema
12180 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20  Loaded) ){.     
12190 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51   ENC(*ppDb) = SQ
121a0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
121b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
121c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
121d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71  _NOMEM;.  }.  sq
121e0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
121f0 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
12200 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
12210 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  , rc);.}.#endif 
12220 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
12230 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
12240 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
12250 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
12260 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
12270 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
12280 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
12290 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
122a0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
122b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
122c0 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
122d0 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
122e0 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
122f0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
12300 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
12310 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
12320 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
12330 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
12340 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
12350 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
12360 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
12370 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
12380 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20  zName, (u8)enc, 
12390 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
123a0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
123b0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
123c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
123d0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
123e0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
123f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
12400 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
12410 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
12420 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
12430 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
12440 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12450 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
12460 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
12470 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
12480 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
12490 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
124a0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
124b0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
124c0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
124d0 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
124e0 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
124f0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
12500 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
12510 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
12520 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
12530 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
12540 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
12550 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
12560 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
12570 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63  are, xDel);.  rc
12580 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
12590 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
125a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
125b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
125c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
125d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
125e0 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
125f0 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
12600 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
12610 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
12620 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
12630 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
12640 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20  e_collation16(. 
12650 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
12660 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
12670 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  me,.  int enc, .
12680 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
12690 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
126a0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
126b0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
126c0 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
126d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
126e0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20   char *zName8;. 
126f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12700 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12710 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
12720 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
12730 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74    zName8 = sqlit
12740 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
12750 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
12760 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
12770 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20   if( zName8 ){. 
12780 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f     rc = createCo
12790 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
127a0 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  e8, (u8)enc, pCt
127b0 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
127c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
127d0 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
127e0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
127f0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
12800 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
12810 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
12820 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
12830 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12840 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
12850 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
12860 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
12870 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
12880 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
12890 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
128a0 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
128b0 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
128c0 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
128d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
128e0 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
128f0 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
12900 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
12910 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
12920 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
12930 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
12940 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
12950 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
12960 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
12970 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12980 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
12990 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
129a0 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  eded = xCollNeed
129b0 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ed;.  db->xCollN
129c0 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64  eeded16 = 0;.  d
129d0 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
129e0 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
129f0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
12a00 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
12a10 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
12a20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
12a30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12a40 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
12a50 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
12a60 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
12a70 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
12a80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12a90 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
12aa0 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
12ab0 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
12ac0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12ad0 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
12ae0 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
12af0 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71  n_needed16(.  sq
12b00 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
12b10 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
12b20 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
12b30 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64  llNeeded16)(void
12b40 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
12b50 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f  TextRep,const vo
12b60 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  id*).){.  sqlite
12b70 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
12b80 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
12b90 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b  xCollNeeded = 0;
12ba0 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
12bb0 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  ed16 = xCollNeed
12bc0 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c  ed16;.  db->pCol
12bd0 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
12be0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
12bf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12c00 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
12c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12c20 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
12c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
12c40 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
12c50 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
12c60 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  TED./*.** This f
12c70 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61  unction is now a
12c80 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49  n anachronism. I
12c90 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65  t used to be use
12ca0 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  d to recover fro
12cb0 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20  m a.** malloc() 
12cc0 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c  failure, but SQL
12cd0 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69  ite now does thi
12ce0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  s automatically.
12cf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
12d00 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76  global_recover(v
12d10 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  oid){.  return S
12d20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
12d30 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  if../*.** Test t
12d40 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
12d50 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
12d60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
12d70 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a  in autocommit.**
12d80 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54   mode.  Return T
12d90 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64  RUE if it is and
12da0 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20   FALSE if not.  
12db0 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  Autocommit mode 
12dc0 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61  is on.** by defa
12dd0 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  ult.  Autocommit
12de0 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20   is disabled by 
12df0 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
12e00 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a  t and reenabled.
12e10 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43  ** by the next C
12e20 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
12e30 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48  K..**.******* TH
12e40 49 53 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d  IS IS AN EXPERIM
12e50 45 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53  ENTAL API AND IS
12e60 20 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e   SUBJECT TO CHAN
12e70 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74  GE ******.*/.int
12e80 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
12e90 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  ocommit(sqlite3 
12ea0 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
12eb0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d  b->autoCommit;.}
12ec0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
12ed0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
12ee0 72 65 20 73 75 62 74 69 74 75 74 65 73 20 66 6f  re subtitutes fo
12ef0 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
12f00 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
12f10 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
12f20 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
12f30 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20  QLITE_IOERR and 
12f40 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
12f50 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
12f60 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 72 20  s.  They server 
12f70 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a  two purposes:.**
12f80 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20  .**   1.  Serve 
12f90 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  as a convenient 
12fa0 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
12fb0 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64  reakpoint in a d
12fc0 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20  ebugger.**      
12fd0 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
12fe0 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f  version error co
12ff0 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e  nditions occurs.
13000 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76  .**.**   2.  Inv
13010 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  oke sqlite3_log(
13020 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  ) to provide the
13030 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63   source code loc
13040 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20  ation where.**  
13050 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c       a low-level
13060 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20   error is first 
13070 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74  detected..*/.int
13080 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45   sqlite3CorruptE
13090 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
130a0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
130b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
130c0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
130d0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
130e0 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20  E_CORRUPT,.     
130f0 20 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61           "databa
13100 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74  se corruption at
13110 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
13120 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
13130 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
13140 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
13150 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
13160 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69  ITE_CORRUPT;.}.i
13170 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65  nt sqlite3Misuse
13180 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
13190 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
131a0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
131b0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
131c0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
131d0 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20  TE_MISUSE, .    
131e0 20 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73            "misus
131f0 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
13200 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
13210 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
13220 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
13230 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
13240 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
13250 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e  }.int sqlite3Can
13260 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c  topenError(int l
13270 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
13280 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
13290 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
132a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  );.  sqlite3_log
132b0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
132c0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
132d0 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
132e0 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  le at line %d of
132f0 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
13300 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c           lineno,
13310 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72   20+sqlite3_sour
13320 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  ceid());.  retur
13330 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
13340 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N;.}...#ifndef S
13350 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
13360 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
13370 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
13380 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
13390 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
133a0 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
133b0 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
133c0 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
133d0 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
133e0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
133f0 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
13400 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
13410 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
13420 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
13430 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
13440 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
13450 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
13460 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
13470 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
13480 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69  p(void){.}.#endi
13490 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
134a0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
134b0 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69   about a specifi
134c0 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61  c column of a da
134d0 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
134e0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20   See comment in 
134f0 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74  sqlite3.h (sqlit
13500 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61  e.h.in) for deta
13510 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ils..*/.#ifdef S
13520 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
13530 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74  UMN_METADATA.int
13540 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
13550 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
13560 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13580 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
13590 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
135a0 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
135b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
135c0 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
135d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
135e0 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
135f0 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
13600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
13610 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
13620 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
13630 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
13640 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
13650 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
13660 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
13670 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
13680 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
13690 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
136a0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
136b0 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
136c0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
136d0 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
136e0 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
136f0 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
13700 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
13710 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
13720 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
13730 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
13740 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
13750 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
13760 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
13770 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
13780 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
13790 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
137a0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
137b0 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
137c0 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
137d0 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
137e0 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72  nt iCol;..  char
137f0 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
13800 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
13810 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
13820 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
13830 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
13840 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
13850 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
13860 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
13870 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
13880 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
13890 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
138a0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
138b0 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
138c0 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
138d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
138e0 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
138f0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
13900 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
13910 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
13920 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
13930 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
13940 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
13950 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
13960 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
13970 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
13980 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
13990 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
139a0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
139b0 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
139c0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
139d0 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
139e0 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
139f0 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ted */.  if( sql
13a00 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
13a10 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
13a20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
13a30 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ey;.    if( iCol
13a40 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  >=0 ){.      pCo
13a50 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
13a60 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  iCol];.    }.  }
13a70 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
13a80 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
13a90 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
13aa0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
13ab0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
13ac0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
13ad0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
13ae0 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
13af0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
13b00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
13b10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
13b20 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
13b30 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30  {.      pTab = 0
13b40 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72  ;.      goto err
13b50 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  or_out;.    }.  
13b60 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
13b70 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
13b80 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
13b90 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
13ba0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
13bb0 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
13bc0 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
13bd0 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
13be0 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
13bf0 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
13c00 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
13c10 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
13c20 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
13c30 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
13c40 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
13c50 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
13c60 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
13c70 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
13c80 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
13c90 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
13ca0 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
13cb0 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
13cc0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
13cd0 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
13ce0 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
13cf0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
13d00 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
13d10 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
13d20 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
13d30 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
13d40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
13d50 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
13d60 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
13d70 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f   zDataType = pCo
13d80 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43  l->zType;.    zC
13d90 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
13da0 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
13db0 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
13dc0 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
13dd0 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73  ykey  = pCol->is
13de0 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20  PrimKey!=0;.    
13df0 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e  autoinc = pTab->
13e00 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28  iPKey==iCol && (
13e10 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
13e20 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
13e30 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)!=0;.  }else{.
13e40 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
13e50 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70  "INTEGER";.    p
13e60 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20  rimarykey = 1;. 
13e70 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53   }.  if( !zCollS
13e80 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53  eq ){.    zCollS
13e90 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  eq = "BINARY";. 
13ea0 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20   }..error_out:. 
13eb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13ec0 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a  veAll(db);..  /*
13ed0 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e   Whether the fun
13ee0 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65  ction call succe
13ef0 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20  eded or failed, 
13f00 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
13f10 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74  arameters.  ** t
13f20 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72  o whatever their
13f30 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61   local counterpa
13f40 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20  rts contain. If 
13f50 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63  an error did occ
13f60 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61  ur,.  ** this ha
13f70 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
13f80 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70  zeroing all outp
13f90 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ut parameters.. 
13fa0 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61   */.  if( pzData
13fb0 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79  Type ) *pzDataTy
13fc0 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a  pe = zDataType;.
13fd0 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20    if( pzCollSeq 
13fe0 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a  ) *pzCollSeq = z
13ff0 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70  CollSeq;.  if( p
14000 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e  NotNull ) *pNotN
14010 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20  ull = notnull;. 
14020 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79   if( pPrimaryKey
14030 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20   ) *pPrimaryKey 
14040 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  = primarykey;.  
14050 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a  if( pAutoinc ) *
14060 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69  pAutoinc = autoi
14070 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  nc;..  if( SQLIT
14080 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61  E_OK==rc && !pTa
14090 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
140a0 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
140b0 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67  sg);.    zErrMsg
140c0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
140d0 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74  f(db, "no such t
140e0 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e  able column: %s.
140f0 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  %s", zTableName,
14100 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e  .        zColumn
14110 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
14120 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
14130 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
14140 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73  (db, rc, (zErrMs
14150 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d  g?"%s":0), zErrM
14160 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
14170 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
14180 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
14190 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
141a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
141b0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
141c0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
141d0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
141e0 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
141f0 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
14200 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
14210 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
14220 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  int sqlite3_slee
14230 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c  p(int ms){.  sql
14240 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
14250 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73    int rc;.  pVfs
14260 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
14270 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56  ind(0);.  if( pV
14280 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  fs==0 ) return 0
14290 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
142a0 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d  ction works in m
142b0 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74  illiseconds, but
142c0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
142d0 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20  OsSleep() .  ** 
142e0 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65  API uses microse
142f0 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65  conds. Hence the
14300 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20   1000's..  */.  
14310 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53  rc = (sqlite3OsS
14320 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a  leep(pVfs, 1000*
14330 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74  ms)/1000);.  ret
14340 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14350 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
14360 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20  le the extended 
14370 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f  result codes..*/
14380 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
14390 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
143a0 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
143b0 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71  int onoff){.  sq
143c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
143d0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
143e0 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e  db->errMask = on
143f0 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66  off ? 0xffffffff
14400 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74   : 0xff;.  sqlit
14410 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
14420 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
14430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14440 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
14450 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  he xFileControl 
14460 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74  method on a part
14470 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e  icular database.
14480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
14490 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c  file_control(sql
144a0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
144b0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69  char *zDbName, i
144c0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
144d0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
144e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42  QLITE_ERROR;.  B
144f0 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 20  tree *pBtree;.. 
14500 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14510 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
14520 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69  .  pBtree = sqli
14530 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
14540 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
14550 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
14560 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
14570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
14580 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69  le *fd;.    sqli
14590 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
145a0 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65  tree);.    pPage
145b0 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
145c0 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Pager(pBtree);. 
145d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
145e0 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d  r!=0 );.    fd =
145f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
14600 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  e(pPager);.    a
14610 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a  ssert( fd!=0 );.
14620 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
14630 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f  TE_FCNTL_FILE_PO
14640 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
14650 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29  (sqlite3_file**)
14660 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20  pArg = fd;.     
14670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14680 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66  .    }else if( f
14690 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
146a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
146b0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66  3OsFileControl(f
146c0 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20  d, op, pArg);.  
146d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
146e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
146f0 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UND;.    }.    s
14700 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14710 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
14720 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14730 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
14740 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a    return rc;   .
14750 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
14760 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
14770 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
14780 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
14790 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
147a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
147b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
147c0 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
147d0 54 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  T.  va_list ap;.
147e0 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
147f0 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
14800 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   ){..    /*.    
14810 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
14820 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
14830 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20   PRNG..    */.  
14840 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
14850 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
14860 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
14870 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29  3PrngSaveState()
14880 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14890 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
148a0 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   ** Restore the 
148b0 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
148c0 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74  G to the last st
148d0 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a  ate saved using.
148e0 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45      ** PRNG_SAVE
148f0 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20  .  If PRNG_SAVE 
14900 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
14910 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
14920 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76  en.    ** this v
14930 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52  erb acts like PR
14940 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f  NG_RESET..    */
14950 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14960 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
14970 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20  ESTORE: {.      
14980 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f  sqlite3PrngResto
14990 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  reState();.     
149a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
149b0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
149c0 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b  et the PRNG back
149d0 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61   to its uninitia
149e0 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68  lized state.  Th
149f0 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20  e next call.    
14a00 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61  ** to sqlite3_ra
14a10 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20  ndomness() will 
14a20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20  reseed the PRNG 
14a30 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63  using a single c
14a40 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  all.    ** to th
14a50 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65  e xRandomness me
14a60 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61  thod of the defa
14a70 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a  ult VFS..    */.
14a80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14a90 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
14aa0 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  SET: {.      sql
14ab0 69 74 65 33 50 72 6e 67 52 65 73 65 74 53 74 61  ite3PrngResetSta
14ac0 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
14ad0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14ae0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
14af0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49  _test_control(BI
14b00 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c  TVEC_TEST, size,
14b10 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a   program).    **
14b20 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65  .    ** Run a te
14b30 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74  st against a Bit
14b40 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69  vec object of si
14b50 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d  ze.  The program
14b60 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
14b70 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
14b80 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
14b90 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20  fines the test. 
14ba0 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a   Return -1 on a.
14bb0 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
14bc0 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20  location error, 
14bd0 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72  0 on success, or
14be0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e   non-zero for an
14bf0 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53   error..    ** S
14c00 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69  ee the sqlite3Bi
14c10 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
14c20 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
14c30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
14c40 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
14c50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
14c60 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20  TVEC_TEST: {.   
14c70 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
14c80 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
14c90 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20     int *aProg = 
14ca0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
14cb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14cc0 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
14cd0 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29  nTest(sz, aProg)
14ce0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14cf0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
14d00 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
14d10 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e  t_control(BENIGN
14d20 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78  _MALLOC_HOOKS, x
14d30 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20  Begin, xEnd).   
14d40 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73   **.    ** Regis
14d50 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c  ter hooks to cal
14d60 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  l to indicate wh
14d70 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ich malloc() fai
14d80 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72  lures .    ** ar
14d90 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f  e benign..    */
14da0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14db0 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e  _TESTCTRL_BENIGN
14dc0 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b  _MALLOC_HOOKS: {
14dd0 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
14de0 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74  oid (*void_funct
14df0 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20  ion)(void);.    
14e00 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
14e10 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20  xBenignBegin;.  
14e20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
14e30 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20  n xBenignEnd;.  
14e40 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e      xBenignBegin
14e50 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
14e60 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
14e70 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d      xBenignEnd =
14e80 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
14e90 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
14ea0 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d    sqlite3BenignM
14eb0 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69  allocHooks(xBeni
14ec0 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e  gnBegin, xBenign
14ed0 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  End);.      brea
14ee0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14ef0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
14f00 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
14f10 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
14f20 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69  NDING_BYTE, unsi
14f30 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20  gned int X).    
14f40 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
14f50 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74  e PENDING byte t
14f60 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  o the value in t
14f70 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  he argument, if 
14f80 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65  X>0..    ** Make
14f90 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58   no changes if X
14fa0 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ==0.  Return the
14fb0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65   value of the pe
14fc0 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a  nding byte.    *
14fd0 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67  * as it existing
14fe0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
14ff0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e  tine was called.
15000 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
15010 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67  MPORTANT:  Chang
15020 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
15030 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30  byte from 0x4000
15040 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a  0000 results in.
15050 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70      ** an incomp
15060 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20  atible database 
15070 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68  file format.  Ch
15080 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
15090 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77  NG byte.    ** w
150a0 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73  hile any databas
150b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
150c0 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  open results in 
150d0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20  undefined and.  
150e0 20 20 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73    ** dileterious
150f0 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a   behavior..    *
15100 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
15110 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
15120 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20  NG_BYTE: {.     
15130 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59   rc = PENDING_BY
15140 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  TE;.#ifndef SQLI
15150 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20  TE_OMIT_WSD.    
15160 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69    {.        unsi
15170 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20  gned int newVal 
15180 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73  = va_arg(ap, uns
15190 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20  igned int);.    
151a0 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29      if( newVal )
151b0 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42   sqlite3PendingB
151c0 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20  yte = newVal;.  
151d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
151e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
151f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
15200 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
15210 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
15220 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74  CTRL_ASSERT, int
15230 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
15240 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
15250 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
15260 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68  e test to see wh
15270 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20  ether or not.   
15280 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73   ** assert() was
15290 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
152a0 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20  ile-time.  If X 
152b0 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65  is true and asse
152c0 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65  rt().    ** is e
152d0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
152e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
152f0 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20   true.  If X is 
15300 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20  true and.    ** 
15310 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
15320 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
15330 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
15340 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20  ero.  If X is.  
15350 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61    ** false and a
15360 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
15370 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73  ed, then the ass
15380 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64  ertion fires and
15390 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63   the.    ** proc
153a0 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20  ess aborts.  If 
153b0 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61  X is false and a
153c0 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
153d0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  led, then the.  
153e0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
153f0 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e is zero..    *
15400 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
15410 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
15420 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74  T: {.      volat
15430 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20  ile int x = 0;. 
15440 20 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20       assert( (x 
15450 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
15460 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
15470 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61   = x;.      brea
15480 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
15490 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
154a0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
154b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
154c0 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20  LWAYS, int X).  
154d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
154e0 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
154f0 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
15500 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20   to see how the 
15510 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a  ALWAYS and.    *
15520 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77  * NEVER macros w
15530 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63  ere defined at c
15540 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20  ompile-time..   
15550 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
15560 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41  eturn value is A
15570 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20  LWAYS(X).  .    
15580 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
15590 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69  commended test i
155a0 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20  s X==2.  If the 
155b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
155c0 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  2, that means.  
155d0 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e    ** ALWAYS() an
155e0 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f  d NEVER() are bo
155f0 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  th no-op pass-th
15600 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68  rough macros, wh
15610 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ich is the.    *
15620 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  * default settin
15630 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  g.  If the retur
15640 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68  n value is 1, th
15650 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65  en ALWAYS() is e
15660 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72  ither.    ** har
15670 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20  d-coded to true 
15680 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72  or else it asser
15690 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65  ts if its argume
156a0 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20  nt is false..   
156b0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65   ** The first be
156c0 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64  havior (hard-cod
156d0 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74  ed to true) is t
156e0 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
156f0 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
15700 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
15710 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
15720 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65  disabled and the
15730 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62   second.    ** b
15740 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20  ehavior (assert 
15750 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
15760 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66  to ALWAYS() is f
15770 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73  alse) is the cas
15780 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
15790 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
157a0 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
157b0 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
157c0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
157d0 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65   The run-time te
157e0 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67  st procedure mig
157f0 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e  ht look somethin
15800 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  g like this:.   
15810 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66   **.    **    if
15820 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
15830 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
15840 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32  STCTRL_ALWAYS, 2
15850 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20  )==2 ){.    **  
15860 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20      // ALWAYS() 
15870 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
15880 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
15890 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a  gh macros.    **
158a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
158b0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
158c0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
158d0 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b  RL_ASSERT, 1) ){
158e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
158f0 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74  ALWAYS(x) assert
15900 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65  s that x is true
15910 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72  . NEVER(x) asser
15920 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20  ts x is false.. 
15930 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a     **    }else{.
15940 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
15950 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f  LWAYS(x) is a co
15960 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52  nstant 1.  NEVER
15970 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
15980 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  t 0..    **    }
15990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
159a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
159b0 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20  _ALWAYS: {.     
159c0 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
159d0 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72  ap,int);.      r
159e0 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20  c = ALWAYS(x);. 
159f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15a00 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
15a10 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
15a20 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
15a30 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65  _RESERVE, sqlite
15a40 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20  3 *db, int N).  
15a50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
15a60 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a  the nReserve siz
15a70 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d  e to N for the m
15a80 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20  ain database on 
15a90 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
15aa0 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   ** connection d
15ab0 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
15ac0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
15ad0 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20  RL_RESERVE: {.  
15ae0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
15af0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
15b00 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e  ite3*);.      in
15b10 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
15b20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
15b30 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15b40 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
15b50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
15b60 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44  tPageSize(db->aD
15b70 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20  b[0].pBt, 0, x, 
15b80 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
15b90 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
15ba0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
15bb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15bc0 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    /*  sqlite3_te
15bd0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
15be0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
15bf0 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65  IZATIONS, sqlite
15c00 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20  3 *db, int N).  
15c10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62    **.    ** Enab
15c20 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61  le or disable va
15c30 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
15c40 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ons for testing 
15c50 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a  purposes.  The .
15c60 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20      ** argument 
15c70 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  N is a bitmask o
15c80 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  f optimizations 
15c90 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20  to be disabled. 
15ca0 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20   For normal.    
15cb0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73  ** operation N s
15cc0 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65  hould be 0.  The
15cd0 20 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20   idea is that a 
15ce0 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69  test program (li
15cf0 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  ke the.    ** SQ
15d00 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20  L Logic Test or 
15d10 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29  SLT test module)
15d20 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d   can run the sam
15d30 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74  e SQL multiple t
15d40 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  imes.    ** with
15d50 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
15d60 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20  ations disabled 
15d70 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
15d80 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
15d90 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65     ** is obtaine
15da0 64 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e  d in every case.
15db0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
15dc0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
15dd0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20  _OPTIMIZATIONS: 
15de0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
15df0 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
15e00 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
15e10 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
15e20 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
15e30 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26  db->flags = (x &
15e40 20 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29   SQLITE_OptMask)
15e50 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
15e60 7e 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29  ~SQLITE_OptMask)
15e70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15e80 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
15e90 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
15ea0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
15eb0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
15ec0 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
15ed0 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
15ee0 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
15ef0 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
15f00 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
15f10 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
15f20 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
15f30 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
15f40 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
15f50 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
15f60 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
15f70 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
15f80 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
15f90 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
15fa0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
15fb0 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
15fc0 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
15fd0 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
15fe0 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
15ff0 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
16000 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
16010 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
16020 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
16030 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
16040 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
16050 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
16060 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
16070 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
16080 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
16090 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
160a0 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
160b0 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
160c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
160d0 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
160e0 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
160f0 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
16100 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
16110 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16120 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20   }.#endif ..    
16130 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
16140 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
16150 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
16160 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
16170 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
16180 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
16190 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
161a0 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
161b0 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
161c0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
161d0 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
161e0 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
161f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
16200 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
16210 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
16220 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
16230 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
16240 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
16250 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
16260 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
16270 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
16280 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
16290 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
162a0 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
162b0 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
162c0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
162d0 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
162e0 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
162f0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
16300 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
16310 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
16320 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
16330 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
16340 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
16350 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
16360 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
16370 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
16380 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
16390 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
163a0 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
163b0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
163c0 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
163d0 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
163e0 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
163f0 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
16400 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
16410 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
16420 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
16430 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
16440 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
16450 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
16460 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
16470 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
16480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
16490 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
164a0 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
164b0 45 58 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20  EXPLAIN).    /* 
164c0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
164d0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
164e0 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53  STCTRL_EXPLAIN_S
164f0 54 4d 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20  TMT,.    **     
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16510 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a     sqlite3_stmt*
16520 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a  ,const char**);.
16530 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
16540 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
16550 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
16560 45 5f 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20  E_EXPLAIN, each 
16570 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c  sqlite3_stmt hol
16580 64 73 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69  ds.    ** a stri
16590 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
165a0 73 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  s the optimized 
165b0 70 61 72 73 65 20 74 72 65 65 2e 20 20 54 68 69  parse tree.  Thi
165c0 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20  s test-control. 
165d0 20 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20     ** returns a 
165e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
165f0 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  string..    */. 
16600 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
16610 45 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f  ESTCTRL_EXPLAIN_
16620 53 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  STMT: {.      sq
16630 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16640 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  t = va_arg(ap, s
16650 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20  qlite3_stmt*);. 
16660 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
16670 2a 2a 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67  **pzRet = va_arg
16680 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
16690 2a 29 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74  *);.      *pzRet
166a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
166b0 70 6c 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a  planation((Vdbe*
166c0 29 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62  )pStmt);.      b
166d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
166e0 69 66 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64  if..  }.  va_end
166f0 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
16700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
16710 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65  TIN_TEST */.  re
16720 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16730 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
16740 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65  ity routine, use
16750 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65  ful to VFS imple
16760 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74  mentations, that
16770 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65   checks.** to se
16780 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  e if a database 
16790 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74  file was a URI t
167a0 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20  hat contained a 
167b0 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a  specific query .
167c0 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e  ** parameter, an
167d0 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20  d if so obtains 
167e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
167f0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
16800 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
16810 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
16820 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70  s the filename p
16830 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e  ointer passed in
16840 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a  to the xOpen().*
16850 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46  * method of a VF
16860 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
16870 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72  .  The zParam ar
16880 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
16890 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65  me of the.** que
168a0 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20  ry parameter we 
168b0 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74  seek.  This rout
168c0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
168d0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61  value of the zPa
168e0 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ram.** parameter
168f0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
16900 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
16910 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
16920 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
16930 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20   returns a NULL 
16940 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
16950 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
16960 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f  uri_parameter(co
16970 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
16980 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
16990 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20  *zParam){.  if( 
169a0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72  zFilename==0 ) r
169b0 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65  eturn 0;.  zFile
169c0 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
169d0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
169e0 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  e) + 1;.  while(
169f0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
16a00 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72  .    int x = str
16a10 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  cmp(zFilename, z
16a20 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c  Param);.    zFil
16a30 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
16a40 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
16a50 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  me) + 1;.    if(
16a60 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a   x==0 ) return z
16a70 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46  Filename;.    zF
16a80 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
16a90 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
16aa0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20  name) + 1;.  }. 
16ab0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
16ac0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f  .** Return a boo
16ad0 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  lean value for a
16ae0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
16af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16b00 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e  _uri_boolean(con
16b10 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
16b20 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
16b30 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c  zParam, int bDfl
16b40 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
16b50 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
16b60 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
16b70 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
16b80 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21    bDflt = bDflt!
16b90 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f  =0;.  return z ?
16ba0 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
16bb0 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62  an(z, bDflt) : b
16bc0 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
16bd0 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69  eturn a 64-bit i
16be0 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
16bf0 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74   a query paramet
16c00 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  er..*/.sqlite3_i
16c10 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69  nt64 sqlite3_uri
16c20 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20  _int64(.  const 
16c30 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
16c40 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
16c50 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70  as passed to xOp
16c60 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  en */.  const ch
16c70 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20  ar *zParam,     
16c80 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74    /* URI paramet
16c90 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73  er sought */.  s
16ca0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66  qlite3_int64 bDf
16cb0 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  lt       /* retu
16cc0 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20  rn if parameter 
16cd0 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b  is missing */.){
16ce0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16cf0 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
16d00 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
16d10 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73  me, zParam);.  s
16d20 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a  qlite3_int64 v;.
16d30 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74    if( z && sqlit
16d40 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20  e3Atoi64(z, &v, 
16d50 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16d60 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
16d70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16d80 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20     bDflt = v;.  
16d90 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74  }.  return bDflt
16da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16db0 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e  n the Btree poin
16dc0 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
16dd0 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75  y zDbName.  Retu
16de0 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
16df0 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a  ound..*/.Btree *
16e00 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
16e10 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  tree(sqlite3 *db
16e20 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
16e30 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  bName){.  int i;
16e40 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
16e50 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
16e60 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
16e70 70 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62  pBt.     && (zDb
16e80 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
16e90 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d  e3StrICmp(zDbNam
16ea0 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  e, db->aDb[i].zN
16eb0 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a  ame)==0).    ){.
16ec0 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d        return db-
16ed0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
16ee0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16ef0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
16f00 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
16f10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
16f20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
16f30 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
16f40 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
16f50 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
16f60 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
16f70 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
16f80 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
16f90 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73    Btree *pBt = s
16fa0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
16fb0 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
16fc0 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
16fd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16fe0 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
16ff0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
17000 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
17010 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
17020 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
17030 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
17040 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
17050 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
17060 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
17070 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
17080 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
17090 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
170a0 65 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33  e *pBt = sqlite3
170b0 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
170c0 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
170d0 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
170e0 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
170f0 79 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  y(sqlite3BtreePa
17100 67 65 72 28 70 42 74 29 29 20 3a 20 2d 31 3b 0a  ger(pBt)) : -1;.
17110 7d 0a                                            }.