/ Hex Artifact Content
Login

Artifact d5ee3f6b60ed3692ffaa2ecfd1f9ea75439320f9:


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 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1110: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1120: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1130: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
1140: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1150: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1160: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1170: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20  .  /* If SQLite 
1180: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c  is already compl
1190: 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  etely initialize
11a0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  d, then this cal
11b0: 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  l.  ** to sqlite
11c0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73  3_initialize() s
11d0: 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70  hould be a no-op
11e0: 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74 69  .  But the initi
11f0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d  alization.  ** m
1200: 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e  ust be complete.
1210: 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74    So isInit must
1220: 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69   not be set unti
1230: 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20  l the very end. 
1240: 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74   ** of this rout
1250: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
1260: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1270: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
1280: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1290: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
12a0: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
12b0: 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  em is initialize
12c0: 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  d.  If unable to
12d0: 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a   .  ** initializ
12e0: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
12f0: 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61  ystem, return ea
1300: 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72 72  rly with the err
1310: 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  or..  ** If the 
1320: 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63  system is so sic
1330: 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75 6e  k that we are un
1340: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
1350: 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74   a mutex,.  ** t
1360: 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68  here is not much
1370: 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67   SQLite is going
1380: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64   to be able to d
1390: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
13a0: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
13b0: 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65 20   must take care 
13c0: 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69  of serializing i
13d0: 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74  ts own.  ** init
13e0: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  ialization..  */
13f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d  .  rc = sqlite3M
1400: 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66  utexInit();.  if
1410: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1420: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
1430: 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20  ze the malloc() 
1440: 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72  system and the r
1450: 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75  ecursive pInitMu
1460: 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20  tex mutex..  ** 
1470: 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69  This operation i
1480: 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 74  s protected by t
1490: 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52  he STATIC_MASTER
14a0: 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68   mutex.  Note th
14b0: 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c  at.  ** MutexAll
14c0: 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  oc() is called f
14d0: 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74 65  or a static mute
14e0: 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69  x prior to initi
14f0: 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a  alizing the.  **
1500: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1510: 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73  m - this implies
1520: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
1530: 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63  tion of a static
1540: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74  .  ** mutex must
1550: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75 70   not require sup
1560: 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61  port from the ma
1570: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a  lloc subsystem..
1580: 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47    */.  MUTEX_LOG
1590: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
15a0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15b0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15c0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
15d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15e0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
15f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1600: 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74  nfig.isMutexInit
1610: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c   = 1;.  if( !sql
1620: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1630: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
1640: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1650: 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20  3MallocInit();. 
1660: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1670: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1680: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1690: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
16a0: 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   1;.    if( !sql
16b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16c0: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
16d0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
16e0: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
16f0: 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tex =.          
1700: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1710: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1720: 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
1730: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1740: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
1750: 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65 33  utex && !sqlite3
1760: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1770: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
1780: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1790: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
17a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
17b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17c0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
17d0: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
17e0: 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  utex++;.  }.  sq
17f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1800: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
1810: 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53  * If rc is not S
1820: 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73  QLITE_OK at this
1830: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74   point, then eit
1840: 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20  her the malloc. 
1850: 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f   ** subsystem co
1860: 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69  uld not be initi
1870: 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79  alized or the sy
1880: 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61  stem failed to a
1890: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65  llocate.  ** the
18a0: 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65   pInitMutex mute
18b0: 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  x. Return an err
18c0: 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  or in either cas
18d0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  e.  */.  if( rc!
18e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1900: 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65  ..  /* Do the re
1910: 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  st of the initia
1920: 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74  lization under t
1930: 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75 74  he recursive mut
1940: 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ex so.  ** that 
1950: 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  we will be able 
1960: 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73  to handle recurs
1970: 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20  ive calls into. 
1980: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   ** sqlite3_init
1990: 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72  ialize().  The r
19a0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e  ecursive calls n
19b0: 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72  ormally come thr
19c0: 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ough.  ** sqlite
19d0: 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e  3_os_init() when
19e0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69   it invokes sqli
19f0: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1a00: 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20  (), but other.  
1a10: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  ** recursive cal
1a20: 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  ls might also be
1a30: 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a   possible..  **.
1a40: 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
1a50: 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d  ION-OF: R-00140-
1a60: 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75 74  37445 SQLite aut
1a70: 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61  omatically seria
1a80: 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a  lizes calls.  **
1a90: 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65   to the xInit me
1aa0: 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e  thod, so the xIn
1ab0: 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e  it method need n
1ac0: 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66 65  ot be threadsafe
1ad0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1ae0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20  following mutex 
1af0: 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a  is what serializ
1b00: 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  es access to the
1b10: 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20 78   appdef pcache x
1b20: 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64  Init.  ** method
1b30: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
1b40: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78  pcache_methods.x
1b50: 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d  Init() all is em
1b60: 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20  bedded in the.  
1b70: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
1b80: 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69  e3PcacheInitiali
1b90: 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ze()..  */.  sql
1ba0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1bb0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
1bc0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
1bd0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ;.  if( sqlite3G
1be0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1bf0: 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  it==0 && sqlite3
1c00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1c10: 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20  rogress==0 ){.  
1c20: 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70    FuncDefHash *p
1c30: 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46  Hash = &GLOBAL(F
1c40: 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69  uncDefHash, sqli
1c50: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1c60: 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ns);.    sqlite3
1c70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1c80: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
1c90: 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30   memset(pHash, 0
1ca0: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
1cb0: 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29  GlobalFunctions)
1cc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1cd0: 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63  gisterGlobalFunc
1ce0: 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28  tions();.    if(
1cf0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d00: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
1d10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
1d20: 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1d30: 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  Initialize();.  
1d40: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1d50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1d70: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
1d80: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  nit = 1;.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69  c = sqlite3OsIni
1da0: 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t();.    }.    i
1db0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1dd0: 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65 74  3PCacheBufferSet
1de0: 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  up( sqlite3Globa
1df0: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a  lConfig.pPage, .
1e00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
1e20: 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f  Page, sqlite3Glo
1e30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29  balConfig.nPage)
1e40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1e50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1e60: 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  it = 1;.    }.  
1e70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1e80: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1e90: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1ea0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1eb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ec0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
1ed0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
1ee0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
1ef0: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
1f00: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
1f10: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
1f20: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
1f30: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
1f40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1f50: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1f60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f70: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1f80: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
1f90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1fa0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
1fb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
1fc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fd0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
1fe0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1ff0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2000: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2010: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
2020: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2030: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2040: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2050: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2060: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
2070: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2080: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
2090: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
20a0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
20b0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
20c0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
20d0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
20e0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
20f0: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2100: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2110: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2120: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2130: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2140: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2150: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2160: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2170: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2180: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
2190: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
21a0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
21b0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
21c0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
21d0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
21e0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
21f0: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2200: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2210: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2220: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2230: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2240: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2250: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2260: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2270: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2280: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
2290: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
22a0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
22b0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
22c0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
22d0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
22e0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
22f0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2300: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2310: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2320: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2330: 49 4e 49 54 0a 20 20 69 66 28 20 72 63 3d 3d 53  INIT.  if( rc==S
2340: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
2350: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2360: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e  isInit ){.    in
2370: 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  t SQLITE_EXTRA_I
2380: 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  NIT(const char*)
2390: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
23a0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b  E_EXTRA_INIT(0);
23b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23d0: 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65  ** Undo the effe
23e0: 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  cts of sqlite3_i
23f0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75  nitialize().  Mu
2400: 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  st not be called
2410: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20   while.** there 
2420: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
2430: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2440: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2450: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a  llocations or.**
2460: 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20   while any part 
2470: 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68  of SQLite is oth
2480: 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e  erwise in use in
2490: 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68   any thread.  Th
24a0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
24b0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e   not threadsafe.
24c0: 20 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65    But it is safe
24d0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20   to invoke this 
24e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68  routine.** on wh
24f0: 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  en SQLite is alr
2500: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20  eady shut down. 
2510: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
2520: 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a  ready shut down.
2530: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
2540: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tine is invoked,
2550: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2560: 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
2570: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
2580: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
2590: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c  void){.  if( sql
25a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
25b0: 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65  .isInit ){.#ifde
25c0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53  f SQLITE_EXTRA_S
25d0: 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64  HUTDOWN.    void
25e0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48   SQLITE_EXTRA_SH
25f0: 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20  UTDOWN(void);.  
2600: 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53    SQLITE_EXTRA_S
2610: 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69  HUTDOWN();.#endi
2620: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73  f.    sqlite3_os
2630: 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  _end();.    sqli
2640: 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65  te3_reset_auto_e
2650: 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20  xtension();.    
2660: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2670: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  fig.isInit = 0;.
2680: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
2690: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
26a0: 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20  PCacheInit ){.  
26b0: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
26c0: 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73  hutdown();.    s
26d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
26e0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
26f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2700: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2710: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2720: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
2730: 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73  llocEnd();.    s
2740: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2750: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2760: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2770: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2780: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29  ig.isMutexInit )
2790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74  {.    sqlite3Mut
27a0: 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  exEnd();.    sql
27b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27c0: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30  .isMutexInit = 0
27d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
27e0: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68  heap subsystem h
27f0: 61 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74  as now been shut
2800: 64 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76  down and these v
2810: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
2820: 65 64 0a 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55  ed.  ** to be NU
2830: 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d  LL or point to m
2840: 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f  emory that was o
2850: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2860: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20  ite3_malloc(),. 
2870: 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
2880: 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61  rely on that hea
2890: 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65  p subsystem; the
28a0: 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72  refore, make sur
28b0: 65 20 74 68 65 73 65 0a 20 20 2a 2a 20 76 61 6c  e these.  ** val
28c0: 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72  ues cannot refer
28d0: 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20   to heap memory 
28e0: 74 68 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e  that was just in
28f0: 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74  validated when t
2900: 68 65 0a 20 20 2a 2a 20 68 65 61 70 20 73 75 62  he.  ** heap sub
2910: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2920: 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  own..  */.  sqli
2930: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2940: 72 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ry = 0;.  sqlite
2950: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
2960: 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
2970: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2980: 0a 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c  .** This API all
2990: 6f 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ows applications
29a0: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67   to modify the g
29b0: 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  lobal configurat
29c0: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51  ion of.** the SQ
29d0: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 74 20  Lite library at 
29e0: 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  run-time..**.** 
29f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
2a00: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2a10: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
2a20: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
2a30: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2a40: 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f  nections or memo
2a50: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20  ry allocations. 
2a60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2a70: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61   not.** threadsa
2a80: 66 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20  fe.  Failure to 
2a90: 68 65 65 64 20 74 68 65 73 65 20 77 61 72 6e 69  heed these warni
2aa0: 6e 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  ngs can lead to 
2ab0: 75 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a  unpredictable.**
2ac0: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
2ad0: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  t sqlite3_config
2ae0: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
2af0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
2b00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b10: 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  K;..  /* sqlite3
2b20: 5f 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20  _config() shall 
2b30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
2b40: 53 55 53 45 20 69 66 20 69 74 20 69 73 20 69 6e  SUSE if it is in
2b50: 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a  voked while.  **
2b60: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
2b70: 61 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a  ary is in use. *
2b80: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  /.  if( sqlite3G
2b90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
2ba0: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
2bb0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
2bc0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2bd0: 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
2be0: 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74  p ){..    /* Mut
2bf0: 65 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ex configuration
2c00: 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c   options are onl
2c10: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  y available in a
2c20: 20 74 68 72 65 61 64 73 61 66 65 0a 20 20 20 20   threadsafe.    
2c30: 2a 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a 20 20 20  ** compile. .   
2c40: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2c50: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2c60: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
2c70: 45 41 44 53 41 46 45 3e 30 0a 20 20 20 20 63 61  EADSAFE>0.    ca
2c80: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2c90: 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b  _SINGLETHREAD: {
2ca0: 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c  .      /* Disabl
2cb0: 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a  e all mutexing *
2cc0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2cd0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
2ce0: 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20  eMutex = 0;.    
2cf0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2d00: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
2d10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
2d20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2d30: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2d40: 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20  MULTITHREAD: {. 
2d50: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2d60: 6d 75 74 65 78 69 6e 67 20 6f 66 20 64 61 74 61  mutexing of data
2d70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2d80: 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61   */.      /* Ena
2d90: 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20  ble mutexing of 
2da0: 63 6f 72 65 20 64 61 74 61 20 73 74 72 75 63 74  core data struct
2db0: 75 72 65 73 20 2a 2f 0a 20 20 20 20 20 20 73 71  ures */.      sq
2dc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2dd0: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31  g.bCoreMutex = 1
2de0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
2df0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
2e00: 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20  lMutex = 0;.    
2e10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2e20: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2e30: 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44  ONFIG_SERIALIZED
2e40: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
2e50: 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67  ble all mutexing
2e60: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2e70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
2e80: 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20  oreMutex = 1;.  
2e90: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2ea0: 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
2eb0: 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  ex = 1;.      br
2ec0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2ed0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2ee0: 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20  G_MUTEX: {.     
2ef0: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
2f00: 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78  lternative mutex
2f10: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2f20: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2f30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
2f40: 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c  ex = *va_arg(ap,
2f50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
2f60: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
2f70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2f80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2f90: 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a  FIG_GETMUTEX: {.
2fa0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
2fb0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75  e the current mu
2fc0: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
2fd0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f  on */.      *va_
2fe0: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
2ff0: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20  mutex_methods*) 
3000: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3010: 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20  onfig.mutex;.   
3020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3030: 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 63 61 73  #endif...    cas
3040: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3050: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
3060: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
3070: 74 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63  ternative malloc
3080: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3090: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
30a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
30b0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
30c0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
30d0: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
30e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
30f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
3100: 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  TMALLOC: {.     
3110: 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65   /* Retrieve the
3120: 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28   current malloc(
3130: 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ) implementation
3140: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
3150: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3160: 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29  g.m.xMalloc==0 )
3170: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
3180: 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a  fault();.      *
3190: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
31a0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29  e3_mem_methods*)
31b0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
31c0: 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20  Config.m;.      
31d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
31e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
31f0: 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b  FIG_MEMSTATUS: {
3200: 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  .      /* Enable
3210: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
3220: 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73 20 63 6f  malloc status co
3230: 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  llection */.    
3240: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3250: 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d  onfig.bMemstat =
3260: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3270: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3280: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3290: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41  LITE_CONFIG_SCRA
32a0: 54 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TCH: {.      /* 
32b0: 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66  Designate a buff
32c0: 65 72 20 66 6f 72 20 73 63 72 61 74 63 68 20 6d  er for scratch m
32d0: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
32e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
32f0: 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63  alConfig.pScratc
3300: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  h = va_arg(ap, v
3310: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3320: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3330: 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f  .szScratch = va_
3340: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3350: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3360: 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68  lConfig.nScratch
3370: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3380: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3390: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
33a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41  SQLITE_CONFIG_PA
33b0: 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20  GECACHE: {.     
33c0: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
33d0: 62 75 66 66 65 72 20 66 6f 72 20 70 61 67 65 20  buffer for page 
33e0: 63 61 63 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  cache memory spa
33f0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
3400: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3410: 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  pPage = va_arg(a
3420: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
3430: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3440: 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61  nfig.szPage = va
3450: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3460: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3470: 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d  alConfig.nPage =
3480: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3490: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
34a0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
34b0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
34c0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
34d0: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
34e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
34f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3500: 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a  IG_GETPCACHE: {.
3510: 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20        /* now an 
3520: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
3530: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
3540: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3550: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
3560: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
3570: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
3580: 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65   Specify an alte
3590: 72 6e 61 74 69 76 65 20 70 61 67 65 20 63 61 63  rnative page cac
35a0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
35b0: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
35c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
35d0: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
35e0: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
35f0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
3600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3610: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3620: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
3630: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 69 66  CHE2: {.      if
3640: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3650: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
3660: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
3670: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
3680: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
3690: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
36a0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
36b0: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
36c0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
36d0: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
36e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
36f0: 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
3700: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3710: 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65  MSYS3) || define
3720: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
3730: 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73  MEMSYS5).    cas
3740: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3750: 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  HEAP: {.      /*
3760: 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66   Designate a buf
3770: 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d 65 6d  fer for heap mem
3780: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
3790: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
37a0: 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76  Config.pHeap = v
37b0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
37c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
37d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
37e0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
37f0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3800: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3810: 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70  nReq = va_arg(ap
3820: 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69  , int);..      i
3830: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3840: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29  Config.mnReq<1 )
3850: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3860: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3870: 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Req = 1;.      }
3880: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
3890: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
38a0: 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20  eq>(1<<12) ){.  
38b0: 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e        /* cap min
38c0: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61 74   request size at
38d0: 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20   2^12 */.       
38e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
38f0: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c  nfig.mnReq = (1<
3900: 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  <12);.      }.. 
3910: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3920: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
3930: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
3940: 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61 70 20   /* If the heap 
3950: 70 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c  pointer is NULL,
3960: 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
3970: 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65  e malloc impleme
3980: 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  ntation.        
3990: 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c 20  ** back to NULL 
39a0: 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20 54  pointers too.  T
39b0: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
39c0: 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a  he malloc to go.
39d0: 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20          ** back 
39e0: 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 69  to its default i
39f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68  mplementation wh
3a00: 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  en sqlite3_initi
3a10: 61 6c 69 7a 65 28 29 20 69 73 0a 20 20 20 20 20  alize() is.     
3a20: 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20 20     ** run..     
3a30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
3a40: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f  mset(&sqlite3Glo
3a50: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20  balConfig.m, 0, 
3a60: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
3a70: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a  obalConfig.m));.
3a80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3a90: 20 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70       /* The heap
3aa0: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
3ab0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74 61  NULL, then insta
3ac0: 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20  ll one of the.  
3ad0: 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f        ** mem5.c/
3ae0: 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e 20  mem3.c methods. 
3af0: 49 66 20 6e 65 69 74 68 65 72 20 45 4e 41 42 4c  If neither ENABL
3b00: 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20 20  E_MEMSYS3 nor.  
3b10: 20 20 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45 5f        ** ENABLE_
3b20: 4d 45 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e  MEMSYS5 is defin
3b30: 65 64 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ed, return an er
3b40: 72 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ror..        */.
3b50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3b60: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20  ABLE_MEMSYS3.   
3b70: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3b80: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71  alConfig.m = *sq
3b90: 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79  lite3MemGetMemsy
3ba0: 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  s3();.#endif.#if
3bb0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3bc0: 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20  E_MEMSYS5.      
3bd0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3be0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
3bf0: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28  e3MemGetMemsys5(
3c00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
3c10: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3c20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
3c30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3c40: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
3c50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3c60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
3c70: 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28  kaside = va_arg(
3c80: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3c90: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3ca0: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  fig.nLookaside =
3cb0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3cc0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3cd0: 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a     }.    .    /*
3ce0: 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65   Record a pointe
3cf0: 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20  r to the logger 
3d00: 66 75 6e 63 63 74 69 6f 6e 20 61 6e 64 20 69 74  funcction and it
3d10: 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  s first argument
3d20: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66  ..    ** The def
3d30: 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c  ault is NULL.  L
3d40: 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c  ogging is disabl
3d50: 65 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ed if the functi
3d60: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20  on pointer is.  
3d70: 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a    ** NULL..    *
3d80: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
3d90: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a  E_CONFIG_LOG: {.
3da0: 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
3db0: 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
3dc0: 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
3dd0: 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
3de0: 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
3df0: 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
3e00: 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
3e10: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
3e20: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d  balConfig.xLog =
3e30: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3e40: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  (*)(void*,int,co
3e50: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
3e60: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
3e70: 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e  def void(*LOGFUN
3e80: 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  C_t)(void*,int,c
3e90: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
3ea0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3eb0: 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61  Config.xLog = va
3ec0: 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43  _arg(ap, LOGFUNC
3ed0: 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _t);.      sqlit
3ee0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3ef0: 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  LogArg = va_arg(
3f00: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
3f10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3f20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3f30: 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20  CONFIG_URI: {.  
3f40: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3f50: 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
3f60: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3f70: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3f80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
3f90: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
3fa0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
3fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3fc0: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
3fd0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
3fe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
3ff0: 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  p the lookaside 
4000: 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61  buffers for a da
4010: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4020: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  n..** Return SQL
4030: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
4040: 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61  s.  .** If looka
4050: 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20  side is already 
4060: 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53  active, return S
4070: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a  QLITE_BUSY..**.*
4080: 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74  * The sz paramet
4090: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
40a0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63   of bytes in eac
40b0: 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  h lookaside slot
40c0: 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72  ..** The cnt par
40d0: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75  ameter is the nu
40e0: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20  mber of slots.  
40f0: 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c  If pStart is NUL
4100: 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66  L the.** space f
4110: 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  or the lookaside
4120: 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69   memory is obtai
4130: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
4140: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66  _malloc()..** If
4150: 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e   pStart is not N
4160: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73  ULL then it is s
4170: 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d  z*cnt bytes of m
4180: 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72  emory to use for
4190: 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  .** the lookasid
41a0: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
41b0: 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f  tic int setupLoo
41c0: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
41d0: 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  db, void *pBuf, 
41e0: 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29  int sz, int cnt)
41f0: 7b 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74  {.  void *pStart
4200: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  ;.  if( db->look
4210: 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20  aside.nOut ){.  
4220: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4230: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46  BUSY;.  }.  /* F
4240: 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ree any existing
4250: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
4260: 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c  r for this handl
4270: 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c  e before.  ** al
4280: 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f  locating a new o
4290: 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68  ne so we don't h
42a0: 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61 63  ave to have spac
42b0: 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68  e for .  ** both
42c0: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
42d0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  e..  */.  if( db
42e0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
42f0: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
4300: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
4310: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
4320: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69  .  }.  /* The si
4330: 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64  ze of a lookasid
4340: 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55  e slot after ROU
4350: 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f  NDDOWN8 needs to
4360: 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20   be larger.  ** 
4370: 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  than a pointer t
4380: 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a  o be useful..  *
4390: 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f  /.  sz = ROUNDDO
43a0: 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50  WN8(sz);  /* IMP
43b0: 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20  : R-33038-09382 
43c0: 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e  */.  if( sz<=(in
43d0: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
43e0: 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20  deSlot*) ) sz = 
43f0: 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29  0;.  if( cnt<0 )
4400: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
4410: 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20  sz==0 || cnt==0 
4420: 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  ){.    sz = 0;. 
4430: 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20     pStart = 0;. 
4440: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d   }else if( pBuf=
4450: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4460: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
4470: 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74  oc();.    pStart
4480: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
4490: 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20  ( sz*cnt );  /* 
44a0: 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37  IMP: R-61949-357
44b0: 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  27 */.    sqlite
44c0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
44d0: 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61  ();.    if( pSta
44e0: 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74  rt ) cnt = sqlit
44f0: 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74  e3MallocSize(pSt
4500: 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65  art)/sz;.  }else
4510: 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70  {.    pStart = p
4520: 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c  Buf;.  }.  db->l
4530: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
4540: 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e  = pStart;.  db->
4550: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
4560: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  = 0;.  db->looka
4570: 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73  side.sz = (u16)s
4580: 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74 20  z;.  if( pStart 
4590: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
45a0: 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20    LookasideSlot 
45b0: 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  *p;.    assert( 
45c0: 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66  sz > (int)sizeof
45d0: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
45e0: 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f   );.    p = (Loo
45f0: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61  kasideSlot*)pSta
4600: 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e  rt;.    for(i=cn
4610: 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  t-1; i>=0; i--){
4620: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
4630: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
4640: 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d  pFree;.      db-
4650: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
4660: 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20   = p;.      p = 
4670: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
4680: 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20  &((u8*)p)[sz];. 
4690: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f     }.    db->loo
46a0: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b  kaside.pEnd = p;
46b0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
46c0: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b  de.bEnabled = 1;
46d0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
46e0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70  de.bMalloced = p
46f0: 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d  Buf==0 ?1:0;.  }
4700: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f  else{.    db->lo
4710: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 30  okaside.pEnd = 0
4720: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
4730: 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30  ide.bEnabled = 0
4740: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
4750: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
4760: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
4770: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4780: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
4790: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  utex associated 
47a0: 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
47b0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
47c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71  qlite3_mutex *sq
47d0: 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73  lite3_db_mutex(s
47e0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
47f0: 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b  eturn db->mutex;
4800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75  .}../*.** Free u
4810: 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  p as much memory
4820: 20 61 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20   as we can from 
4830: 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
4840: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
4850: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4860: 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
4870: 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ry(sqlite3 *db){
4880: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
4890: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
48a0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
48b0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
48c0: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
48d0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
48e0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
48f0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
4900: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
4910: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20   ){.      Pager 
4920: 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65  *pPager = sqlite
4930: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
4940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
4950: 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65  agerShrink(pPage
4960: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
4970: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
4980: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
4990: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
49a0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
49b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
49c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
49d0: 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20  ration settings 
49e0: 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61  for an individua
49f0: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
4a00: 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ction.*/.int sql
4a10: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73  ite3_db_config(s
4a20: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4a30: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
4a40: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
4a50: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
4a60: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
4a70: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
4a80: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c  QLITE_DBCONFIG_L
4a90: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
4aa0: 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76    void *pBuf = v
4ab0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4ac0: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33  ; /* IMP: R-2683
4ad0: 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20  5-10964 */.     
4ae0: 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
4af0: 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20  (ap, int);      
4b00: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31   /* IMP: R-47871
4b10: 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20  -25994 */.      
4b20: 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67  int cnt = va_arg
4b30: 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20  (ap, int);      
4b40: 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d  /* IMP: R-04460-
4b50: 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72  53386 */.      r
4b60: 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  c = setupLookasi
4b70: 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c  de(db, pBuf, sz,
4b80: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   cnt);.      bre
4b90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
4ba0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
4bb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
4bc0: 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ct {.        int
4bd0: 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65   op;      /* The
4be0: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   opcode */.     
4bf0: 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20     u32 mask;    
4c00: 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62  /* Mask of the b
4c10: 69 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c  it in sqlite3.fl
4c20: 61 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72  ags to set/clear
4c30: 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61   */.      } aFla
4c40: 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  gOp[] = {.      
4c50: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
4c60: 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c  FIG_ENABLE_FKEY,
4c70: 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69      SQLITE_Forei
4c80: 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20  gnKeys    },.   
4c90: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
4ca0: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
4cb0: 49 47 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e  IGGER, SQLITE_En
4cc0: 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a  ableTrigger  },.
4cd0: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75        };.      u
4ce0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4cf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4d00: 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20  _ERROR; /* IMP: 
4d10: 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f  R-42790-23372 */
4d20: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4d30: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61  i<ArraySize(aFla
4d40: 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gOp); i++){.    
4d50: 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b      if( aFlagOp[
4d60: 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20  i].op==op ){.   
4d70: 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66         int onoff
4d80: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4d90: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  t);.          in
4da0: 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67  t *pRes = va_arg
4db0: 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
4dc0: 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61        int oldFla
4dd0: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
4de0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e            if( on
4df0: 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  off>0 ){.       
4e00: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
4e10: 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73  = aFlagOp[i].mas
4e20: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
4e30: 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20  se if( onoff==0 
4e40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ){.            d
4e50: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c  b->flags &= ~aFl
4e60: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
4e70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4e80: 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73      if( oldFlags
4e90: 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20  !=db->flags ){. 
4ea0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
4eb0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
4ec0: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
4ed0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4ee0: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
4ef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
4f00: 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  Res = (db->flags
4f10: 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61   & aFlagOp[i].ma
4f20: 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  sk)!=0;.        
4f30: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
4f40: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4f50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4f60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4f70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4f80: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
4f90: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
4fa0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
4fb0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
4fc0: 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d  buffer z[0..n-1]
4fd0: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70   contains all sp
4fe0: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
4ff0: 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f  int allSpaces(co
5000: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
5010: 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e   n){.  while( n>
5020: 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27  0 && z[n-1]==' '
5030: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74   ){ n--; }.  ret
5040: 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn n==0;.}../*.
5050: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
5060: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
5070: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
5080: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
5090: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
50a0: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
50b0: 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75  the padFlag argu
50c0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
50d0: 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64   then space padd
50e0: 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  ing at the end.*
50f0: 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20  * of strings is 
5100: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
5110: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54  mplements the RT
5120: 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  RIM collation..*
5130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e  /.static int bin
5140: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
5150: 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74   *padFlag,.  int
5160: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
5170: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
5180: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
5190: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
51a0: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
51b0: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
51c0: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72  ey1 : nKey2;.  r
51d0: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
51e0: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
51f0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
5200: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
5210: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
5220: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
5230: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
5240: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
5250: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
5260: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
5270: 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75     /* Leave rc u
5280: 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f  nchanged at 0 */
5290: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
52a0: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
52b0: 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key2;.    }.  }.
52c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
52d0: 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75  /*.** Another bu
52e0: 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
52f0: 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53   sequence: NOCAS
5300: 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  E. .**.** This c
5310: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
5320: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
5330: 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61   be used for "ca
5340: 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a  se independant.*
5350: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53  * comparison". S
5360: 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67  QLite's knowledg
5370: 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c  e of upper and l
5380: 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61  ower case equiva
5390: 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73  lents.** extends
53a0: 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20   only to the 26 
53b0: 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  characters used 
53c0: 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c  in the English l
53d0: 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  anguage..**.** A
53e0: 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65  t the moment the
53f0: 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46  re is only a UTF
5400: 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  -8 implementatio
5410: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
5420: 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
5430: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
5440: 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
5450: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
5460: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
5470: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
5480: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
5490: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43   = sqlite3StrNIC
54a0: 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74  mp(.      (const
54b0: 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28   char *)pKey1, (
54c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
54d0: 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32  y2, (nKey1<nKey2
54e0: 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a  )?nKey1:nKey2);.
54f0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
5500: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  ER(NotUsed);.  i
5510: 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72  f( 0==r ){.    r
5520: 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a   = nKey1-nKey2;.
5530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
5540: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5550: 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65  the ROWID of the
5560: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
5570: 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e  ert.*/.sqlite_in
5580: 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  t64 sqlite3_last
5590: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71  _insert_rowid(sq
55a0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
55b0: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
55c0: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  id;.}../*.** Ret
55d0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
55e0: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
55f0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
5600: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
5610: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
5620: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
5630: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
5640: 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a  rn db->nChange;.
5650: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5660: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
5670: 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  anges since the 
5680: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
5690: 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69  was opened..*/.i
56a0: 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  nt sqlite3_total
56b0: 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  _changes(sqlite3
56c0: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
56d0: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
56e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
56f0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
5700: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
5710: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
5720: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
5730: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
5740: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
5750: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
5760: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
5770: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
5780: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
5790: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
57a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
57b0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
57c0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
57d0: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
57e0: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
57f0: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
5800: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
5810: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
5820: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
5830: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5840: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
5850: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
5860: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
5870: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
5880: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
5890: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
58a0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
58b0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
58c0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
58d0: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
58e0: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
58f0: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
5900: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
5910: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
5920: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
5930: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
5940: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
5950: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
5960: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
5970: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
5980: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
5990: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
59a0: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
59b0: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
59c0: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
59d0: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
59e0: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
59f0: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
5a00: 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63  or = p->pDestruc
5a10: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
5a20: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
5a30: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
5a40: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
5a50: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
5a60: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
5a70: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
5a80: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
5a90: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
5aa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5ab0: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
5ac0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
5ad0: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
5ae0: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
5af0: 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  se.*/.int sqlite
5b00: 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  3_close(sqlite3 
5b10: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
5b20: 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   *i;            
5b30: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
5b40: 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a  table iterator *
5b50: 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66  /.  int j;..  if
5b60: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
5b70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
5b80: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
5b90: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
5ba0: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
5bb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
5bc0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
5bd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5be0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
5bf0: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 65  ..  /* Force xDe
5c00: 73 74 72 6f 79 20 63 61 6c 6c 73 20 6f 6e 20 61  stroy calls on a
5c10: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
5c20: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 65  s */.  sqlite3Re
5c30: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
5c40: 61 28 64 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a  a(db, -1);..  /*
5c50: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
5c60: 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 52  n is open, the R
5c70: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
5c80: 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a  ma() call above.
5c90: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61    ** will not ha
5ca0: 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44  ve called the xD
5cb0: 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68  isconnect() meth
5cc0: 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61  od on any virtua
5cd0: 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e  l.  ** tables in
5ce0: 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73   the db->aVTrans
5cf0: 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f  [] array. The fo
5d00: 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56  llowing sqlite3V
5d10: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20  tabRollback().  
5d20: 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20  ** call will do 
5d30: 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64  so. We need to d
5d40: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68  o this before th
5d50: 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69  e check for acti
5d60: 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ve.  ** SQL stat
5d70: 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73  ements below, as
5d80: 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70   the v-table imp
5d90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
5da0: 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20  be storing.  ** 
5db0: 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74  some prepared st
5dc0: 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61  atements interna
5dd0: 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  lly..  */.  sqli
5de0: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
5df0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
5e00: 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73  ere are any outs
5e10: 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72 65 74  tanding VMs, ret
5e20: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
5e30: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   */.  if( db->pV
5e40: 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dbe ){.    sqlit
5e50: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
5e60: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
5e70: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f    "unable to clo
5e80: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
5e90: 6c 69 73 65 64 20 73 74 61 74 65 6d 65 6e 74 73  lised statements
5ea0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
5eb0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
5ec0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
5ed0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5ee0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
5ef0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
5f00: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 3b 0a  SickOrOk(db) );.
5f10: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
5f20: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
5f30: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
5f40: 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20  ->aDb[j].pBt;.  
5f50: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
5f60: 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63  ite3BtreeIsInBac
5f70: 6b 75 70 28 70 42 74 29 20 29 7b 0a 20 20 20 20  kup(pBt) ){.    
5f80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
5f90: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
5fa0: 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 62  .          "unab
5fb0: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
5fc0: 74 6f 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  to unfinished ba
5fd0: 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 22 29  ckup operation")
5fe0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5ff0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
6000: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 72 65  mutex);.      re
6010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
6020: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
6030: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
6040: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
6050: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
6060: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
6070: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
6080: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
6090: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73  nDb; j++){.    s
60a0: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
60b0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20  &db->aDb[j];.   
60c0: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b   if( pDb->pBt ){
60d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
60e0: 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42  reeClose(pDb->pB
60f0: 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  t);.      pDb->p
6100: 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  Bt = 0;.      if
6110: 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( j!=1 ){.      
6120: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d    pDb->pSchema =
6130: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6140: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
6150: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
6160: 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f  ma(db, -1);..  /
6170: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20  * Tell the code 
6180: 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74  in notify.c that
6190: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
61a0: 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20  no longer holds 
61b0: 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61  any.  ** locks a
61c0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  nd does not requ
61d0: 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20  ire any further 
61e0: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
61f0: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
6200: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
6210: 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20  nClosed(db);..  
6220: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
6230: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
6240: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
6250: 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72 28  Static );.  for(
6260: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
6270: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
6280: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
6290: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
62a0: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
62b0: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
62c0: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
62d0: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
62e0: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
62f0: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
6300: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
6310: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
6320: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
6330: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
6340: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
6350: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
6360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6370: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
6380: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
6390: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
63a0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
63b0: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
63c0: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
63d0: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
63e0: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
63f0: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
6400: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
6410: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
6420: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
6430: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
6440: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
6450: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
6460: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
6470: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
6480: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
6490: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
64a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
64b0: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
64c0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
64d0: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
64e0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
64f0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6500: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
6510: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
6520: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
6530: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
6540: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
6550: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
6560: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
6570: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
6580: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
6590: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
65a0: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
65b0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
65c0: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
65d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
65e0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
65f0: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
6600: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
6610: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
6620: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
6630: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
6640: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
6650: 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a  if( db->pErr ){.
6660: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
6670: 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Free(db->pErr);.
6680: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f    }.  sqlite3Clo
6690: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
66a0: 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
66b0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
66c0: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
66d0: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
66e0: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
66f0: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
6700: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
6710: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
6720: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
6730: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
6740: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
6750: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
6760: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
6770: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
6780: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
6790: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
67a0: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
67b0: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
67c0: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
67d0: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
67e0: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
67f0: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
6800: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
6810: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
6820: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
6830: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6840: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6850: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
6860: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
6870: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
6880: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
6890: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
68a0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
68b0: 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69  ut==0 );  /* Fai
68c0: 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64  ls on a lookasid
68d0: 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f  e memory leak */
68e0: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
68f0: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6910: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6920: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6930: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
6940: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6950: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6960: 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61  ollback all data
6970: 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20  base files.  If 
6980: 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
6990: 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a  SQLITE_OK, then.
69a0: 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  ** any open curs
69b0: 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
69c0: 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d  ted ("tripped" -
69d0: 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67   as in "tripping
69e0: 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72   a circuit.** br
69f0: 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65  eaker") and made
6a00: 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43   to return tripC
6a10: 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65  ode if there are
6a20: 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20   any further.** 
6a30: 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20  attempts to use 
6a40: 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  that cursor..*/.
6a50: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
6a60: 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20  backAll(sqlite3 
6a70: 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64  *db, int tripCod
6a80: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
6a90: 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a  nt inTrans = 0;.
6aa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6ab0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
6ac0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
6ad0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
6ae0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69  alloc();.  for(i
6af0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6b00: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
6b10: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
6b20: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  Bt;.    if( p ){
6b30: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6b40: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
6b50: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  (p) ){.        i
6b60: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
6b70: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
6b80: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
6b90: 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 20  , tripCode);.   
6ba0: 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e     db->aDb[i].in
6bb0: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Trans = 0;.    }
6bc0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
6bd0: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
6be0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
6bf0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69  gnMalloc();..  i
6c00: 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  f( db->flags&SQL
6c10: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
6c20: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
6c30: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
6c40: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
6c50: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
6c60: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
6c70: 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
6c80: 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e  Any deferred con
6c90: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
6ca0: 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  ns have now been
6cb0: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
6cc0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
6cd0: 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  s = 0;..  /* If 
6ce0: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
6cf0: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
6d00: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
6d10: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
6d20: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
6d30: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
6d40: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
6d50: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
6d60: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
6d70: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
6d80: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
6d90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
6da0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
6db0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
6dc0: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
6dd0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
6de0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
6df0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
6e00: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
6e10: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
6e20: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
6e30: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
6e40: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
6e50: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
6e60: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
6e70: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
6e80: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
6e90: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
6ea0: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
6eb0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
6ec0: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
6ed0: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
6ee0: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
6ef0: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
6f00: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6f10: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
6f20: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
6f30: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
6f40: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6f50: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
6f60: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
6f70: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
6f80: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
6f90: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
6fa0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
6fb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
6fc0: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
6fd0: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
6fe0: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
6ff0: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
7000: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
7010: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
7020: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
7030: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
7040: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
7050: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
7060: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
7070: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
7080: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
7090: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
70a0: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
70b0: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
70c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
70d0: 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f  UND    */ "unkno
70e0: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20  wn operation",. 
70f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
7100: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
7110: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
7120: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
7130: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
7140: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
7150: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
7160: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
7170: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
7180: 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  / "locking proto
7190: 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  col",.    /* SQL
71a0: 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20  ITE_EMPTY       
71b0: 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69  */ "table contai
71c0: 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20  ns no data",.   
71d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
71e0: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
71f0: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
7200: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
7210: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
7220: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
7230: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
7240: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
7250: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
7260: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
7270: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
7280: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
7290: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
72a0: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
72b0: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
72c0: 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e   "library routin
72d0: 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20  e called out of 
72e0: 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f  sequence",.    /
72f0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
7300: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
7310: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
7320: 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a  isabled",.    /*
7330: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
7340: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
7350: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
7360: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
7370: 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78  MAT      */ "aux
7380: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
7390: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20  format error",. 
73a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
73b0: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e  GE       */ "bin
73c0: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
73d0: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
73e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
73f0: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
7400: 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
7410: 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
7420: 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  abase",.  };.  c
7430: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
7440: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
7450: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
7460: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
7470: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
7480: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
7490: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
74a0: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
74b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
74c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
74d0: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
74e0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
74f0: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
7500: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
7510: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
7520: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
7530: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
7540: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7550: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7560: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
7570: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
7580: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
7590: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
75a0: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
75b0: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
75c0: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
75d0: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
75e0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
75f0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
7600: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
7610: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
7620: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
7630: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
7640: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
7650: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
7660: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
7680: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
7690: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
76b0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
76c0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
76d0: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
76e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
76f0: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
7700: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
7710: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
7720: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
7730: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
7740: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
7750: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
7760: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
7770: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
7780: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
7790: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
77a0: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
77b0: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
77c0: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
77d0: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
77e0: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
77f0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
7800: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
7810: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
7820: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
7830: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
7840: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
7850: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
7860: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
7870: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
7880: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
7890: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
78a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
78b0: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
78c0: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
78d0: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
78e0: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
78f0: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
7900: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
7910: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
7920: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
7930: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
7940: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
7950: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7960: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
7970: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
7980: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
7990: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
79a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
79b0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
79c0: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
79d0: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
79e0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
79f0: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
7a00: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
7a10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7a20: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
7a30: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
7a40: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
7a50: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
7a60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
7a70: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
7a80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7a90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
7aa0: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
7ab0: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
7ac0: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
7ad0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
7ae0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
7af0: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
7b00: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
7b10: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
7b20: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
7b30: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
7b40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7b50: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
7b60: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
7b70: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7b80: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
7b90: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
7ba0: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
7bb0: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
7bc0: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
7bd0: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
7be0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
7bf0: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
7c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
7c10: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
7c20: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
7c30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
7c40: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
7c50: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
7c60: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
7c70: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
7c80: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
7c90: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
7ca0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
7cb0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
7cc0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
7cd0: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
7ce0: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
7cf0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
7d00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7d10: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
7d20: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
7d30: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
7d40: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
7d50: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
7d60: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
7d70: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
7d80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7d90: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7da0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7db0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
7dc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
7dd0: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
7de0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7df0: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
7e00: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
7e10: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
7e20: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
7e30: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
7e40: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
7e50: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
7e60: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
7e70: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
7e80: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
7e90: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
7ea0: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
7eb0: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
7ec0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
7ed0: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
7ee0: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
7ef0: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
7f00: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
7f10: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7f20: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
7f30: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
7f40: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
7f50: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
7f60: 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73  ogressOps = nOps
7f70: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
7f80: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
7f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
7fa0: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
7fb0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
7fc0: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
7fd0: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
7fe0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
7ff0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8000: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
8010: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
8020: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
8030: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
8040: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
8050: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
8060: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
8070: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
8080: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
8090: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
80a0: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
80b0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
80c0: 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29  s){.  if( ms>0 )
80d0: 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  {.    db->busyTi
80e0: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20  meout = ms;.    
80f0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
8100: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
8110: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
8120: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
8130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8140: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
8150: 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  r(db, 0, 0);.  }
8160: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8170: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  _OK;.}../*.** Ca
8180: 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  use any pending 
8190: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f  operation to sto
81a0: 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73  p at its earlies
81b0: 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a  t opportunity..*
81c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69  /.void sqlite3_i
81d0: 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33  nterrupt(sqlite3
81e0: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e   *db){.  db->u1.
81f0: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
8200: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
8210: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
8220: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
8230: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
8240: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
8250: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
8260: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
8270: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
8280: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
8290: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
82a0: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
82b0: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
82c0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
82d0: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
82e0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
82f0: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
8300: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
8310: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
8320: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
8330: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
8340: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8350: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
8360: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
8370: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
8380: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
8390: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
83a0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
83b0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
83c0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
83d0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
83e0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
83f0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
8400: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
8410: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e  context*),.  Fun
8420: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
8430: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
8440: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
8450: 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74  nName;..  assert
8460: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8470: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
8480: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69  );.  if( zFuncti
8490: 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20  onName==0 ||.   
84a0: 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78 46     (xFunc && (xF
84b0: 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20  inal || xStep)) 
84c0: 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e  || .      (!xFun
84d0: 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20  c && (xFinal && 
84e0: 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20  !xStep)) ||.    
84f0: 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21 78    (!xFunc && (!x
8500: 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29  Final && xStep))
8510: 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c   ||.      (nArg<
8520: 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54  -1 || nArg>SQLIT
8530: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
8540: 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35  RG) ||.      (25
8550: 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  5<(nName = sqlit
8560: 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e  e3Strlen30( zFun
8570: 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a  ctionName))) ){.
8580: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8590: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
85a0: 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51   }.  .#ifndef SQ
85b0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
85c0: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
85d0: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
85e0: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
85f0: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
8600: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
8610: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
8620: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
8630: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
8640: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
8650: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
8660: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
8670: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
8680: 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  lly..  **.  ** I
8690: 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20  f SQLITE_ANY is 
86a0: 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74  specified, add t
86b0: 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
86c0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   the function.  
86d0: 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74  ** to the hash t
86e0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
86f0: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
8700: 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20  16 ){.    enc = 
8710: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
8720: 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  VE;.  }else if( 
8730: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20  enc==SQLITE_ANY 
8740: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
8750: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
8760: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
8770: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
8780: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
8790: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
87a0: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
87b0: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
87c0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
87d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
87e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
87f0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
8800: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
8810: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
8820: 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  F16LE,.         
8830: 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e   pUserData, xFun
8840: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
8850: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
8860: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
8870: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8880: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8890: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
88a0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
88b0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
88c0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
88d0: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
88e0: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
88f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
8900: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
8910: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
8920: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
8930: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
8940: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
8950: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
8960: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
8970: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
8980: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
8990: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
89a0: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
89b0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
89c0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
89d0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
89e0: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
89f0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
8a00: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
8a10: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
8a20: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
8a30: 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30  nArg, (u8)enc, 0
8a40: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
8a50: 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26  >iPrefEnc==enc &
8a60: 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20  & p->nArg==nArg 
8a70: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
8a80: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a  ctiveVdbeCnt ){.
8a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8aa0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
8ab0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
8ac0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
8ad0: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
8ae0: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
8af0: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
8b00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
8b10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8b20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8b30: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
8b40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8b50: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
8b60: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
8b70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8b80: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
8b90: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
8ba0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
8bb0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
8bc0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
8bd0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
8be0: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
8bf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8c00: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
8c10: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
8c20: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
8c30: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
8c40: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
8c50: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
8c60: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
8c70: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
8c80: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
8c90: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
8ca0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
8cb0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
8cc0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
8cd0: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
8ce0: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
8cf0: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
8d00: 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30  ;.  p->flags = 0
8d10: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
8d20: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
8d30: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
8d40: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
8d50: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
8d60: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
8d70: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
8d80: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
8d90: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8da0: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
8db0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
8dc0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
8dd0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
8de0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
8df0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
8e00: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
8e10: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
8e20: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
8e30: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
8e40: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
8e50: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
8e60: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
8e70: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
8e80: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
8e90: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
8ea0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
8eb0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
8ec0: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
8ed0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
8ee0: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
8ef0: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
8f00: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
8f30: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
8f40: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8f50: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
8f60: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
8f70: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
8f80: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
8f90: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
8fa0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
8fb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8fc0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8fd0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
8fe0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
8ff0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
9000: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
9010: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
9020: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
9030: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
9040: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
9050: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9060: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
9070: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
9080: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
9090: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
90a0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
90b0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
90c0: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
90d0: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
90e0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
90f0: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
9100: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
9110: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
9120: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
9130: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
9140: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
9150: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
9160: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
9170: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
9180: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
9190: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
91a0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
91b0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
91c0: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
91d0: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
91e0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
91f0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
9200: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
9210: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
9220: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9230: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
9240: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
9250: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
9260: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9270: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9280: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9290: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
92a0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
92b0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
92c0: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
92d0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
92e0: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
92f0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
9300: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
9310: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
9320: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
9330: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
9340: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
9350: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
9360: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
9370: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
9380: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
9390: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
93a0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
93b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
93c0: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
93d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
93e0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
93f0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
9400: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
9410: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
9420: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
9430: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
9440: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
9450: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
9460: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
9470: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
9480: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
9490: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
94a0: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
94b0: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
94c0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
94d0: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
94e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
94f0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9500: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
9510: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9520: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
9530: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
9540: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
9550: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
9560: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
9570: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
9580: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
9590: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
95a0: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
95b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
95c0: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
95d0: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
95e0: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
95f0: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
9600: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
9610: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
9620: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
9630: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
9640: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
9650: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
9660: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
9670: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
9680: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
9690: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
96a0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
96b0: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
96c0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
96d0: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
96e0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
96f0: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
9700: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
9710: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
9720: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
9730: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
9740: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
9750: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
9760: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
9770: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
9780: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9790: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
97a0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
97b0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
97c0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
97d0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
97e0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
97f0: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
9800: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9810: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
9820: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
9830: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
9860: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
9870: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
9880: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
9890: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
98a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
98b0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
98c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
98d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
98e0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
98f0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
9900: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
9910: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
9920: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
9930: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
9940: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
9950: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
9960: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
9970: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
9980: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
9990: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
99a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
99b0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
99c0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
99d0: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
99e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
99f0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
9a00: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
9a10: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
9a20: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
9a30: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
9a40: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
9a50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9a60: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
9a70: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
9a80: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
9a90: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
9aa0: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
9ab0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
9ac0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9ad0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9ae0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
9af0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
9b00: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
9b10: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
9b20: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
9b30: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
9b40: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
9b50: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
9b60: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
9b70: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
9b80: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
9b90: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
9ba0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
9bb0: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
9bc0: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
9bd0: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
9be0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
9bf0: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
9c00: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
9c10: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
9c20: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
9c30: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
9c40: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
9c50: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
9c60: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
9c70: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
9c80: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
9c90: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
9ca0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
9cb0: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
9cc0: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
9cd0: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
9ce0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
9cf0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
9d00: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
9d10: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
9d20: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
9d30: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
9d40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
9d50: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
9d60: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
9d70: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
9d80: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
9d90: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
9da0: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
9db0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
9dc0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
9dd0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
9de0: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
9df0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
9e00: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
9e10: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e30: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
9e40: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
9e50: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
9e60: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
9e70: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
9e80: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
9e90: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
9ea0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
9eb0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
9ec0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
9ed0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
9ee0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
9ef0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
9f00: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
9f10: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
9f20: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
9f30: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
9f40: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
9f50: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
9f60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9f70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9f80: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
9f90: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
9fa0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
9fb0: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
9fc0: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
9fd0: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
9fe0: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
9ff0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
a000: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
a010: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
a020: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
a030: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
a040: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
a050: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
a060: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
a070: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
a080: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
a090: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
a0a0: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
a0b0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a0d0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
a0e0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
a0f0: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
a100: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
a110: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
a120: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
a130: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
a140: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
a150: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
a160: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
a170: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
a180: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
a190: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
a1a0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
a1b0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
a1c0: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
a1d0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
a1e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
a1f0: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
a200: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
a210: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
a220: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
a230: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
a240: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
a250: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
a260: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
a270: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
a280: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
a290: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
a2a0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
a2b0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
a2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
a2d0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
a2e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
a2f0: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
a300: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a310: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
a320: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
a330: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
a340: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
a350: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
a360: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
a370: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
a380: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
a390: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
a3a0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
a3b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a3c0: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
a3d0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
a3e0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
a3f0: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
a400: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
a410: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
a420: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
a430: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
a440: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
a450: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
a460: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
a470: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
a480: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
a490: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
a4a0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
a4b0: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
a4c0: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
a4d0: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
a4e0: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
a4f0: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
a500: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
a510: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a520: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
a530: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
a540: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
a550: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
a560: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
a570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a580: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
a590: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
a5a0: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
a5b0: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
a5c0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
a5d0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
a5e0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
a5f0: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
a600: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
a610: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
a620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
a630: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
a640: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
a650: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
a660: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
a670: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
a680: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
a690: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
a6a0: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
a6b0: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
a6c0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
a6d0: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
a6e0: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
a6f0: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
a700: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
a710: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
a720: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
a730: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
a740: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
a750: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
a760: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
a770: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
a780: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
a790: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
a7a0: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
a7b0: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
a7c0: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
a7d0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
a7e0: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
a7f0: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
a800: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
a810: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
a820: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
a830: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
a840: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
a850: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
a860: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
a870: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
a880: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
a890: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
a8a0: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
a8b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
a8c0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a8d0: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
a8e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
a8f0: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  e);.#else.  if( 
a900: 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
a910: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
a920: 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
a930: 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
a940: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
a950: 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
a960: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
a970: 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
a980: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
a990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a9a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
a9b0: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
a9c0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
a9d0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
a9e0: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
a9f0: 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
aa00: 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
aa10: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
aa20: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
aa30: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
aa40: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
aa70: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
aa80: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
aa90: 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
aaa0: 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
aab0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
aac0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
aaf0: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
ab00: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
ab10: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
ab20: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
ab30: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
ab40: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
ab50: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
ab60: 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
ab70: 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
ab80: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
ab90: 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
aba0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
abb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
abc0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
abd0: 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
abe0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
abf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
ac00: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
ac10: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
ac20: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
ac30: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
ac40: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
ac50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
ac60: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
ac70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac90: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
aca0: 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
acb0: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
acc0: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
acd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
ace0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
acf0: 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
ad00: 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad20: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
ad30: 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
ad40: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
ad50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad60: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
ad70: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
ad80: 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
ad90: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
ada0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
adb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
adc0: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
adf0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
ae00: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
ae10: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
ae20: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
ae30: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
ae40: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  ckpoint */..  /*
ae50: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
ae60: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
ae70: 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
ae80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
ae90: 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
aea0: 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
aeb0: 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
aec0: 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
aed0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
aee0: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c  CKPOINT_FULL>SQL
aef0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
af00: 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  ASSIVE );.  asse
af10: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
af20: 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54  POINT_FULL<SQLIT
af30: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
af40: 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74  TART );.  assert
af50: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
af60: 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53  INT_PASSIVE+2==S
af70: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
af80: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66  _RESTART );.  if
af90: 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
afa0: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
afb0: 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
afc0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
afd0: 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TART ){.    retu
afe0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
aff0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
b000: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
b010: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
b020: 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
b030: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
b040: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
b050: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
b060: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
b070: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
b080: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
b090: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
b0a0: 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  R, "unknown data
b0b0: 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b  base: %s", zDb);
b0c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
b0d0: 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
b0e0: 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
b0f0: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
b100: 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
b110: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
b120: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
b130: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
b140: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
b150: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
b160: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
b170: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
b180: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
b190: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
b1a0: 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
b1b0: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
b1c0: 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
b1d0: 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
b1e0: 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
b1f0: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
b200: 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
b210: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
b220: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
b230: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
b240: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
b250: 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75 72  r *zDb){.  retur
b260: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
b270: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20  eckpoint_v2(db, 
b280: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45 43  zDb, SQLITE_CHEC
b290: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
b2a0: 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  0, 0);.}..#ifnde
b2b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
b2c0: 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
b2d0: 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
b2e0: 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
b2f0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
b300: 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
b310: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
b320: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
b330: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
b340: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
b350: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
b360: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
b370: 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
b380: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
b390: 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
b3a0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
b3b0: 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
b3c0: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
b3d0: 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
b3e0: 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
b3f0: 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
b400: 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
b410: 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
b420: 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
b430: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
b440: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
b450: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
b460: 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
b470: 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
b480: 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
b490: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
b4a0: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
b4b0: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
b4c0: 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
b4d0: 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
b4e0: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
b4f0: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
b500: 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
b510: 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
b520: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
b530: 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
b540: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
b550: 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
b560: 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
b570: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
b580: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
b590: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
b5a0: 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
b5b0: 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
b5c0: 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
b5d0: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
b5e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
b5f0: 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
b600: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
b610: 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45  SIVE, FULL or RE
b620: 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  START..*/.int sq
b630: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
b640: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
b650: 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
b660: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
b670: 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
b680: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6a0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
b6b0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
b6e0: 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
b6f0: 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
b700: 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b720: 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
b730: 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
b740: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
b750: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b760: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
b770: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
b780: 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
b790: 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
b7a0: 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
b7b0: 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
b7c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
b7d0: 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
b7e0: 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
b7f0: 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
b800: 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
b810: 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
b820: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
b830: 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
b840: 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
b850: 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
b860: 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
b870: 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
b880: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
b890: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
b8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
b8b0: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
b8c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b8d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b8e0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
b8f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
b900: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
b910: 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
b920: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b930: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
b940: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
b950: 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
b960: 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
b970: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
b980: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
b990: 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
b9a0: 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
b9b0: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
b9c0: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
b9d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
b9e0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
b9f0: 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
ba00: 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
ba10: 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
ba20: 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
ba30: 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
ba40: 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
ba50: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
ba60: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
ba70: 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
ba80: 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
ba90: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
baa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
bab0: 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
bac0: 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
bad0: 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
bae0: 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
baf0: 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
bb00: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
bb10: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
bb20: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
bb30: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
bb80: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
bb90: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
bba0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
bbb0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
bbc0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
bbd0: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
bbe0: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
bbf0: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
bc10: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
bc20: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
bc60: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
bc90: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
bca0: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
bcd0: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
bce0: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
bcf0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
bd00: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
bd10: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
bd20: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
bd30: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
bd40: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
bd60: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
bd70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
bd80: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
bd90: 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
bda0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
bdb0: 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
bdc0: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
bdd0: 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
bde0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
bdf0: 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
be00: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
be10: 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
be20: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
be30: 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72  STORE==3.  retur
be40: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
be50: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
be60: 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
be70: 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74  MP_STORE>3.  ret
be80: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
be90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
bea0: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
beb0: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
bec0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
bed0: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
bee0: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
bef0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
bf00: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
bf10: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
bf20: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
bf30: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
bf40: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
bf50: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
bf60: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
bf70: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
bf80: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
bf90: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
bfa0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
bfb0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
bfc0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
bfd0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
bfe0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bff0: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
c000: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
c010: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
c020: 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  .    z = (char*)
c030: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
c040: 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  xt(db->pErr);.  
c050: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
c060: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
c070: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
c080: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
c090: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
c0a0: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
c0b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
c0c0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
c0d0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
c0e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c0f0: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
c100: 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e  Return UTF-16 en
c110: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
c120: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
c130: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
c140: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
c150: 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
c160: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
c170: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
c180: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
c190: 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a   outOfMem[] = {.
c1a0: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
c1b0: 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27  ', ' ', 'o', 'f'
c1c0: 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c  , ' ', 'm', 'e',
c1d0: 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20   'm', 'o', 'r', 
c1e0: 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74  'y', 0.  };.  st
c1f0: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d  atic const u16 m
c200: 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  isuse[] = {.    
c210: 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27  'l', 'i', 'b', '
c220: 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79  r', 'a', 'r', 'y
c230: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27  ', ' ', .    'r'
c240: 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c  , 'o', 'u', 't',
c250: 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20   'i', 'n', 'e', 
c260: 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27  ' ', .    'c', '
c270: 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65  a', 'l', 'l', 'e
c280: 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'd', ' ', .  
c290: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
c2a0: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
c2b0: 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'f', ' ', .    '
c2c0: 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75  s', 'e', 'q', 'u
c2d0: 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27  ', 'e', 'n', 'c'
c2e0: 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20  , 'e', 0.  };.. 
c2f0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a   const void *z;.
c300: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
c310: 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29   return (void *)
c320: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20  outOfMem;.  }.  
c330: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
c340: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
c350: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
c360: 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65  n (void *)misuse
c370: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
c380: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
c390: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
c3a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c3b0: 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20  {.    z = (void 
c3c0: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65  *)outOfMem;.  }e
c3d0: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  lse{.    z = sql
c3e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
c3f0: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
c400: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
c410: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
c420: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
c430: 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  -1, sqlite3ErrSt
c440: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a  r(db->errCode),.
c450: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
c460: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
c470: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20  TATIC);.      z 
c480: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
c490: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
c4a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
c4b0: 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
c4c0: 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
c4d0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
c4e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
c4f0: 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
c500: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
c510: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
c520: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c530: 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
c540: 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
c550: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
c560: 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
c570: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
c580: 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
c590: 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
c5a0: 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
c5b0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
c5c0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
c5d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  .    */.    db->
c5e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
c5f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
c600: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
c610: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
c620: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
c630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
c640: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
c650: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
c660: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
c670: 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
c680: 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
c690: 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
c6a0: 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
c6b0: 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
c6c0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
c6d0: 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
c6e0: 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
c6f0: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
c700: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
c710: 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
c720: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
c730: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
c740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
c750: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
c760: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
c770: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c780: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c790: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
c7a0: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
c7b0: 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
c7c0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
c7d0: 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
c7e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
c7f0: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
c800: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
c810: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
c820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
c830: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
c840: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
c850: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c860: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c870: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c880: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
c890: 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  de;.}../*.** Cre
c8a0: 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ate a new collat
c8b0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
c8c0: 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20   database "db". 
c8d0: 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61   The name is zNa
c8e0: 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e  me.** and the en
c8f0: 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a  coding is enc..*
c900: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
c910: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  ateCollation(.  
c920: 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63  sqlite3* db,.  c
c930: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
c940: 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76  , .  u8 enc,.  v
c950: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
c960: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
c970: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
c980: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
c990: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
c9a0: 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
c9b0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
c9c0: 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20  int enc2;.  int 
c9d0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
c9e0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
c9f0: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
ca00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ca10: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
ca20: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
ca30: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
ca40: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
ca50: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
ca60: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
ca70: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
ca80: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
ca90: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
caa0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
cab0: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
cac0: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
cad0: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
cae0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
caf0: 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
cb00: 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
cb10: 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
cb20: 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
cb30: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
cb40: 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
cb50: 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
cb60: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
cb70: 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
cb80: 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
cb90: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
cba0: 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
cbb0: 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
cbc0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
cbd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
cbe0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
cbf0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
cc00: 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
cc10: 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
cc20: 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
cc30: 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
cc40: 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
cc50: 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
cc60: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
cc70: 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
cc80: 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
cc90: 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
cca0: 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
ccb0: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
ccc0: 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
ccd0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
cce0: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
ccf0: 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
cd00: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
cd10: 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
cd20: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
cd30: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
cd40: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
cd50: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
cd60: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
cd70: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63   delete/modify c
cd80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
cd90: 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  e due to active 
cda0: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
cdb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cdc0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
cdd0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
cde0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
cdf0: 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  s(db);..    /* I
ce00: 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
ce10: 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
ce20: 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
ce30: 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
ce40: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
ce50: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
ce60: 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
ce70: 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
ce80: 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
ce90: 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
cea0: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
ceb0: 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
cec0: 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
ced0: 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
cee0: 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
cef0: 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
cf00: 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
cf10: 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
cf20: 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
cf30: 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
cf40: 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
cf50: 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
cf60: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
cf70: 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
cf80: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
cf90: 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20  CollSeq, zName, 
cfa0: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  nName);.      in
cfb0: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
cfc0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
cfd0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
cfe0: 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
cff0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
d000: 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
d010: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
d020: 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
d030: 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
d040: 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
d050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
d060: 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
d070: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d080: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
d090: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
d0a0: 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
d0b0: 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
d0c0: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
d0d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d0e0: 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
d0f0: 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
d100: 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
d110: 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
d120: 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
d130: 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
d140: 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
d150: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
d160: 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
d170: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
d180: 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  OK, 0);.  return
d190: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
d1a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
d1b0: 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
d1c0: 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
d1d0: 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
d1e0: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
d1f0: 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
d200: 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
d210: 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
d220: 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
d230: 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
d240: 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
d250: 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
d260: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
d270: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
d280: 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
d290: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
d2a0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
d2b0: 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
d2c0: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
d2d0: 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
d2e0: 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
d2f0: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
d300: 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
d310: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
d320: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
d330: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
d340: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
d350: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20  IABLE_NUMBER,.  
d360: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
d370: 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a  ER_DEPTH,.};../*
d380: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
d390: 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
d3a0: 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
d3b0: 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
d3c0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
d3d0: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
d3e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
d3f0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
d400: 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
d410: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
d420: 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
d430: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
d440: 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
d450: 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
d460: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
d470: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
d480: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
d490: 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
d4a0: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
d4b0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
d4c0: 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
d4d0: 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
d4e0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d4f0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d500: 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
d510: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
d520: 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
d530: 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
d540: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
d550: 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
d560: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
d570: 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
d580: 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
d590: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
d5a0: 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
d5b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
d5c0: 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20  TION_ARG>1000.# 
d5d0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
d5e0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75  _FUNCTION_ARG mu
d5f0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
d600: 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a  and 1000.#endif.
d610: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  #if SQLITE_MAX_A
d620: 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c  TTACHED<0 || SQL
d630: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
d640: 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  >62.# error SQLI
d650: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
d660: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
d670: 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66 0a  0 and 62.#endif.
d680: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
d690: 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
d6a0: 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
d6b0: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
d6c0: 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74  TERN_LENGTH must
d6d0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
d6e0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
d6f0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
d700: 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
d710: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
d720: 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
d730: 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  7.#endif.#if SQL
d740: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
d750: 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  DEPTH<1.# error 
d760: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
d770: 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65  ER_DEPTH must be
d780: 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
d790: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
d7a0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
d7b0: 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
d7c0: 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
d7d0: 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
d7e0: 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
d7f0: 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
d800: 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
d810: 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
d820: 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
d830: 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
d840: 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
d850: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
d860: 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
d870: 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
d880: 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
d890: 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
d8a0: 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
d8b0: 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
d8c0: 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
d8d0: 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
d8e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
d8f0: 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
d900: 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
d910: 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
d920: 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a  int oldLimit;...
d930: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
d940: 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
d950: 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
d960: 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
d970: 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
d980: 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
d990: 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
d9a0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
d9b0: 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
d9c0: 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
d9d0: 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
d9e0: 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
d9f0: 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
da00: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
da10: 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
da20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
da30: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
da40: 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
da50: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
da60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
da70: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
da80: 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
da90: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
daa0: 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
dab0: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
dac0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
dad0: 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
dae0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
daf0: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
db00: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
db10: 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
db20: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
db30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
db40: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
db50: 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
db60: 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
db70: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
db80: 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
db90: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
dba0: 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
dbb0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
dbc0: 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
dbd0: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
dbe0: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
dbf0: 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
dc00: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
dc10: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
dc20: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
dc30: 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
dc40: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
dc50: 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
dc60: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
dc70: 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
dc80: 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
dcc0: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
dcd0: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
dce0: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
dcf0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
dd00: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
dd10: 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
dd20: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
dd30: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
dd40: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
dd50: 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
dd60: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
dd70: 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
dd80: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
dd90: 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
dda0: 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c  PTH==(SQLITE_N_L
ddb0: 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69  IMIT-1) );...  i
ddc0: 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
ddd0: 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
dde0: 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
ddf0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
de00: 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
de10: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
de20: 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
de30: 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
de40: 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
de50: 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a  -52476-28732 */.
de60: 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
de70: 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
de80: 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
de90: 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
dea0: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f  mit[limitId];  /
deb0: 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32  * IMP: R-51463-2
dec0: 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  5634 */.    }.  
ded0: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d    db->aLimit[lim
dee0: 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74  itId] = newLimit
def0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
df00: 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  ldLimit;        
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df20: 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34  IMP: R-53341-354
df30: 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  19 */.}../*.** T
df40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
df50: 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f  used to parse bo
df60: 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d  th URIs and non-
df70: 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61  URI filenames pa
df80: 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75  ssed by the.** u
df90: 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74  ser to API funct
dfa0: 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65  ions sqlite3_ope
dfb0: 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  n() or sqlite3_o
dfc0: 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f  pen_v2(), and fo
dfd0: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52  r database.** UR
dfe0: 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  Is specified as 
dff0: 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73  part of ATTACH s
e000: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a  tatements..**.**
e010: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
e020: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
e030: 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  tion is the name
e040: 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
e050: 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c  se (or.** a NULL
e060: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20   to signify the 
e070: 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20  default VFS) if 
e080: 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74  the URI does not
e090: 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d   contain a "vfs=
e0a0: 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61  xxx".** query pa
e0b0: 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63  rameter. The sec
e0c0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e  ond argument con
e0d0: 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f  tains the URI (o
e0e0: 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61  r non-URI filena
e0f0: 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57  me).** itself. W
e100: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
e110: 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  n is called the 
e120: 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65  *pFlags variable
e130: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
e140: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66  ** the default f
e150: 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65  lags to open the
e160: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e170: 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65   with. The value
e180: 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70   stored in.** *p
e190: 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64  Flags may be upd
e1a0: 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ated before retu
e1b0: 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49  rning if the URI
e1c0: 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69   filename contai
e1d0: 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78  ns .** "cache=xx
e1e0: 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22  x" or "mode=xxx"
e1f0: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
e200: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  s..**.** If succ
e210: 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
e220: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
e230: 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56  n this case *ppV
e240: 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  fs is set to poi
e250: 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53  nt to.** the VFS
e260: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
e270: 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65  used to open the
e280: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e290: 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74  *pzFile is set t
e2a0: 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  o.** point to a 
e2b0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
e2c0: 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  g the name of th
e2d0: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20  e file to open. 
e2e0: 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
e2f0: 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
e300: 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
e310: 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71  entually call sq
e320: 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20  lite3_free() to 
e330: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
e340: 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  buffer..**.** If
e350: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
e360: 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65  , then an SQLite
e370: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
e380: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45  eturned and *pzE
e390: 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20  rrMsg.** may be 
e3a0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
e3b0: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
e3c0: 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c  ing an English l
e3d0: 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a  anguage error .*
e3e0: 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  * message. It is
e3f0: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
e400: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
e410: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
e420: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20  release.** this 
e430: 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e  buffer by callin
e440: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
e450: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e460: 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73  ParseUri(.  cons
e470: 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74  t char *zDefault
e480: 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56  Vfs,        /* V
e490: 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20  FS to use if no 
e4a0: 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20  "vfs=xxx" query 
e4b0: 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  option */.  cons
e4c0: 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20  t char *zUri,   
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e4e0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52  ul-terminated UR
e4f0: 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20  I to parse */.  
e500: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46  unsigned int *pF
e510: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
e520: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54  /* IN/OUT: SQLIT
e530: 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73  E_OPEN_XXX flags
e540: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
e550: 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20  s **ppVfs,      
e560: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46        /* OUT: VF
e570: 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63  S to use */ .  c
e580: 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20  har **pzFile,   
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e5a0: 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20  * OUT: Filename 
e5b0: 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49  component of URI
e5c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
e5d0: 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
e5e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
e5f0: 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20  ror message (if 
e600: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a  rc!=SQLITE_OK) *
e610: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
e620: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
e630: 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20  igned int flags 
e640: 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e  = *pFlags;.  con
e650: 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20  st char *zVfs = 
e660: 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63  zDefaultVfs;.  c
e670: 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
e680: 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69  ar c;.  int nUri
e690: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
e6a0: 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73  30(zUri);..  ass
e6b0: 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d  ert( *pzErrMsg==
e6c0: 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c  0 );..  if( ((fl
e6d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
e6e0: 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74 65  N_URI) || sqlite
e6f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f  3GlobalConfig.bO
e700: 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20 6e  penUri) .   && n
e710: 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
e720: 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
e730: 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  5)==0 .  ){.    
e740: 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
e750: 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e770: 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68   Parser state wh
e780: 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a  en parsing URI *
e790: 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20  /.    int iIn;  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
e7c0: 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
e7d0: 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30      int iOut = 0
e7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e7f0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72    /* Output char
e800: 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
e810: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
e820: 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20  Uri+2;          
e830: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
e840: 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
e850: 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  /..    /* Make s
e860: 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f  ure the SQLITE_O
e870: 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20  PEN_URI flag is 
e880: 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20  set to indicate 
e890: 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e  to the VFS xOpen
e8a0: 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20   .    ** method 
e8b0: 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62  that there may b
e8c0: 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65  e extra paramete
e8d0: 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  rs following the
e8e0: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a   file-name.  */.
e8f0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
e900: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20  ITE_OPEN_URI;.. 
e910: 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49     for(iIn=0; iI
e920: 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e  n<nUri; iIn++) n
e930: 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49  Byte += (zUri[iI
e940: 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46  n]=='&');.    zF
e950: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
e960: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 20  lloc(nByte);.   
e970: 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65   if( !zFile ) re
e980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e990: 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63 61  M;..    /* Disca
e9a0: 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e  rd the scheme an
e9b0: 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d  d authority segm
e9c0: 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e  ents of the URI.
e9d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69   */.    if( zUri
e9e0: 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69  [5]=='/' && zUri
e9f0: 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [6]=='/' ){.    
ea00: 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20    iIn = 7;.     
ea10: 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
ea20: 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
ea30: 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 0a 20 20  '/' ) iIn++;..  
ea40: 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26      if( iIn!=7 &
ea50: 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65  & (iIn!=16 || me
ea60: 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22  mcmp("localhost"
ea70: 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20  , &zUri[7], 9)) 
ea80: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
ea90: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
eaa0: 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
eab0: 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25  uri authority: %
eac0: 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .*s", .         
ead0: 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b     iIn-7, &zUri[
eae0: 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  7]);.        rc 
eaf0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
eb00: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
eb10: 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
eb20: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
eb30: 20 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 20 20       iIn = 5;.  
eb40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
eb50: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
eb60: 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61  d any query para
eb70: 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20  meters into the 
eb80: 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20  zFile buffer. . 
eb90: 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48     ** Decode %HH
eba0: 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c   escape codes al
ebb0: 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20  ong the way. .  
ebc0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68    **.    ** With
ebd0: 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61  in this loop, va
ebe0: 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61  riable eState ma
ebf0: 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31  y be set to 0, 1
ec00: 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67   or 2, depending
ec10: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70  .    ** on the p
ec20: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
ec30: 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  As follows:.    
ec40: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50  **.    **   0: P
ec50: 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65  arsing file-name
ec60: 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61  ..    **   1: Pa
ec70: 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69  rsing name secti
ec80: 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
ec90: 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
eca0: 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20  er..    **   2: 
ecb0: 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65  Parsing value se
ecc0: 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
ecd0: 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
ece0: 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  meter..    */.  
ecf0: 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20    eState = 0;.  
ed00: 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55    while( (c = zU
ed10: 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63  ri[iIn])!=0 && c
ed20: 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  !='#' ){.      i
ed30: 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
ed40: 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26  c=='%' .       &
ed50: 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69  & sqlite3Isxdigi
ed60: 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20  t(zUri[iIn]) .  
ed70: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
ed80: 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
ed90: 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  +1]) .      ){. 
eda0: 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74         int octet
edb0: 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f   = (sqlite3HexTo
edc0: 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29  Int(zUri[iIn++])
edd0: 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20   << 4);.        
ede0: 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  octet += sqlite3
edf0: 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
ee00: 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20  n++]);..        
ee10: 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30  assert( octet>=0
ee20: 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b   && octet<256 );
ee30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74  .        if( oct
ee40: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  et==0 ){.       
ee50: 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
ee60: 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
ee70: 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69  "%00" appears wi
ee80: 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e  thin the URI. In
ee90: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
eea0: 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72  ** case we ignor
eeb0: 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68  e all text in th
eec0: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
eed0: 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72  he path, name or
eee0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61  .          ** va
eef0: 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65  lue currently be
ef00: 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69  ing parsed. So i
ef10: 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  gnore the curren
ef20: 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20  t character.    
ef30: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69        ** and ski
ef40: 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f  p to the next "?
ef50: 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61  ", "=" or "&", a
ef60: 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a  s appropriate. *
ef70: 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  /.          whil
ef80: 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e  e( (c = zUri[iIn
ef90: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20  ])!=0 && c!='#' 
efa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
efb0: 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20  & (eState!=0 || 
efc0: 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20  c!='?').        
efd0: 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
efe0: 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26  !=1 || (c!='=' &
eff0: 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20  & c!='&')).     
f000: 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
f010: 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27  ate!=2 || c!='&'
f020: 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
f030: 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b             iIn++
f040: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f050: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
f060: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f070: 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20      c = octet;. 
f080: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
f090: 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d  State==1 && (c==
f0a0: 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29  '&' || c=='=') )
f0b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  {.        if( zF
f0c0: 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29  ile[iOut-1]==0 )
f0d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
f0e0: 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e  n empty option n
f0f0: 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73  ame. Ignore this
f100: 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68   option altogeth
f110: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  er. */.         
f120: 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e   while( zUri[iIn
f130: 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d  ] && zUri[iIn]!=
f140: 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d  '#' && zUri[iIn-
f150: 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b  1]!='&' ) iIn++;
f160: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
f170: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
f180: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26         if( c=='&
f190: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
f1a0: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
f1b0: 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  \0';.        }el
f1c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53  se{.          eS
f1d0: 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20  tate = 2;.      
f1e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
f1f0: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
f200: 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26  f( (eState==0 &&
f210: 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74   c=='?') || (eSt
f220: 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27  ate==2 && c=='&'
f230: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ) ){.        c =
f240: 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61   0;.        eSta
f250: 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  te = 1;.      }.
f260: 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
f270: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20  ++] = c;.    }. 
f280: 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31     if( eState==1
f290: 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d   ) zFile[iOut++]
f2a0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
f2b0: 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
f2c0: 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  ';.    zFile[iOu
f2d0: 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  t++] = '\0';..  
f2e0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
f2f0: 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74  ere were any opt
f300: 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74  ions specified t
f310: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  hat should be in
f320: 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a  terpreted .    *
f330: 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20  * here. Options 
f340: 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72  that are interpr
f350: 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64  eted here includ
f360: 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73  e "vfs" and thos
f370: 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f  e that.    ** co
f380: 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67  rrespond to flag
f390: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61  s that may be pa
f3a0: 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69  ssed to the sqli
f3b0: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20  te3_open_v2().  
f3c0: 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a    ** method. */.
f3d0: 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c      zOpt = &zFil
f3e0: 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  e[sqlite3Strlen3
f3f0: 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20  0(zFile)+1];.   
f400: 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20   while( zOpt[0] 
f410: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70  ){.      int nOp
f420: 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  t = sqlite3Strle
f430: 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20  n30(zOpt);.     
f440: 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a   char *zVal = &z
f450: 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20  Opt[nOpt+1];.   
f460: 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71     int nVal = sq
f470: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56  lite3Strlen30(zV
f480: 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  al);..      if( 
f490: 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d  nOpt==3 && memcm
f4a0: 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33  p("vfs", zOpt, 3
f4b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f4c0: 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20  zVfs = zVal;.   
f4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f4e0: 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64    struct OpenMod
f4f0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  e {.          co
f500: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
f510: 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b         int mode;
f520: 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64  .        } *aMod
f530: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  e = 0;.        c
f540: 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d  har *zModeType =
f550: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
f560: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  mask = 0;.      
f570: 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b    int limit = 0;
f580: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  ..        if( nO
f590: 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28  pt==5 && memcmp(
f5a0: 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35  "cache", zOpt, 5
f5b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f5c0: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
f5d0: 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d  OpenMode aCacheM
f5e0: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
f5f0: 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22        { "shared"
f600: 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ,  SQLITE_OPEN_S
f610: 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20  HAREDCACHE },.  
f620: 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69            { "pri
f630: 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50  vate", SQLITE_OP
f640: 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
f650: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
f660: 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
f670: 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
f680: 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
f690: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53  EN_SHAREDCACHE|S
f6a0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
f6b0: 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20  TECACHE;.       
f6c0: 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68     aMode = aCach
f6d0: 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  eMode;.         
f6e0: 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20   limit = mask;. 
f6f0: 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
f700: 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20  pe = "cache";.  
f710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f720: 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d  if( nOpt==4 && m
f730: 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f  emcmp("mode", zO
f740: 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 4)==0 ){.   
f750: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
f760: 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f  ruct OpenMode aO
f770: 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20  penMode[] = {.  
f780: 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22            { "ro"
f790: 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
f7a0: 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20  EADONLY },.     
f7b0: 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20         { "rw",  
f7c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f7d0: 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20  WRITE }, .      
f7e0: 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53        { "rwc", S
f7f0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
f800: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
f810: 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20  EN_CREATE },.   
f820: 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
f830: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
f840: 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
f850: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
f860: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
f870: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
f880: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
f890: 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
f8a0: 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20  = aOpenMode;.   
f8b0: 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d         limit = m
f8c0: 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20  ask & flags;.   
f8d0: 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
f8e0: 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20   = "access";.   
f8f0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
f900: 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20  if( aMode ){.   
f910: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
f920: 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
f930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f940: 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69  for(i=0; aMode[i
f950: 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ].z; i++){.     
f960: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
f970: 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  r *z = aMode[i].
f980: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  z;.            i
f990: 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33  f( nVal==sqlite3
f9a0: 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30  Strlen30(z) && 0
f9b0: 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a  ==memcmp(zVal, z
f9c0: 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20  , nVal) ){.     
f9d0: 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20           mode = 
f9e0: 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20  aMode[i].mode;. 
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
fa00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
fa10: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
fa20: 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65          if( mode
fa30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
fa40: 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
fa50: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
fa60: 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a  no such %s mode:
fa70: 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c   %s", zModeType,
fa80: 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
fa90: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
faa0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
fab0: 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
fac0: 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
fad0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
fae0: 20 6d 6f 64 65 3e 6c 69 6d 69 74 20 29 7b 0a 20   mode>limit ){. 
faf0: 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
fb00: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
fb10: 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20  printf("%s mode 
fb20: 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22  not allowed: %s"
fb30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
fb60: 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
fb70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
fb80: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
fb90: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
fba0: 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
fbb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fbc0: 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  flags = (flags &
fbd0: 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a   ~mask) | mode;.
fbe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fbf0: 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20  }..      zOpt = 
fc00: 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20  &zVal[nVal+1];. 
fc10: 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
fc20: 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
fc30: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32  e3_malloc(nUri+2
fc40: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
fc50: 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
fc60: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
fc70: 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c  cpy(zFile, zUri,
fc80: 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c   nUri);.    zFil
fc90: 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
fca0: 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
fcb0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20  ] = '\0';.  }.. 
fcc0: 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65   *ppVfs = sqlite
fcd0: 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
fce0: 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d  ;.  if( *ppVfs==
fcf0: 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  0 ){.    *pzErrM
fd00: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
fd10: 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66  intf("no such vf
fd20: 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20  s: %s", zVfs);. 
fd30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
fd40: 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65  RROR;.  }. parse
fd50: 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20  _uri_out:.  if( 
fd60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
fd70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
fd80: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46  e(zFile);.    zF
fd90: 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  ile = 0;.  }.  *
fda0: 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  pFlags = flags;.
fdb0: 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c    *pzFile = zFil
fdc0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
fdd0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
fde0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
fdf0: 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
fe00: 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
fe10: 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
fe20: 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
fe30: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
fe40: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
fe50: 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
fe60: 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
fe70: 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
fe80: 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
fe90: 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
fea0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
feb0: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
fec0: 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
fed0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
fee0: 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
fef0: 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
ff00: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
ff10: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
ff20: 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65  flags,    /* Ope
ff30: 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
ff40: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ff50: 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
ff60: 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
ff70: 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
ff80: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
ff90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ffa0: 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  Store allocated 
ffb0: 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
ffc0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffe0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
fff0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  */.  int isThrea
10000 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20  dsafe;          
10010 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
10020 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e   threadsafe conn
10030 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  ections */.  cha
10040 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20  r *zOpen = 0;   
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10060 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
10070 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72  t to pass to Btr
10080 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68  eeOpen() */.  ch
10090 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
100b0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
100c0 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65  rom sqlite3Parse
100d0 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44  Uri() */..  *ppD
100e0 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
100f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
10100 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
10110 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
10120 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
10130 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
10140 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   /* Only allow s
10150 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
10160 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
10170 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
10180 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
10190 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
101a0 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
101b0 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
101c0 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
101d0 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
101e0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
101f0 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
10200 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
10210 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
10220 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
10230 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
10240 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
10250 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
10260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10270 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
10280 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
10290 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
102a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
102b0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
102c0 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
102d0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
102e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
102f0 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
10300 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
10310 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
10320 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
10330 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
10340 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
10350 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
10360 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
10370 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
10380 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
10390 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
103a0 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
103b0 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
103c0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
103d0 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
103e0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
103f0 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
10400 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
10410 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
10420 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
10430 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
10440 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
10450 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  reMutex==0 ){.  
10460 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
10470 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
10480 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
10490 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20  PEN_NOMUTEX ){. 
104a0 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
104b0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
104c0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
104d0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29  OPEN_FULLMUTEX )
104e0 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
104f0 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  fe = 1;.  }else{
10500 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
10510 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e = sqlite3Globa
10520 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
10530 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c  ex;.  }.  if( fl
10540 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
10550 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29  N_PRIVATECACHE )
10560 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  {.    flags &= ~
10570 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
10580 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65  EDCACHE;.  }else
10590 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
105a0 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
105b0 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
105c0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
105d0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
105e0 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  CHE;.  }..  /* R
105f0 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
10600 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
10610 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  s parameter.  **
10620 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  .  ** The SQLITE
10630 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e  _OPEN_NOMUTEX an
10640 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  d SQLITE_OPEN_FU
10650 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65  LLMUTEX flags we
10660 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69  re.  ** dealt wi
10670 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  th in the previo
10680 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20  us code block.  
10690 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74  Besides these, t
106a0 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c  he only.  ** val
106b0 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66  id input flags f
106c0 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
106d0 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f  v2() are SQLITE_
106e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20  OPEN_READONLY,. 
106f0 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
10700 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54  READWRITE, SQLIT
10710 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53  E_OPEN_CREATE, S
10720 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
10730 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c  DCACHE,.  ** SQL
10740 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
10750 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20  CACHE, and some 
10760 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20  reserved bits.  
10770 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20  Silently mask.  
10780 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72  ** off all other
10790 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66   flags..  */.  f
107a0 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49  lags &=  ~( SQLI
107b0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
107c0 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
107d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
107e0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
10800 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
10810 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B |.            
10820 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
10830 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  EMP_DB | .      
10840 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10850 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
10860 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  B | .           
10870 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10880 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  MAIN_JOURNAL | .
10890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
108a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
108b0 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
108c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
108d0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
108e0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
108f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
10900 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a  ASTER_JOURNAL |.
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10920 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
10930 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
10940 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10950 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20  FULLMUTEX |.    
10960 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10970 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20  E_OPEN_WAL.     
10980 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
10990 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
109a0 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
109b0 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
109c0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
109d0 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
109e0 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
109f0 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
10a00 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
10a10 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d  dsafe ){.    db-
10a20 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
10a30 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10a40 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
10a50 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
10a60 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
10a70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
10a80 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
10a90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
10aa0 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
10ab0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
10ac0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
10ad0 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
10ae0 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
10af0 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
10b00 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
10b10 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
10b20 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
10b30 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  atic;..  assert(
10b40 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
10b50 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72  it)==sizeof(aHar
10b60 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d  dLimit) );.  mem
10b70 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20  cpy(db->aLimit, 
10b80 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65  aHardLimit, size
10b90 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b  of(db->aLimit));
10ba0 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
10bb0 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78  t = 1;.  db->nex
10bc0 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20  tAutovac = -1;. 
10bd0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
10be0 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  e = 0;.  db->fla
10bf0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
10c00 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c  rtColNames | SQL
10c10 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 20 7c 20  ITE_AutoIndex | 
10c20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
10c30 67 67 65 72 0a 23 69 66 20 53 51 4c 49 54 45 5f  gger.#if SQLITE_
10c40 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
10c50 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
10c60 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
10c70 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
10c80 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
10c90 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
10ca0 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
10cb0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
10cc0 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
10cd0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10ce0 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
10cf0 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10d10 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
10d20 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
10d30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
10d40 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
10d50 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
10d60 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
10d70 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
10d80 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
10d90 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
10da0 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65        ;.  sqlite
10db0 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
10dc0 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
10dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10de0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
10df0 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
10e00 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
10e10 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
10e20 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
10e30 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
10e40 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
10e50 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
10e60 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
10e70 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
10e80 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
10e90 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
10ea0 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
10eb0 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
10ec0 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
10ed0 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
10ee0 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
10ef0 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
10f00 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
10f10 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
10f20 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
10f30 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
10f40 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
10f50 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
10f60 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16BE, 0, binColl
10f70 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
10f80 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
10f90 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
10fa0 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e  _UTF16LE, 0, bin
10fb0 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
10fc0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
10fd0 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
10fe0 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
10ff0 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
11000 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
11010 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
11020 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
11030 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44  ut;.  }.  db->pD
11040 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
11050 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
11060 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42   SQLITE_UTF8, "B
11070 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73  INARY", 0);.  as
11080 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43  sert( db->pDfltC
11090 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  oll!=0 );..  /* 
110a0 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38  Also add a UTF-8
110b0 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76   case-insensitiv
110c0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
110d0 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74  ence. */.  creat
110e0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
110f0 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
11100 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
11110 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
11120 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
11130 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61  e filename/URI a
11140 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62  rgument. */.  db
11150 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
11160 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ags;.  rc = sqli
11170 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73  te3ParseUri(zVfs
11180 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c  , zFilename, &fl
11190 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20  ags, &db->pVfs, 
111a0 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67  &zOpen, &zErrMsg
111b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
111c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
111d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
111e0 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  EM ) db->mallocF
111f0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73  ailed = 1;.    s
11200 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
11210 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25  rc, zErrMsg ? "%
11220 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29  s" : 0, zErrMsg)
11230 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
11240 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
11250 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
11260 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
11270 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74   the backend dat
11280 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a  abase driver */.
11290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
112a0 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
112b0 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62  , zOpen, db, &db
112c0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
112d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
112e0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
112f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
11300 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
11310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11320 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11330 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
11340 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11350 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
11360 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
11370 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20  db, rc, 0);.    
11380 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
11390 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30  .  }.  db->aDb[0
113a0 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69  ].pSchema = sqli
113b0 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c  te3SchemaGet(db,
113c0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29   db->aDb[0].pBt)
113d0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ;.  db->aDb[1].p
113e0 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
113f0 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29  SchemaGet(db, 0)
11400 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  ;...  /* The def
11410 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65  ault safety_leve
11420 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  l for the main d
11430 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c  atabase is 'full
11440 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a  '; for the temp.
11450 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74    ** database it
11460 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73   is 'NONE'. This
11470 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67   matches the pag
11480 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74  er layer default
11490 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  s.  .  */.  db->
114a0 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22  aDb[0].zName = "
114b0 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62  main";.  db->aDb
114c0 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [0].safety_level
114d0 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b   = 3;.  db->aDb[
114e0 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70  1].zName = "temp
114f0 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ";.  db->aDb[1].
11500 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31  safety_level = 1
11510 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
11520 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
11530 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
11540 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11550 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
11560 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
11570 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
11580 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
11590 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
115a0 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
115b0 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
115c0 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
115d0 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
115e0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
115f0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
11600 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
11610 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
11620 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
11630 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  ;.  sqlite3Regis
11640 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
11650 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ons(db);..  /* L
11660 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78  oad automatic ex
11670 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e  tensions - exten
11680 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  sions that have 
11690 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a  been registered.
116a0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73    ** using the s
116b0 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63  qlite3_automatic
116c0 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49  _extension() API
116d0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
116e0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
116f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
11700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
11710 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74  lite3AutoLoadExt
11720 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20  ensions(db);.   
11730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
11740 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69  rcode(db);.    i
11750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11760 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   ){.      goto o
11770 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
11780 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
11790 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
117a0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
117b0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
117c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
117d0 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
117e0 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
117f0 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
11800 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
11810 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11820 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
11830 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11840 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
11850 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
11860 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
11870 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
11880 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
11890 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
118a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
118b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
118c0 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S3.  if( !db->ma
118d0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
118e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
118f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
11900 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
11910 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
11920 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
11930 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
11940 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
11950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11960 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
11970 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
11980 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
11990 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
119a0 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
119b0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
119c0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
119d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
119e0 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
119f0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
11a00 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
11a10 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  );..  /* -DSQLIT
11a20 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
11a30 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
11a40 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
11a50 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
11a60 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
11a70 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
11a80 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
11a90 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
11aa0 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
11ab0 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
11ac0 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
11ad0 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
11ae0 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
11af0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
11b00 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
11b10 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
11b20 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
11b30 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
11b40 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
11b50 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
11b60 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
11b70 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b90 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11ba0 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
11bb0 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
11bc0 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20    /* Enable the 
11bd0 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63  lookaside-malloc
11be0 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20   subsystem */.  
11bf0 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
11c00 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f  b, 0, sqlite3Glo
11c10 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
11c20 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  aside,.         
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11c40 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
11c50 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a  ig.nLookaside);.
11c60 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  .  sqlite3_wal_a
11c70 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
11c80 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
11c90 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
11ca0 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75  INT);..opendb_ou
11cb0 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
11cc0 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20  e(zOpen);.  if( 
11cd0 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  db ){.    assert
11ce0 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c  ( db->mutex!=0 |
11cf0 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d  | isThreadsafe==
11d00 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  0 || sqlite3Glob
11d10 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
11d20 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
11d30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11d40 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
11d50 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11d60 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
11d70 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c  assert( db!=0 ||
11d80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
11d90 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  M );.  if( rc==S
11da0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
11db0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
11dc0 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
11dd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
11de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11df0 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
11e00 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
11e10 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20  ;.  }.  *ppDb = 
11e20 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  db;.  return sql
11e30 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
11e40 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  c);.}../*.** Ope
11e50 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
11e60 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
11e70 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20  sqlite3_open(.  
11e80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
11e90 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
11ea0 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72  3 **ppDb .){.  r
11eb0 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
11ec0 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70  se(zFilename, pp
11ed0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
11ee0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11ef0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
11f00 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
11f10 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  EATE, 0);.}.int 
11f20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
11f30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
11f40 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61  ilename,   /* Da
11f50 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
11f60 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
11f70 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
11f80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
11f90 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  ite db handle */
11fa0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
11fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
11fc0 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
11fd0 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
11fe0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
11ff0 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f  module to use */
12000 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
12010 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61  nDatabase(filena
12020 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67  me, ppDb, (unsig
12030 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a  ned int)flags, z
12040 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Vfs);.}..#ifndef
12050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
12060 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  16./*.** Open a 
12070 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
12080 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
12090 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f  te3_open16(.  co
120a0 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
120b0 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
120c0 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72  **ppDb.){.  char
120d0 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d   const *zFilenam
120e0 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61  e8;   /* zFilena
120f0 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  me encoded in UT
12100 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55  F-8 instead of U
12110 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-16 */.  sqlit
12120 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
12130 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
12140 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29  ert( zFilename )
12150 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44 62  ;.  assert( ppDb
12160 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b   );.  *ppDb = 0;
12170 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12180 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
12190 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
121a0 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
121b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
121c0 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d  .#endif.  pVal =
121d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
121e0 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
121f0 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
12200 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53  -1, zFilename, S
12210 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
12220 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
12230 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20  );.  zFilename8 
12240 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
12250 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
12260 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69  UTF8);.  if( zFi
12270 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72  lename8 ){.    r
12280 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65  c = openDatabase
12290 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44  (zFilename8, ppD
122a0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
122b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
122c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
122d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
122e0 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  ATE, 0);.    ass
122f0 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63  ert( *ppDb || rc
12300 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
12310 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12320 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61  LITE_OK && !DbHa
12330 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c  sProperty(*ppDb,
12340 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
12350 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45 4e  ded) ){.      EN
12360 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54  C(*ppDb) = SQLIT
12370 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
12380 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
12390 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
123a0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  MEM;.  }.  sqlit
123b0 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
123c0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  );..  return sql
123d0 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
123e0 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  c);.}.#endif /* 
123f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
12400 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
12410 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
12420 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
12430 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
12440 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
12450 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
12460 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  _collation(.  sq
12470 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
12480 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
12490 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
124a0 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
124b0 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
124c0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
124d0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
124e0 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
124f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12500 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
12510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
12520 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12530 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
12540 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
12550 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  me, (u8)enc, pCt
12560 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
12570 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
12580 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
12590 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
125a0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
125b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
125c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
125d0 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
125e0 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
125f0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
12600 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
12610 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
12620 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  lation_v2(.  sql
12630 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
12640 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
12650 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
12660 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
12670 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
12680 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
12690 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
126a0 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
126b0 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  )(void*).){.  in
126c0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
126d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
126e0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
126f0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
12700 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72  led );.  rc = cr
12710 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
12720 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63  , zName, (u8)enc
12730 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
12740 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20  , xDel);.  rc = 
12750 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
12760 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
12770 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
12780 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
12790 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
127a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
127b0 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
127c0 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
127d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
127e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
127f0 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
12800 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
12810 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71  ollation16(.  sq
12820 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
12830 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c  nst void *zName,
12840 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
12850 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
12860 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
12870 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
12880 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
12890 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *).){.  int rc =
128a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
128b0 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71  ar *zName8;.  sq
128c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
128d0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
128e0 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
128f0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
12900 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55  Name8 = sqlite3U
12910 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d  tf16to8(db, zNam
12920 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
12930 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66  F16NATIVE);.  if
12940 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ( zName8 ){.    
12950 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
12960 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c  tion(db, zName8,
12970 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
12980 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20  xCompare, 0);.  
12990 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
129a0 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d  db, zName8);.  }
129b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
129c0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
129d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
129e0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
129f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12a00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12a10 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
12a20 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
12a30 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
12a40 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
12a50 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
12a60 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
12a70 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
12a80 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
12a90 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
12aa0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
12ab0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
12ac0 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
12ad0 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ed(.  sqlite3 *d
12ae0 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
12af0 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
12b00 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
12b10 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
12b20 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
12b30 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20  nst char*).){.  
12b40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12b50 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
12b60 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
12b70 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b  d = xCollNeeded;
12b80 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
12b90 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  ed16 = 0;.  db->
12ba0 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
12bb0 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
12bc0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12bd0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
12be0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12bf0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
12c00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
12c10 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
12c20 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
12c30 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
12c40 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
12c50 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
12c60 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
12c70 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
12c80 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
12c90 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
12ca0 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
12cb0 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
12cc0 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74  eeded16(.  sqlit
12cd0 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
12ce0 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
12cf0 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
12d00 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73  eeded16)(void*,s
12d10 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
12d20 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  tRep,const void*
12d30 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ).){.  sqlite3_m
12d40 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
12d50 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
12d60 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  llNeeded = 0;.  
12d70 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
12d80 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31  6 = xCollNeeded1
12d90 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  6;.  db->pCollNe
12da0 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
12db0 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
12dc0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
12dd0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
12de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12df0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12e00 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
12e10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12e20 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
12e30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12e40 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61  tion is now an a
12e50 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75  nachronism. It u
12e60 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74  sed to be used t
12e70 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
12e80 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  .** malloc() fai
12e90 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65  lure, but SQLite
12ea0 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61   now does this a
12eb0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f  utomatically..*/
12ec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .int sqlite3_glo
12ed0 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64  bal_recover(void
12ee0 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
12ef0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
12f00 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
12f10 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
12f20 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
12f30 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
12f40 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f  autocommit.** mo
12f50 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
12f60 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41   if it is and FA
12f70 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74  LSE if not.  Aut
12f80 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20  ocommit mode is 
12f90 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  on.** by default
12fa0 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73  .  Autocommit is
12fb0 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42   disabled by a B
12fc0 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61  EGIN statement a
12fd0 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20  nd reenabled.** 
12fe0 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d  by the next COMM
12ff0 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a  IT or ROLLBACK..
13000 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20  **.******* THIS 
13010 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45 4e 54  IS AN EXPERIMENT
13020 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20 53 55  AL API AND IS SU
13030 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47 45 20  BJECT TO CHANGE 
13040 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ******.*/.int sq
13050 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
13060 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
13070 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
13080 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f  autoCommit;.}../
13090 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
130a0 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
130b0 73 75 62 74 69 74 75 74 65 73 20 66 6f 72 20 63  subtitutes for c
130c0 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f  onstants SQLITE_
130d0 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49  CORRUPT,.** SQLI
130e0 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54  TE_MISUSE, SQLIT
130f0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49  E_CANTOPEN, SQLI
13100 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73  TE_IOERR and pos
13110 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f  sibly other erro
13120 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20  r.** constants. 
13130 20 54 68 65 79 20 73 65 72 76 65 72 20 74 77 6f   They server two
13140 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a   purposes:.**.**
13150 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20     1.  Serve as 
13160 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
13170 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
13180 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75  kpoint in a debu
13190 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f  gger.**       to
131a0 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72   detect when ver
131b0 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  sion error condi
131c0 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a  tions occurs..**
131d0 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65  .**   2.  Invoke
131e0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74   sqlite3_log() t
131f0 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f  o provide the so
13200 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69  urce code locati
13210 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20  on where.**     
13220 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72    a low-level er
13230 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74  ror is first det
13240 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ected..*/.int sq
13250 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f  lite3CorruptErro
13260 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
13270 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
13280 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
13290 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
132a0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
132b0 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20  ORRUPT,.        
132c0 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65 20        "database 
132d0 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69  corruption at li
132e0 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
132f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
13300 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
13310 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
13320 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13330 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20  _CORRUPT;.}.int 
13340 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72  sqlite3MisuseErr
13350 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
13360 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
13370 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13380 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
13390 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
133a0 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20  MISUSE, .       
133b0 20 20 20 20 20 20 20 22 6d 69 73 75 73 65 20 61         "misuse a
133c0 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e  t line %d of [%.
133d0 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  10s]",.         
133e0 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b       lineno, 20+
133f0 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
13400 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ());.  return SQ
13410 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69  LITE_MISUSE;.}.i
13420 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70  nt sqlite3Cantop
13430 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  enError(int line
13440 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
13450 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13460 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
13470 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
13480 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a  LITE_CANTOPEN, .
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
134a0 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20  annot open file 
134b0 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
134c0 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
134d0 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
134e0 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
134f0 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
13500 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
13510 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
13520 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
13530 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ED./*.** This is
13540 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72   a convenience r
13550 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65  outine that make
13560 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  s sure that all 
13570 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a  thread-specific.
13580 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  ** data for this
13590 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e   thread has been
135a0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a   deallocated..**
135b0 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f  .** SQLite no lo
135c0 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64  nger uses thread
135d0 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73  -specific data s
135e0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
135f0 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  s now a.** no-op
13600 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65  .  It is retaine
13610 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  d for historical
13620 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a   compatibility..
13630 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
13640 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76  thread_cleanup(v
13650 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oid){.}.#endif..
13660 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74  /*.** Return met
13670 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  a information ab
13680 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63  out a specific c
13690 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62  olumn of a datab
136a0 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65  ase table..** Se
136b0 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c  e comment in sql
136c0 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68  ite3.h (sqlite.h
136d0 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73  .in) for details
136e0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
136f0 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
13700 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71  _METADATA.int sq
13710 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
13720 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73  mn_metadata(.  s
13730 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
13740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
13750 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
13760 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13770 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20  *zDbName,       
13780 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
13790 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  e or NULL */.  c
137a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
137b0 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61  eName,     /* Ta
137c0 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ble name */.  co
137d0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
137e0 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c  nName,    /* Col
137f0 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
13800 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74  ar const **pzDat
13810 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54  aType,    /* OUT
13820 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61  PUT: Declared da
13830 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  ta type */.  cha
13840 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c  r const **pzColl
13850 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50  Seq,     /* OUTP
13860 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  UT: Collation se
13870 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20  quence name */. 
13880 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20   int *pNotNull, 
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138a0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
138b0 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
138c0 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  int exists */.  
138d0 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  int *pPrimaryKey
138e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
138f0 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
13900 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b  olumn part of PK
13910 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f   */.  int *pAuto
13920 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  inc             
13930 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
13940 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61  e if column is a
13950 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f  uto-increment */
13960 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
13970 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
13980 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
13990 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
139a0 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
139b0 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f  iCol;..  char co
139c0 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d  nst *zDataType =
139d0 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
139e0 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a   *zCollSeq = 0;.
139f0 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20    int notnull = 
13a00 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  0;.  int primary
13a10 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  key = 0;.  int a
13a20 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f  utoinc = 0;..  /
13a30 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74  * Ensure the dat
13a40 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
13a50 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a   been loaded */.
13a60 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13a70 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
13a80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13a90 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
13aa0 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
13ab0 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  (db, &zErrMsg);.
13ac0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
13ad0 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =rc ){.    goto 
13ae0 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
13af0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
13b00 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
13b10 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71  n */.  pTab = sq
13b20 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
13b30 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  b, zTableName, z
13b40 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  DbName);.  if( !
13b50 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53  pTab || pTab->pS
13b60 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61  elect ){.    pTa
13b70 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  b = 0;.    goto 
13b80 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
13b90 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f    /* Find the co
13ba0 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69  lumn for which i
13bb0 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64  nfo is requested
13bc0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
13bd0 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e  3IsRowid(zColumn
13be0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f  Name) ){.    iCo
13bf0 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
13c00 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
13c10 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d   ){.      pCol =
13c20 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
13c30 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  l];.    }.  }els
13c40 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  e{.    for(iCol=
13c50 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
13c60 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
13c70 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
13c80 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
13c90 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
13ca0 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
13cb0 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d  Name, zColumnNam
13cc0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
13cd0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
13ce0 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
13cf0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
13d00 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20       pTab = 0;. 
13d10 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
13d20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
13d30 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
13d40 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20  ng block stores 
13d50 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  the meta informa
13d60 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62  tion that will b
13d70 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  e returned.  ** 
13d80 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  to the caller in
13d90 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
13da0 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c   zDataType, zCol
13db0 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70  lSeq, notnull, p
13dc0 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61  rimarykey.  ** a
13dd0 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74  nd autoinc. At t
13de0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
13df0 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c  are two possibil
13e00 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a  ities:.  ** .  *
13e10 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65  *     1. The spe
13e20 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  cified column na
13e30 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22  me was rowid", "
13e40 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f  oid" or "_rowid_
13e50 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61  " .  **        a
13e60 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65  nd there is no e
13e70 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
13e80 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a  ed IPK column. .
13e90 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e    **.  **     2.
13ea0 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   The table is no
13eb0 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  t a view and the
13ec0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65   column name ide
13ed0 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a  ntified an .  **
13ee0 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74          explicit
13ef0 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
13f00 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e  mn. Copy meta in
13f10 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a  formation from *
13f20 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  pCol..  */ .  if
13f30 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44  ( pCol ){.    zD
13f40 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e  ataType = pCol->
13f50 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c  zType;.    zColl
13f60 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  Seq = pCol->zCol
13f70 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d  l;.    notnull =
13f80 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d   pCol->notNull!=
13f90 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  0;.    primaryke
13fa0 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69  y  = pCol->isPri
13fb0 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61 75 74  mKey!=0;.    aut
13fc0 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
13fd0 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
13fe0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
13ff0 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
14000 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
14010 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
14020 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
14030 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
14040 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
14050 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
14060 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
14070 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
14080 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
14090 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
140a0 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
140b0 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
140c0 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
140d0 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
140e0 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
140f0 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
14100 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
14110 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
14120 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
14130 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
14140 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
14150 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
14160 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
14170 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
14180 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
14190 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
141a0 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
141b0 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
141c0 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
141d0 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
141e0 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
141f0 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
14200 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
14210 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
14220 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
14230 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
14240 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
14250 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
14260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
14270 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
14280 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
14290 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
142a0 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
142b0 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
142c0 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
142d0 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
142e0 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
142f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
14300 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
14310 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
14320 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
14330 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
14340 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
14350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
14360 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
14370 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14380 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
14390 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
143a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c  #endif../*.** Sl
143b0 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
143c0 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
143d0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
143e0 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74  me slept..*/.int
143f0 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69   sqlite3_sleep(i
14400 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65  nt ms){.  sqlite
14410 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69  3_vfs *pVfs;.  i
14420 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20  nt rc;.  pVfs = 
14430 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
14440 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d  (0);.  if( pVfs=
14450 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
14460 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
14470 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c  on works in mill
14480 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68  iseconds, but th
14490 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53  e underlying OsS
144a0 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49  leep() .  ** API
144b0 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e   uses microsecon
144c0 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30  ds. Hence the 10
144d0 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  00's..  */.  rc 
144e0 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  = (sqlite3OsSlee
144f0 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29  p(pVfs, 1000*ms)
14500 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  /1000);.  return
14510 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
14520 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
14530 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73  the extended res
14540 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e  ult codes..*/.in
14550 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
14560 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
14570 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
14580 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74   onoff){.  sqlit
14590 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
145a0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
145b0 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66  >errMask = onoff
145c0 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
145d0 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  0xff;.  sqlite3_
145e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
145f0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
14600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14610 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
14620 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74  xFileControl met
14630 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75  hod on a particu
14640 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  lar database..*/
14650 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c  .int sqlite3_fil
14660 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  e_control(sqlite
14670 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
14680 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20  r *zDbName, int 
14690 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
146a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
146b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20  TE_ERROR;.  int 
146c0 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  iDb;.  sqlite3_m
146d0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
146e0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62  utex);.  if( zDb
146f0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
14700 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Db = 0;.  }else{
14710 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20  .    for(iDb=0; 
14720 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
14730 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
14740 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44  trcmp(db->aDb[iD
14750 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  b].zName, zDbNam
14760 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
14770 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
14780 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20  Db<db->nDb ){.  
14790 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
147a0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
147b0 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 72  Bt;.    if( pBtr
147c0 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  ee ){.      Page
147d0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20  r *pPager;.     
147e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
147f0 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
14800 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
14810 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
14820 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
14830 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  ager(pBtree);.  
14840 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14850 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  er!=0 );.      f
14860 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
14870 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
14880 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d      assert( fd!=
14890 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  0 );.      if( o
148a0 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
148b0 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a  FILE_POINTER ){.
148c0 20 20 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65          *(sqlite
148d0 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
148e0 66 64 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  fd;.        rc =
148f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14900 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e    }else if( fd->
14910 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
14920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14930 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64  OsFileControl(fd
14940 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20  , op, pArg);.   
14950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14960 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
14970 54 46 4f 55 4e 44 3b 0a 20 20 20 20 20 20 7d 0a  TFOUND;.      }.
14980 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14990 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
149a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
149b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
149c0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
149d0 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a  eturn rc;   .}..
149e0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  /*.** Interface 
149f0 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c  to the testing l
14a00 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ogic..*/.int sql
14a10 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
14a20 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  l(int op, ...){.
14a30 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
14a40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14a50 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20  T_BUILTIN_TEST. 
14a60 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
14a70 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
14a80 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
14a90 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
14aa0 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
14ab0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
14ac0 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  NG..    */.    c
14ad0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
14ae0 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b  TRL_PRNG_SAVE: {
14af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
14b00 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20  ngSaveState();. 
14b10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14b20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
14b30 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61   Restore the sta
14b40 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74  te of the PRNG t
14b50 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65  o the last state
14b60 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20   saved using.   
14b70 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20   ** PRNG_SAVE.  
14b80 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73  If PRNG_SAVE has
14b90 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
14ba0 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a  en called, then.
14bb0 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62      ** this verb
14bc0 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f   acts like PRNG_
14bd0 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20  RESET..    */.  
14be0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
14bf0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
14c00 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ORE: {.      sql
14c10 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53  ite3PrngRestoreS
14c20 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
14c30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
14c40 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20  /*.    ** Reset 
14c50 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f  the PRNG back to
14c60 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a   its uninitializ
14c70 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e  ed state.  The n
14c80 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ext call.    ** 
14c90 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  to sqlite3_rando
14ca0 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73  mness() will res
14cb0 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69  eed the PRNG usi
14cc0 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c  ng a single call
14cd0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  .    ** to the x
14ce0 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f  Randomness metho
14cf0 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  d of the default
14d00 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   VFS..    */.   
14d10 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
14d20 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
14d30 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
14d40 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65 28  3PrngResetState(
14d50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14d60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
14d70 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
14d80 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45  st_control(BITVE
14d90 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72  C_TEST, size, pr
14da0 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20  ogram).    **.  
14db0 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20    ** Run a test 
14dc0 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63  against a Bitvec
14dd0 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e   object of size.
14de0 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72    The program ar
14df0 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73  gument.    ** is
14e00 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
14e10 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e  egers that defin
14e20 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65  es the test.  Re
14e30 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20  turn -1 on a.   
14e40 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
14e50 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f  ation error, 0 o
14e60 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f  n success, or no
14e70 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72  n-zero for an er
14e80 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  ror..    ** See 
14e90 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65  the sqlite3Bitve
14ea0 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66  cBuiltinTest() f
14eb0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
14ec0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
14ed0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
14ee0 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
14ef0 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20  C_TEST: {.      
14f00 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
14f10 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
14f20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f  int *aProg = va_
14f30 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
14f40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14f50 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
14f60 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20  st(sz, aProg);. 
14f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14f80 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
14f90 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
14fa0 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41  ontrol(BENIGN_MA
14fb0 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67  LLOC_HOOKS, xBeg
14fc0 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a  in, xEnd).    **
14fd0 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72  .    ** Register
14fe0 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74   hooks to call t
14ff0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  o indicate which
15000 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
15010 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62  es .    ** are b
15020 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  enign..    */.  
15030 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
15040 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
15050 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20  LLOC_HOOKS: {.  
15060 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
15070 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e   (*void_function
15080 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76  )(void);.      v
15090 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
150a0 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20  nignBegin;.     
150b0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
150c0 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20  BenignEnd;.     
150d0 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20   xBenignBegin = 
150e0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
150f0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
15100 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61   xBenignEnd = va
15110 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
15120 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  nction);.      s
15130 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c  qlite3BenignMall
15140 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42  ocHooks(xBenignB
15150 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64  egin, xBenignEnd
15160 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15170 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
15180 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
15190 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
151a0 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
151b0 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65  NG_BYTE, unsigne
151c0 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  d int X).    **.
151d0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50      ** Set the P
151e0 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74  ENDING byte to t
151f0 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
15200 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30  argument, if X>0
15210 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f  ..    ** Make no
15220 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30   changes if X==0
15230 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  .  Return the va
15240 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69  lue of the pendi
15250 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61  ng byte.    ** a
15260 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65  s it existing be
15270 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
15280 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  e was called..  
15290 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f    **.    ** IMPO
152a0 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67  RTANT:  Changing
152b0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
152c0 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30  e from 0x4000000
152d0 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20  0 results in.   
152e0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   ** an incompati
152f0 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ble database fil
15300 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67  e format.  Chang
15310 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
15320 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  byte.    ** whil
15330 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63  e any database c
15340 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
15350 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64  n results in und
15360 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a  efined and.    *
15370 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65  * dileterious be
15380 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  havior..    */. 
15390 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
153a0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
153b0 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63  BYTE: {.      rc
153c0 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
153d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
153e0 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b  OMIT_WSD.      {
153f0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
15400 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76  d int newVal = v
15410 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
15420 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ed int);.       
15430 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71   if( newVal ) sq
15440 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65  lite3PendingByte
15450 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20   = newVal;.     
15460 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
15470 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15480 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
15490 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
154a0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
154b0 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29  L_ASSERT, int X)
154c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
154d0 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
154e0 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
154f0 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
15500 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a  er or not.    **
15510 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e   assert() was en
15520 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
15530 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20  -time.  If X is 
15540 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28  true and assert(
15550 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62  ).    ** is enab
15560 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
15570 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72  turn value is tr
15580 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  ue.  If X is tru
15590 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73  e and.    ** ass
155a0 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
155b0 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
155c0 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
155d0 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a  .  If X is.    *
155e0 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  * false and asse
155f0 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c  rt() is enabled,
15600 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74   then the assert
15610 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68  ion fires and th
15620 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
15630 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69   aborts.  If X i
15640 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  s false and asse
15650 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
15660 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
15670 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
15680 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  s zero..    */. 
15690 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
156a0 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20  ESTCTRL_ASSERT: 
156b0 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65  {.      volatile
156c0 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20   int x = 0;.    
156d0 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20 76    assert( (x = v
156e0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d  a_arg(ap,int))!=
156f0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
15700 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
15710 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20      }...    /*. 
15720 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
15730 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
15740 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
15750 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  YS, int X).    *
15760 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
15770 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
15780 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
15790 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57   see how the ALW
157a0 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e  AYS and.    ** N
157b0 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65  EVER macros were
157c0 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70   defined at comp
157d0 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a  ile-time..    **
157e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75  .    ** The retu
157f0 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41  rn value is ALWA
15800 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a  YS(X).  .    **.
15810 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d      ** The recom
15820 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20 58  mended test is X
15830 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65 74  ==2.  If the ret
15840 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20  urn value is 2, 
15850 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  that means.    *
15860 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  * ALWAYS() and N
15870 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68 20  EVER() are both 
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 2c 20 77 68 69 63 68  gh macros, which
158a0 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   is the.    ** d
158b0 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20  efault setting. 
158c0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
158d0 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20  alue is 1, then 
158e0 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74 68  ALWAYS() is eith
158f0 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63  er.    ** hard-c
15900 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20  oded to true or 
15910 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73 20  else it asserts 
15920 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  if its argument 
15930 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
15940 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61 76   The first behav
15950 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20  ior (hard-coded 
15960 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65 20  to true) is the 
15970 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
15980 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
15990 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
159a0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
159b0 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65  abled and the se
159c0 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61  cond.    ** beha
159d0 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66 20  vior (assert if 
159e0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
159f0 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c 73  ALWAYS() is fals
15a00 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
15a10 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
15a20 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
15a30 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
15a40 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  t() is enabled..
15a50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
15a60 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  e run-time test 
15a70 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20  procedure might 
15a80 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c  look something l
15a90 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
15aa0 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73  .    **    if( s
15ab0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
15ac0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
15ad0 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d  TRL_ALWAYS, 2)==
15ae0 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  2 ){.    **     
15af0 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64   // ALWAYS() and
15b00 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d   NEVER() are no-
15b10 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
15b20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20  macros.    **   
15b30 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
15b40 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
15b50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15b60 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20  ASSERT, 1) ){.  
15b70 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
15b80 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20 74  AYS(x) asserts t
15b90 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e  hat x is true. N
15ba0 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73 20  EVER(x) asserts 
15bb0 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  x is false..    
15bc0 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  **    }else{.   
15bd0 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
15be0 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  YS(x) is a const
15bf0 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29  ant 1.  NEVER(x)
15c00 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30   is a constant 0
15c10 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20  ..    **    }.  
15c20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
15c30 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
15c40 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WAYS: {.      in
15c50 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
15c60 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
15c70 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20   ALWAYS(x);.    
15c80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15c90 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
15ca0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
15cb0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
15cc0 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a  SERVE, sqlite3 *
15cd0 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
15ce0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
15cf0 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74   nReserve size t
15d00 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  o N for the main
15d10 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65   database on the
15d20 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
15d30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
15d40 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15d50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15d60 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20  RESERVE: {.     
15d70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
15d80 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
15d90 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
15da0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
15db0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15dc0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
15dd0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
15de0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
15df0 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  geSize(db->aDb[0
15e00 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b  ].pBt, 0, x, 0);
15e10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
15e20 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
15e30 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
15e40 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
15e50 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
15e60 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
15e70 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
15e80 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a  TIONS, sqlite3 *
15e90 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
15ea0 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20  *.    ** Enable 
15eb0 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f  or disable vario
15ec0 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
15ed0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
15ee0 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20  poses.  The .   
15ef0 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69   ** argument N i
15f00 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f  s a bitmask of o
15f10 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20  ptimizations to 
15f20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f  be disabled.  Fo
15f30 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20  r normal.    ** 
15f40 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75  operation N shou
15f50 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64  ld be 0.  The id
15f60 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73  ea is that a tes
15f70 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20  t program (like 
15f80 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c  the.    ** SQL L
15f90 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54  ogic Test or SLT
15fa0 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61   test module) ca
15fb0 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53  n run the same S
15fc0 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  QL multiple time
15fd0 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61  s.    ** with va
15fe0 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
15ff0 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20  ons disabled to 
16000 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
16010 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20  same answer.    
16020 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ** is obtained i
16030 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20  n every case..  
16040 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
16050 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
16060 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20  TIMIZATIONS: {. 
16070 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
16080 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
16090 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69  lite3*);.      i
160a0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
160b0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64 62 2d  ,int);.      db-
160c0 3e 66 6c 61 67 73 20 3d 20 28 78 20 26 20 53 51  >flags = (x & SQ
160d0 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 20 7c 20  LITE_OptMask) | 
160e0 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 7e 53 51  (db->flags & ~SQ
160f0 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 3b 0a 20  LITE_OptMask);. 
16100 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16110 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
16120 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f  _N_KEYWORD.    /
16130 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
16140 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
16150 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
16160 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
16170 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ord).    **.    
16180 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61  ** If zWord is a
16190 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69   keyword recogni
161a0 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  zed by the parse
161b0 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  r, then return t
161c0 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
161d0 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f   of keywords.  O
161e0 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f  r if zWord is no
161f0 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74  t a keyword, ret
16200 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20  urn 0..    ** . 
16210 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
16220 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20  feature is only 
16230 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
16240 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69   amalgamation si
16250 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53  nce.    ** the S
16260 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
16270 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66  macro is not def
16280 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
16290 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20  e if SQLite.    
162a0 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e  ** is built usin
162b0 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63  g separate sourc
162c0 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
162d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
162e0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
162f0 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RD: {.      cons
16300 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20  t char *zWord = 
16310 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
16320 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69   char*);.      i
16330 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
16340 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20  rlen30(zWord);. 
16350 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74       rc = (sqlit
16360 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75  e3KeywordCode((u
16370 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b  8*)zWord, n)!=TK
16380 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f  _ID) ? SQLITE_N_
16390 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20  KEYWORD : 0;.   
163a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
163b0 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20  #endif ..    /* 
163c0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
163d0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
163e0 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
163f0 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70  OC, sz, &pNew, p
16400 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  Free);.    **.  
16410 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20    ** Pass pFree 
16420 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61  into sqlite3Scra
16430 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20  tchFree(). .    
16440 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20  ** If sz>0 then 
16450 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74  allocate a scrat
16460 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70  ch buffer into p
16470 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  New.  .    */.  
16480 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
16490 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
164a0 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f  LLOC: {.      vo
164b0 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e  id *pFree, **ppN
164c0 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  ew;.      int sz
164d0 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f  ;.      sz = va_
164e0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
164f0 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61      ppNew = va_a
16500 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a  rg(ap, void**);.
16510 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61        pFree = va
16520 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
16530 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20  .      if( sz ) 
16540 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  *ppNew = sqlite3
16550 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a  ScratchMalloc(sz
16560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16570 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65  ScratchFree(pFre
16580 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
16590 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
165a0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
165b0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
165c0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
165d0 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66  FAULT, int onoff
165e0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
165f0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e   If parameter on
16600 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  off is non-zero,
16610 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77   configure the w
16620 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20  rappers so that 
16630 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  all.    ** subse
16640 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c  quent calls to l
16650 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76  ocaltime() and v
16660 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66  ariants fail. If
16670 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a   onoff is zero,.
16680 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73      ** undo this
16690 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
166a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
166b0 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
166c0 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
166d0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
166e0 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d  Config.bLocaltim
166f0 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28  eFault = va_arg(
16700 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
16710 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
16720 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
16730 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
16740 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20 73  LAIN).    /*   s
16750 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
16760 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
16770 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54  TRL_EXPLAIN_STMT
16780 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ,.    **        
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63 6f  sqlite3_stmt*,co
167b0 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20  nst char**);.   
167c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63 6f   **.    ** If co
167d0 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
167e0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
167f0 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71 6c  XPLAIN, each sql
16800 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73 0a  ite3_stmt holds.
16810 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67 20      ** a string 
16820 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
16830 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61 72  he optimized par
16840 73 65 20 74 72 65 65 2e 20 20 54 68 69 73 20 74  se tree.  This t
16850 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20  est-control.    
16860 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
16870 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74 72  nter to that str
16880 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
16890 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
168a0 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d  CTRL_EXPLAIN_STM
168b0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
168c0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
168d0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
168e0 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20 20  te3_stmt*);.    
168f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
16900 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61 70  zRet = va_arg(ap
16910 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b  , const char**);
16920 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d 20  .      *pzRet = 
16930 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
16940 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70 53  nation((Vdbe*)pS
16950 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tmt);.      brea
16960 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
16970 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
16980 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
16990 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
169a0 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
169b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
169c0 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
169d0 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
169e0 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
169f0 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
16a00 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
16a10 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
16a20 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
16a30 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
16a40 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
16a50 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
16a60 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
16a70 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
16a80 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
16a90 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
16aa0 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
16ab0 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
16ac0 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
16ad0 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
16ae0 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
16af0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
16b00 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
16b10 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
16b20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
16b30 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
16b40 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
16b50 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
16b60 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
16b70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
16b80 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
16b90 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
16ba0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
16bb0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
16bc0 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
16bd0 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
16be0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
16bf0 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
16c00 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
16c10 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
16c20 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
16c30 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  lename==0 ) retu
16c40 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  rn 0;.  zFilenam
16c50 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
16c60 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
16c70 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46  + 1;.  while( zF
16c80 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
16c90 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70    int x = strcmp
16ca0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
16cb0 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  am);.    zFilena
16cc0 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
16cd0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
16ce0 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d   + 1;.    if( x=
16cf0 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c  =0 ) return zFil
16d00 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65  ename;.    zFile
16d10 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
16d20 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
16d30 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65  e) + 1;.  }.  re
16d40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
16d50 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61   Return a boolea
16d60 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  n value for a qu
16d70 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
16d80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72  /.int sqlite3_ur
16d90 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  i_boolean(const 
16da0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
16db0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
16dc0 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b  ram, int bDflt){
16dd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16de0 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
16df0 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
16e00 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62  me, zParam);.  b
16e10 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b  Dflt = bDflt!=0;
16e20 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71  .  return z ? sq
16e30 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
16e40 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c  z, bDflt) : bDfl
16e50 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
16e60 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  rn a 64-bit inte
16e70 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ger value for a 
16e80 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
16e90 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
16ea0 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e  4 sqlite3_uri_in
16eb0 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  t64(.  const cha
16ec0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
16ed0 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20   /* Filename as 
16ee0 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20  passed to xOpen 
16ef0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
16f00 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f  *zParam,       /
16f10 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20  * URI parameter 
16f20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69  sought */.  sqli
16f30 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20  te3_int64 bDflt 
16f40 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
16f50 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  if parameter is 
16f60 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  missing */.){.  
16f70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
16f80 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
16f90 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
16fa0 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69   zParam);.  sqli
16fb0 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69  te3_int64 v;.  i
16fc0 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 41  f( z && sqlite3A
16fd0 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20 73 71 6c  toi64(z, &v, sql
16fe0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
16ff0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3d 3d 53   SQLITE_UTF8)==S
17000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17010 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
17020 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
17030 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17040 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74  he filename of t
17050 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
17060 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
17070 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
17080 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
17090 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  har *sqlite3_db_
170a0 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33  filename(sqlite3
170b0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
170c0 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
170d0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
170e0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
170f0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
17100 5b 69 5d 2e 70 42 74 20 26 26 20 73 71 6c 69 74  [i].pBt && sqlit
17110 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d  e3StrICmp(zDbNam
17120 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  e, db->aDb[i].zN
17130 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
17140 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
17150 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
17160 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b  db->aDb[i].pBt);
17170 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17180 75 72 6e 20 30 3b 0a 7d 0a                       urn 0;.}.