/ Hex Artifact Content
Login

Artifact 3977ac9c4f6cf7382258b6e92f8bedb5a3e52527:


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 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2770: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f  LITE_OMIT_SHUTDO
2780: 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20  WN_DIRECTORIES. 
2790: 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73     /* The heap s
27a0: 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77  ubsystem has now
27b0: 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61   been shutdown a
27c0: 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  nd these values 
27d0: 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20  are supposed.   
27e0: 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f   ** to be NULL o
27f0: 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72  r point to memor
2800: 79 20 74 68 61 74 20 77 61 73 20 6f 62 74 61 69  y that was obtai
2810: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2820: 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a  _malloc(),.    *
2830: 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65  * which would re
2840: 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20  ly on that heap 
2850: 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65  subsystem; there
2860: 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  fore, make sure 
2870: 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c  these.    ** val
2880: 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72  ues cannot refer
2890: 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20   to heap memory 
28a0: 74 68 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e  that was just in
28b0: 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74  validated when t
28c0: 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73  he.    ** heap s
28d0: 75 62 73 79 73 74 65 6d 20 77 61 73 20 73 68 75  ubsystem was shu
28e0: 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20  tdown.  This is 
28f0: 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65  only done if the
2900: 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f   current call to
2910: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
2920: 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69  ction resulted i
2930: 6e 20 74 68 65 20 68 65 61 70 20 73 75 62 73 79  n the heap subsy
2940: 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65  stem actually be
2950: 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20  ing shutdown..  
2960: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2970: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2980: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2990: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
29a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  = 0;.#endif.  }.
29b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
29c0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
29d0: 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  xInit ){.    sql
29e0: 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a  ite3MutexEnd();.
29f0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2a00: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2a10: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nit = 0;.  }..  
2a20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2a40: 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69  API allows appli
2a50: 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66  cations to modif
2a60: 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e  y the global con
2a70: 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a  figuration of.**
2a80: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
2a90: 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ary at run-time.
2aa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ab0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
2ac0: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
2ad0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
2ae0: 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62  tanding.** datab
2af0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
2b00: 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  or memory alloca
2b10: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75  tions.  This rou
2b20: 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74  tine is not.** t
2b30: 68 72 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c  hreadsafe.  Fail
2b40: 75 72 65 20 74 6f 20 68 65 65 64 20 74 68 65 73  ure to heed thes
2b50: 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c  e warnings can l
2b60: 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74  ead to unpredict
2b70: 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72  able.** behavior
2b80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b90: 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20  _config(int op, 
2ba0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2bb0: 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ap;.  int rc = S
2bc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2bd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
2be0: 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51   shall return SQ
2bf0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69  LITE_MISUSE if i
2c00: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69  t is invoked whi
2c10: 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69  le.  ** the SQLi
2c20: 74 65 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e  te library is in
2c30: 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73   use. */.  if( s
2c40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c50: 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75  ig.isInit ) retu
2c60: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
2c70: 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61  _BKPT;..  va_sta
2c80: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
2c90: 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
2ca0: 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67   /* Mutex config
2cb0: 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
2cc0: 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  are only availab
2cd0: 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73 61  le in a threadsa
2ce0: 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  fe.    ** compil
2cf0: 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64  e. .    */.#if d
2d00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
2d10: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
2d20: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
2d30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d40: 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
2d50: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2d60: 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74   Disable all mut
2d70: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
2d80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2d90: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
2da0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
2db0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
2dc0: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20  llMutex = 0;.   
2dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2df0: 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45  CONFIG_MULTITHRE
2e00: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2e10: 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  isable mutexing 
2e20: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  of database conn
2e30: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  ections */.     
2e40: 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78   /* Enable mutex
2e50: 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61  ing of core data
2e60: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
2e70: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2e80: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
2e90: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  tex = 1;.      s
2ea0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2eb0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
2ec0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
2ed0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2ee0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52  QLITE_CONFIG_SER
2ef0: 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20  IALIZED: {.     
2f00: 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d   /* Enable all m
2f10: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2f20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f30: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2f40: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2f50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2f60: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20  FullMutex = 1;. 
2f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f80: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f90: 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20  E_CONFIG_MUTEX: 
2fa0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
2fb0: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
2fc0: 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  e mutex implemen
2fd0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2fe0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ff0: 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f  fig.mutex = *va_
3000: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3010: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b  mutex_methods*);
3020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3030: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3040: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55  ITE_CONFIG_GETMU
3050: 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TEX: {.      /* 
3060: 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72  Retrieve the cur
3070: 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65  rent mutex imple
3080: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
3090: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
30a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
30b0: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
30c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
30d0: 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ex;.      break;
30e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .    }.#endif...
30f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3100: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b  CONFIG_MALLOC: {
3110: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
3120: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
3130: 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e   malloc implemen
3140: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3150: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3160: 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28  fig.m = *va_arg(
3170: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
3180: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
3190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
31a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
31b0: 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20  NFIG_GETMALLOC: 
31c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69  {.      /* Retri
31d0: 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  eve the current 
31e0: 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65  malloc() impleme
31f0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3200: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3210: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
3220: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
3230: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
3240: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3250: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3260: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
3270: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b  3GlobalConfig.m;
3280: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3290: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
32a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
32b0: 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATUS: {.      /*
32c0: 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
32d0: 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74  le the malloc st
32e0: 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20  atus collection 
32f0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3300: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3310: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
3320: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3340: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3350: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
3360: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
3370: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73 63   a buffer for sc
3380: 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61  ratch memory spa
3390: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
33a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
33b0: 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  pScratch = va_ar
33c0: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
33d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
33e0: 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63  lConfig.szScratc
33f0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3400: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3410: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3420: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
3430: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3450: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3460: 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20  NFIG_PAGECACHE: 
3470: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67  {.      /* Desig
3480: 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f  nate a buffer fo
3490: 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d  r page cache mem
34a0: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
34b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
34c0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
34d0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
34e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
34f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
3500: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
3510: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
3520: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3530: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
3540: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3550: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3560: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3570: 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20  FIG_PCACHE: {.  
3580: 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
3590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
35b0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
35c0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
35d0: 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  now an error */.
35e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3600: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3610: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3620: 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20  FIG_PCACHE2: {. 
3630: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3640: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
3650: 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d  age cache implem
3660: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3670: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3680: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20  onfig.pcache2 = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
36b0: 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ds2*);.      bre
36c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
36d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
36e0: 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20  _GETPCACHE2: {. 
36f0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3700: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
3710: 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b  che2.xInit==0 ){
3720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3730: 50 43 61 63 68 65 53 65 74 44 65 66 61 75 6c 74  PCacheSetDefault
3740: 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
3750: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
3760: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3770: 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65  hods2*) = sqlite
3780: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
3790: 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65  ache2;.      bre
37a0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  ak;.    }..#if d
37b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
37c0: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
37d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
37e0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
37f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3800: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
3810: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
3820: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 68  e a buffer for h
3830: 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  eap memory space
3840: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3850: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
3860: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
3870: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3880: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3890: 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72  ig.nHeap = va_ar
38a0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
38b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
38c0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61  onfig.mnReq = va
38d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a  _arg(ap, int);..
38e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
38f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3900: 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20  Req<1 ){.       
3910: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3920: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a  nfig.mnReq = 1;.
3930: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3940: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3950: 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32  fig.mnReq>(1<<12
3960: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
3970: 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20  cap min request 
3980: 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a  size at 2^12 */.
3990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
39a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
39b0: 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20  q = (1<<12);.   
39c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
39d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39e0: 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a  fig.pHeap==0 ){.
39f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
3a00: 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69  e heap pointer i
3a10: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73  s NULL, then res
3a20: 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  tore the malloc 
3a30: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
3a40: 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74         ** back t
3a50: 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
3a60: 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  too.  This will 
3a70: 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63  cause the malloc
3a80: 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a   to go.        *
3a90: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65  * back to its de
3aa0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
3ab0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
3ac0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
3ad0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e  s.        ** run
3ae0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
3af0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c       memset(&sql
3b00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b10: 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  .m, 0, sizeof(sq
3b20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3b30: 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g.m));.      }el
3b40: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
3b50: 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20  he heap pointer 
3b60: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
3b70: 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66  n install one of
3b80: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
3b90: 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65  mem5.c/mem3.c me
3ba0: 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65  thods. If neithe
3bb0: 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  r ENABLE_MEMSYS3
3bc0: 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   nor.        ** 
3bd0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69  ENABLE_MEMSYS5 i
3be0: 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72  s defined, retur
3bf0: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
3c00: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
3c10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
3c20: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
3c30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c40: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
3c50: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
3c60: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
3c70: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3c80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3c90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
3ca0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
3cb0: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
3cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3cd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3ce0: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
3cf0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
3d00: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
3d10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3d20: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
3d30: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3d50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
3d60: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
3d70: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3d80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d90: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61  .    /* Record a
3da0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3db0: 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69 6f 6e  logger funcction
3dc0: 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61   and its first a
3dd0: 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20  rgument..    ** 
3de0: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e  The default is N
3df0: 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73  ULL.  Logging is
3e00: 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65   disabled if the
3e10: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
3e20: 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c  r is.    ** NULL
3e30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3e40: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3e50: 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOG: {.      /* 
3e60: 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62  MSVC is picky ab
3e70: 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63  out pulling func
3e80: 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69   ptrs from va li
3e90: 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74  sts..      ** ht
3ea0: 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63  tp://support.mic
3eb0: 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37  rosoft.com/kb/47
3ec0: 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  961.      ** sql
3ed0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3ee0: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
3ef0: 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a  p, void(*)(void*
3f00: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
3f10: 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
3f20: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
3f30: 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64  *LOGFUNC_t)(void
3f40: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
3f50: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
3f70: 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
3f80: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
3f90: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3fa0: 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20  onfig.pLogArg = 
3fb0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
3fc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
3fe0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
3ff0: 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  I: {.      sqlit
4000: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
4010: 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67  OpenUri = va_arg
4020: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4040: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4050: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4060: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
4070: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4080: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
4090: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
40a0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f  * Set up the loo
40b0: 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66  kaside buffers f
40c0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
40d0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74  nnection..** Ret
40e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
40f0: 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49   success.  .** I
4100: 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61  f lookaside is a
4110: 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72  lready active, r
4120: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4130: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20  Y..**.** The sz 
4140: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
4150: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4160: 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69   in each lookasi
4170: 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20  de slot..** The 
4180: 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  cnt parameter is
4190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
41a0: 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74  lots.  If pStart
41b0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20   is NULL the.** 
41c0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f  space for the lo
41d0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
41e0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
41f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4200: 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69  ..** If pStart i
4210: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4220: 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74  it is sz*cnt byt
4230: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  es of memory to 
4240: 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c  use for.** the l
4250: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
4260: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4270: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71  etupLookaside(sq
4280: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4290: 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69  *pBuf, int sz, i
42a0: 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20  nt cnt){.  void 
42b0: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
42c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
42d0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
42e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
42f0: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
4300: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
4310: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
4320: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
4330: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
4340: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
4350: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
4360: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
4370: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
4380: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
4390: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
43a0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
43b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
43c0: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
43d0: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
43e0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
43f0: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66  ookaside slot af
4400: 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e  ter ROUNDDOWN8 n
4410: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
4420: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f  r.  ** than a po
4430: 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66  inter to be usef
4440: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20  ul..  */.  sz = 
4450: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
4460: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
4470: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20  -09382 */.  if( 
4480: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
4490: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
44a0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
44b0: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
44c0: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
44d0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
44e0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
44f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
4500: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
4510: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
4520: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4530: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
4540: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
4550: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
4560: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
4570: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
4580: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
4590: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
45a0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
45b0: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
45c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
45d0: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
45e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
45f0: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
4600: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4610: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
4620: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
4630: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
4640: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
4650: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
4660: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
4670: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
4680: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
4690: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
46a0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
46b0: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
46c0: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
46d0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
46e0: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
46f0: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
4700: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4710: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
4720: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4730: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
4740: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
4750: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4760: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
4770: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4780: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
4790: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
47a0: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
47b0: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
47c0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
47d0: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  End = 0;.    db-
47e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
47f0: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
4800: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
4810: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
4820: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4840: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
4850: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
4860: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4870: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
4880: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
4890: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
48a0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
48b0: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
48c0: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
48d0: 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61   memory as we ca
48e0: 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  n from the given
48f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
4900: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  nection..*/.int 
4910: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
4920: 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65  se_memory(sqlite
4930: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
4940: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4950: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4960: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4970: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
4980: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4990: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
49a0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
49b0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
49c0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
49d0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
49e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
49f0: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
4a00: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
4a10: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4a20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
4a30: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
4a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4a50: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4a60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4a70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4a80: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4a90: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4aa0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4ab0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4ac0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4ad0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
4ae0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
4af0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
4b00: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
4b10: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
4b20: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
4b30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
4b40: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
4b50: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
4b60: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
4b70: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
4b80: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
4b90: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
4ba0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4bb0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
4bc0: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
4bd0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
4be0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4bf0: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
4c00: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
4c10: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
4c20: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
4c30: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
4c40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4c50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4c60: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
4c70: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
4c80: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
4c90: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
4ca0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
4cb0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
4cc0: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
4cd0: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
4ce0: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
4cf0: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
4d00: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
4d10: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
4d20: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
4d30: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
4d40: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
4d50: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
4d60: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
4d70: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
4d80: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
4d90: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
4da0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
4db0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
4dc0: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
4dd0: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
4de0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
4df0: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
4e00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
4e10: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
4e30: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
4e40: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4e50: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
4e60: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
4e70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
4e80: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
4e90: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
4ea0: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
4ec0: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
4ed0: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
4ee0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
4ef0: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
4f00: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
4f10: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
4f20: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
4f30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
4f40: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
4f50: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
4f60: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
4f70: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
4f80: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
4f90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4fa0: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
4fb0: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
4fc0: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
4fd0: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
4fe0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ff0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5000: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
5010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5030: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5040: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5050: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5060: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5070: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
5080: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
5090: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
50a0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
50b0: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
50c0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
50d0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
50e0: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
50f0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
5100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5110: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
5120: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
5130: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
5140: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
5150: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
5160: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
5170: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
5180: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
5190: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
51a0: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
51b0: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
51c0: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
51d0: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
51e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
51f0: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
5200: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
5210: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
5220: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
5230: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
5240: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5250: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
5260: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
5270: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
5280: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
5290: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
52a0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
52b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
52c0: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
52d0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
52e0: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
52f0: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
5300: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
5310: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
5320: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
5330: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
5340: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
5350: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
5360: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
5370: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5380: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
5390: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
53a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
53b0: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
53c0: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
53d0: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
53e0: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
53f0: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
5400: 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndant.** compari
5410: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
5420: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
5430: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
5440: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
5450: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
5460: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
5470: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
5480: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
5490: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
54a0: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
54b0: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
54c0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
54d0: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
54e0: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
54f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
5500: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
5510: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
5520: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
5530: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
5540: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
5550: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
5560: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
5570: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
5580: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
5590: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
55a0: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
55b0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
55c0: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
55d0: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
55e0: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
55f0: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
5600: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
5610: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
5620: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
5630: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
5640: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
5650: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
5660: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5670: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
5680: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5690: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
56a0: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
56b0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
56c0: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
56d0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
56e0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
56f0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
5700: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5710: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5720: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
5730: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5740: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5750: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5760: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5770: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5780: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5790: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
57a0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
57b0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
57c0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
57d0: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
57e0: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
57f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
5800: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
5810: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
5820: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
5830: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5840: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5850: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5860: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5870: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5880: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5890: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
58a0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
58b0: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
58c0: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
58d0: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
58e0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
58f0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
5900: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
5910: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
5920: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
5930: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5940: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5950: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5960: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5970: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5980: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5990: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
59a0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
59b0: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
59c0: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
59d0: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
59e0: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
59f0: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
5a00: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
5a10: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
5a20: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
5a30: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5a40: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5a50: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5a60: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5a70: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5a80: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5a90: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5aa0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5ab0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5ac0: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5ad0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
5ae0: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
5af0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
5b00: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
5b10: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
5b20: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
5b30: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
5b40: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
5b50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5b60: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
5b70: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
5b80: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65  ../*.** Disconne
5b90: 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76  ct all sqlite3_v
5ba0: 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74  tab objects that
5bb0: 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62   belong to datab
5bc0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
5bd0: 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61  * db. This is ca
5be0: 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20  lled when db is 
5bf0: 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f  being closed..*/
5c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
5c10: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73  connectAllVtab(s
5c20: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
5c30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5c40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
5c50: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
5c60: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
5c70: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5c80: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
5c90: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
5ca0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
5cb0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
5cc0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
5cd0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73  ema ){.      Has
5ce0: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20  hElem *p;.      
5cf0: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
5d00: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
5d10: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
5d20: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
5d30: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
5d40: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
5d50: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
5d60: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
5d70: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
5d80: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
5d90: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
5da0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
5db0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
5dc0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
5dd0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
5de0: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
5df0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
5e00: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
5e10: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5e20: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
5e30: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
5e40: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
5e50: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
5e60: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
5e70: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
5e80: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
5e90: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
5ea0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
5eb0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ec0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
5ed0: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
5ee0: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
5ef0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
5f00: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
5f10: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
5f20: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
5f30: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
5f40: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
5f50: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
5f60: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
5f70: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
5f80: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
5f90: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
5fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5fb0: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
5fc0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
5fd0: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
5fe0: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
5ff0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6000: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
6010: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
6020: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
6030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6040: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
6050: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6060: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6070: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
6080: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
6090: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
60a0: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
60b0: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
60c0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
60d0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
60e0: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
60f0: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
6100: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
6110: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
6120: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
6130: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
6140: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
6150: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
6160: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
6170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
6180: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
6190: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
61a0: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
61b0: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
61c0: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
61d0: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
61e0: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
61f0: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
6200: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
6210: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
6220: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
6230: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
6240: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
6250: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6260: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
6270: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
6280: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
6290: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
62a0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
62b0: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
62c0: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
62d0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
62e0: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
62f0: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
6300: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
6310: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6320: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
6330: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
6340: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
6350: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
6360: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
6370: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6380: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
6390: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
63a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
63b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
63c0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
63d0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
63e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f   connection into
63f0: 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68   a zombie and th
6400: 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a  en close it..  *
6410: 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  /.  db->magic = 
6420: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
6430: 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65  BIE;.  sqlite3Le
6440: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
6450: 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65  Zombie(db);.  re
6460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6470: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72  }../*.** Two var
6480: 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70  iations on the p
6490: 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20  ublic interface 
64a0: 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61  for closing a da
64b0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
64c0: 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65  tion. The sqlite
64d0: 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f  3_close() versio
64e0: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
64f0: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61  _BUSY and.** lea
6500: 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ves the connecti
6510: 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65  on option if the
6520: 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a  re are unfinaliz
6530: 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ed prepared.** s
6540: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
6550: 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f  inished sqlite3_
6560: 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71  backups.  The sq
6570: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
6580: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63  .** version forc
6590: 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  es the connectio
65a0: 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f  n to become a zo
65b0: 6d 62 69 65 20 69 66 20 74 68 65 72 65 20 61 72  mbie if there ar
65c0: 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65  e.** unclosed re
65d0: 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72  sources, and arr
65e0: 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f  anges for deallo
65f0: 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  cation when the 
6600: 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20  last.** prepare 
6610: 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c  statement or sql
6620: 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73  ite3_backup clos
6630: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
6640: 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33  e3_close(sqlite3
6650: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
6660: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29  lite3Close(db,0)
6670: 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ; }.int sqlite3_
6680: 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33  close_v2(sqlite3
6690: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
66a0: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29  lite3Close(db,1)
66b0: 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ; }.../*.** Clos
66c0: 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  e the mutex on d
66d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
66e0: 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72  on db..**.** Fur
66f0: 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74  thermore, if dat
6700: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6710: 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20   db is a zombie 
6720: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68  (meaning that th
6730: 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ere.** has been 
6740: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
6750: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
6760: 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ) or sqlite3_clo
6770: 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a  se_v2(db)) and.*
6780: 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f  * every sqlite3_
6790: 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65  stmt has now bee
67a0: 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
67b0: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61  every sqlite3_ba
67c0: 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69  ckup has.** fini
67d0: 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20  shed, then free 
67e0: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  all resources..*
67f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65  /.void sqlite3Le
6800: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
6810: 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a  Zombie(sqlite3 *
6820: 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  db){.  HashElem 
6830: 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *i;             
6840: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
6850: 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f  able iterator */
6860: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
6870: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
6880: 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33  standing sqlite3
6890: 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33  _stmt or sqlite3
68a0: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a  _backup objects.
68b0: 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63    ** or if the c
68c0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f  onnection has no
68d0: 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65  t yet been close
68e0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d by sqlite3_clo
68f0: 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68  se_v2(),.  ** th
6900: 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68  en just leave th
6910: 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75  e mutex and retu
6920: 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  rn..  */.  if( d
6930: 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45  b->magic!=SQLITE
6940: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c  _MAGIC_ZOMBIE ||
6950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
6960: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
6970: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6980: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
6990: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
69a0: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
69b0: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
69c0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ans that the dat
69d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
69e0: 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64   has.  ** closed
69f0: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d   all sqlite3_stm
6a00: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61  t and sqlite3_ba
6a10: 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64  ckup objects and
6a20: 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70   has been.  ** p
6a30: 61 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f  ased to sqlite3_
6a40: 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74  close (meaning t
6a50: 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62  hat it is a zomb
6a60: 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  ie).  Therefore,
6a70: 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61  .  ** go ahead a
6a80: 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  nd free all reso
6a90: 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  urces..  */..  /
6aa0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
6ab0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
6ac0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
6ad0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
6ae0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
6af0: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
6b00: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
6b10: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
6b20: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
6b30: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
6b40: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
6b50: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
6b60: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
6b70: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
6b80: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
6b90: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
6ba0: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
6bb0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
6bc0: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
6bd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
6be0: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
6bf0: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
6c00: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
6c10: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
6c20: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
6c30: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
6c40: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
6c50: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
6c60: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
6c70: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
6c80: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
6c90: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
6ca0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
6cb0: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
6cc0: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
6cd0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
6ce0: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
6cf0: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
6d00: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
6d10: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
6d20: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
6d30: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
6d40: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
6d50: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
6d60: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
6d70: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
6d80: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
6d90: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
6da0: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
6db0: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
6dc0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
6dd0: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
6de0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
6df0: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
6e00: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
6e10: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
6e20: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
6e30: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
6e40: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
6e50: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
6e60: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
6e70: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
6e80: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
6e90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6ea0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
6eb0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
6ec0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
6ed0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
6ee0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
6ef0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
6f00: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
6f10: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
6f20: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
6f30: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
6f40: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
6f50: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
6f60: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
6f70: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
6f80: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
6f90: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
6fa0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
6fb0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
6fc0: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
6fd0: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
6fe0: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
6ff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7000: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7010: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
7020: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
7030: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
7040: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
7050: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7060: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
7070: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7080: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
7090: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
70a0: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
70b0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
70c0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
70d0: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
70e0: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
70f0: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
7100: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
7110: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
7130: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
7140: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
7150: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
7160: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
7170: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
7180: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
7190: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
71a0: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
71b0: 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29    if( db->pErr )
71c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
71d0: 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29  ueFree(db->pErr)
71e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
71f0: 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64  loseExtensions(d
7200: 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  b);..  db->magic
7210: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
7220: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
7230: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
7240: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
7250: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
7260: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
7270: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
7280: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
7290: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
72a0: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
72b0: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
72c0: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
72d0: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
72e0: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
72f0: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
7300: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
7310: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
7320: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
7330: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
7340: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
7350: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
7360: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
7370: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
7380: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
7390: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
73a0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
73b0: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
73c0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
73d0: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
73e0: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
73f0: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
7400: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
7410: 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46  nOut==0 );  /* F
7420: 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73  ails on a lookas
7430: 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  ide memory leak 
7440: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
7450: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
7460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7470: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
7480: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
7490: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
74a0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  b);.}../*.** Rol
74b0: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
74c0: 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72  se files.  If tr
74d0: 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
74e0: 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a  LITE_OK, then.**
74f0: 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
7500: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
7510: 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61  d ("tripped" - a
7520: 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61  s in "tripping a
7530: 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61   circuit.** brea
7540: 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74  ker") and made t
7550: 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64  o return tripCod
7560: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
7570: 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74  ny further.** at
7580: 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68  tempts to use th
7590: 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f  at cursor..*/.vo
75a0: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
75b0: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
75c0: 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  b, int tripCode)
75d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
75e0: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
75f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7600: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
7610: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
7620: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
7630: 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30  loc();.  for(i=0
7640: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
7650: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
7660: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
7670: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
7680: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7690: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
76a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54  ) ){.        inT
76b0: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  rans = 1;.      
76c0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
76d0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
76e0: 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 20  tripCode);.     
76f0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72   db->aDb[i].inTr
7700: 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ans = 0;.    }. 
7710: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
7720: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
7730: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
7740: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
7750: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
7760: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
7770: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
7780: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
7790: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
77a0: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
77b0: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
77c0: 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f  on(db);.  }..  /
77d0: 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63  * Any deferred c
77e0: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
77f0: 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65  ions have now be
7800: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
7810: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
7820: 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ons = 0;..  /* I
7830: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
7840: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
7850: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
7860: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
7870: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
7880: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
7890: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
78a0: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
78b0: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
78c0: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
78d0: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
78e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
78f0: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
7900: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
7910: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
7920: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
7930: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
7940: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
7950: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
7960: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
7970: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
7980: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
7990: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
79a0: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
79b0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
79c0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
79d0: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
79e0: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
79f0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
7a00: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
7a10: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
7a20: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
7a30: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
7a40: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
7a50: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
7a60: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
7a70: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
7a80: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
7a90: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
7aa0: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
7ab0: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
7ac0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
7ad0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
7ae0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
7af0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
7b00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
7b10: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
7b20: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
7b30: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
7b40: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
7b50: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
7b60: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
7b70: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7b80: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
7b90: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
7ba0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
7bb0: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
7bc0: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
7bd0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
7be0: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
7bf0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
7c00: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
7c10: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
7c20: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
7c30: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
7c40: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
7c50: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
7c60: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
7c70: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
7c80: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
7c90: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
7ca0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
7cb0: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
7cc0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
7cd0: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
7ce0: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
7cf0: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
7d00: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
7d10: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
7d20: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
7d30: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
7d40: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
7d50: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
7d60: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
7d70: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
7d80: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
7d90: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
7da0: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
7db0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7dc0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
7dd0: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
7de0: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
7df0: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
7e00: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
7e10: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
7e20: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
7e30: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
7e40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
7e50: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
7e60: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
7e70: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
7e80: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
7e90: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
7ea0: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
7eb0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
7ec0: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
7ed0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
7ee0: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
7ef0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
7f00: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
7f10: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
7f20: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
7f30: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7f40: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
7f50: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
7f60: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
7f70: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
7f80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
7f90: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
7fa0: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
7fb0: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
7fc0: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
7fd0: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
7fe0: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
7ff0: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
8000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8010: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
8020: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
8030: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
8040: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
8050: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
8060: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
8070: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
8080: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
8090: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
80a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
80b0: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
80c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
80d0: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
80e0: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
80f0: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
8100: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
8110: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
8120: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
8130: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
8140: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
8150: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
8160: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
8170: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
8180: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
8190: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
81a0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
81b0: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
81d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
81e0: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
8210: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
8220: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
8230: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
8240: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
8250: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
8260: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
8270: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
8280: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
8290: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
82a0: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
82b0: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
82c0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
82d0: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
82e0: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
82f0: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
8300: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
8310: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
8320: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
8330: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
8340: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
8350: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
8360: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
8370: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
8380: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
8390: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
83a0: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
83b0: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
83c0: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
83d0: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
83e0: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
83f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
8400: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
8410: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
8420: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
8430: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
8440: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
8450: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
8460: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
8470: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
8480: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
8490: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
84a0: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
84b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
84c0: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
84d0: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
84e0: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
84f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
8500: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
8510: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
8520: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
8530: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
8540: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
8550: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
8560: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8570: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
8580: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
8590: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
85a0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
85b0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
85c0: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
85d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
85e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
85f0: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
8600: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
8610: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
8620: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
8630: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
8640: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
8650: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
8660: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
8670: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
8680: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
8690: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
86a0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
86b0: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
86c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
86d0: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
86e0: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
86f0: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
8700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
8710: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
8720: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
8730: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
8740: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
8750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
8760: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
8770: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
8780: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8790: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
87a0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
87b0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
87c0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
87d0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
87e0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
87f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
8800: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
8810: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
8820: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
8830: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
8840: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
8850: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8860: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8870: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
8880: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
8890: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
88a0: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
88b0: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
88c0: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
88d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
88e0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
88f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8900: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
8910: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
8920: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
8930: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8940: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
8950: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
8960: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
8970: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
8980: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
8990: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
89a0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
89b0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
89c0: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
89d0: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
89e0: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
89f0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
8a00: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
8a10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
8a20: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
8a30: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
8a40: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
8a50: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
8a60: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8a70: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
8a80: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
8a90: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
8aa0: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
8ab0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f  ProgressOps = nO
8ac0: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
8ad0: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
8ae0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
8af0: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
8b00: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
8b10: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
8b20: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
8b30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
8b40: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8b50: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
8b60: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
8b70: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
8b80: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
8b90: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
8ba0: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
8bb0: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
8bc0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
8bd0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
8be0: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
8bf0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
8c00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
8c10: 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30   ms){.  if( ms>0
8c20: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79   ){.    db->busy
8c30: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
8c40: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
8c50: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
8c60: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
8c70: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
8c80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8c90: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
8ca0: 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ler(db, 0, 0);. 
8cb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
8cc0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8cd0: 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e  Cause any pendin
8ce0: 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73  g operation to s
8cf0: 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69  top at its earli
8d00: 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  est opportunity.
8d10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8d20: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
8d30: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75  e3 *db){.  db->u
8d40: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
8d50: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
8d60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
8d70: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
8d80: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
8d90: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
8da0: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
8db0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
8dc0: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
8dd0: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
8de0: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
8df0: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
8e00: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
8e10: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8e20: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
8e30: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
8e40: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
8e50: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
8e60: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
8e70: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
8e80: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
8e90: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
8ea0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
8eb0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
8ec0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
8ed0: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
8ee0: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
8ef0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
8f00: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
8f10: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
8f20: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8f30: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
8f40: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
8f50: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
8f60: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46  3_context*),.  F
8f70: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
8f80: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
8f90: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
8fa0: 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65  t nName;..  asse
8fb0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8fc0: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
8fd0: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
8fe0: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
8ff0: 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28       (xFunc && (
9000: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
9010: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46  ) || .      (!xF
9020: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
9030: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
9040: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
9050: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
9060: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
9070: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
9080: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
9090: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
90a0: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
90b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46  ite3Strlen30( zF
90c0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
90d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
90e0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
90f0: 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20  .  }.  .#ifndef 
9100: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
9110: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
9120: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
9130: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
9140: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
9150: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
9160: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
9170: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
9180: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
9190: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
91a0: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
91b0: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
91c0: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
91d0: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
91e0: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
91f0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
9200: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
9210: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
9220: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
9230: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
9240: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
9250: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
9260: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
9270: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
9280: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
9290: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
92a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
92b0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
92c0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
92d0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
92e0: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
92f0: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
9300: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
9310: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  tructor);.    if
9320: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9330: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
9340: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
9350: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
9360: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
9370: 55 54 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20  UTF16LE,.       
9380: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
9390: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
93a0: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
93b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
93c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
93d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
93e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
93f0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
9400: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
9410: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
9420: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
9430: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
9440: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
9450: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
9460: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
9470: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
9480: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
9490: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
94a0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
94b0: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
94c0: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
94d0: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
94e0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
94f0: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
9500: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
9510: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
9520: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
9530: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
9540: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
9550: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
9560: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
9570: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
9580: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
9590: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
95a0: 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63  p->iPrefEnc==enc
95b0: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
95c0: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
95d0: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
95e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
95f0: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
9600: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
9610: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
9620: 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e  /modify user-fun
9630: 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74  ction due to act
9640: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
9650: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9660: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
9670: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
9680: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
9690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
96a0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
96b0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
96c0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
96d0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
96e0: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
96f0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61  unctionName, nNa
9700: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
9710: 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  c, 1);.  assert(
9720: 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  p || db->mallocF
9730: 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70  ailed);.  if( !p
9740: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9750: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9760: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64  ..  /* If an old
9770: 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  er version of th
9780: 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  e function with 
9790: 61 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73  a configured des
97a0: 74 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20  tructor is.  ** 
97b0: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69  being replaced i
97c0: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
97d0: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65  ctor function he
97e0: 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f  re. */.  functio
97f0: 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b  nDestroy(db, p);
9800: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ..  if( pDestruc
9810: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
9820: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  ructor->nRef++;.
9830: 20 20 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75    }.  p->pDestru
9840: 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74  ctor = pDestruct
9850: 6f 72 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d  or;.  p->flags =
9860: 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d   0;.  p->xFunc =
9870: 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74   xFunc;.  p->xSt
9880: 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d  ep = xStep;.  p-
9890: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
98a0: 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  nal;.  p->pUserD
98b0: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
98c0: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31  .  p->nArg = (u1
98d0: 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  6)nArg;.  return
98e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
98f0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
9900: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
9910: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
9920: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
9930: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
9940: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
9950: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
9960: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
9970: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
9980: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
9990: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
99a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
99b0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
99c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
99d0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
99e0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
99f0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
9a00: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
9a10: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
9a20: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
9a30: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
9a40: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
9a50: 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20  xStep,.         
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61             xFina
9a80: 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  l, 0);.}..int sq
9a90: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
9aa0: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ction_v2(.  sqli
9ab0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
9ac0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
9ad0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
9ae0: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
9af0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
9b00: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
9b10: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
9b20: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
9b30: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
9b40: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
9b50: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
9b60: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
9b70: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
9b80: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
9b90: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
9ba0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
9bb0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
9bc0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
9bd0: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
9be0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
9bf0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78  >mutex);.  if( x
9c00: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70  Destroy ){.    p
9c10: 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72  Arg = (FuncDestr
9c20: 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44  uctor *)sqlite3D
9c30: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9c40: 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72  sizeof(FuncDestr
9c50: 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28  uctor));.    if(
9c60: 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20   !pArg ){.      
9c70: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
9c80: 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20     goto out;.   
9c90: 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65   }.    pArg->xDe
9ca0: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
9cb0: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
9cc0: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
9cd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
9ce0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
9cf0: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
9d00: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
9d10: 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20  Final, pArg);.  
9d20: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
9d30: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
9d40: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
9d50: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
9d60: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
9d70: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9d80: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75   pArg);.  }.. ou
9d90: 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
9da0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
9db0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9dc0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9dd0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
9de0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
9df0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
9e00: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
9e10: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
9e20: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
9e30: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
9e40: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
9e50: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
9e60: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
9e70: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
9e80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
9e90: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
9ea0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
9eb0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
9ec0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
9ed0: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
9ee0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
9ef0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
9f00: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
9f10: 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20  char *zFunc8;.  
9f20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9f30: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
9f40: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
9f50: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9f60: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
9f70: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
9f80: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
9f90: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
9fa0: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
9fb0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
9fc0: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
9fd0: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46   eTextRep, p, xF
9fe0: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
9ff0: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
a000: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
a010: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
a020: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
a030: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
a040: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
a050: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
a060: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
a070: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
a080: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
a090: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
a0a0: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
a0b0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
a0c0: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
a0d0: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
a0e0: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
a0f0: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
a100: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
a110: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
a120: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
a130: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
a140: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
a150: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
a160: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
a170: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
a180: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
a190: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
a1a0: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
a1b0: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
a1c0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
a1d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
a1e0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
a1f0: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
a200: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
a210: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
a220: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
a230: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
a240: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
a250: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
a260: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
a270: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
a280: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
a290: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
a2a0: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
a2b0: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
a2c0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
a2d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
a2e0: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
a2f0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
a300: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
a310: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
a320: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
a330: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
a340: 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29  TE_UTF8, 0)==0 )
a350: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
a360: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
a370: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
a380: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3a0: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
a3b0: 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c  InvalidFunction,
a3c0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
a3d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
a3e0: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
a3f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
a400: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
a410: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a420: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a430: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
a440: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
a450: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
a460: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
a470: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
a480: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
a490: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
a4a0: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
a4b0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
a4c0: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
a4d0: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
a4e0: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
a4f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
a500: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
a510: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
a520: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
a530: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
a540: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
a550: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
a560: 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72   *db, void (*xTr
a570: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
a580: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
a590: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
a5a0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
a5b0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
a5c0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
a5d0: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
a5e0: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
a5f0: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
a600: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
a610: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a620: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
a630: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
a640: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
a650: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
a660: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
a670: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
a680: 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20   registered .** 
a690: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
a6a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
a6b0: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f  **.** A NULL pro
a6c0: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  file function me
a6d0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66  ans that no prof
a6e0: 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  iling is execute
a6f0: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
a700: 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70  * profile is a p
a710: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
a720: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
a730: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
a740: 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63  lusion of.** eac
a750: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
a760: 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  that is run..*/.
a770: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
a780: 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  ofile(.  sqlite3
a790: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78   *db,.  void (*x
a7a0: 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63  Profile)(void*,c
a7b0: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
a7c0: 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e_uint64),.  voi
a7d0: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69  d *pArg.){.  voi
a7e0: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
a7f0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
a800: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
a810: 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
a820: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
a830: 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
a840: 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
a850: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
a860: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a870: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
a880: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
a890: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a8a0: 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  IT_TRACE */../*.
a8b0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75  ** Register a fu
a8c0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
a8d0: 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  oked when a tran
a8e0: 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e  saction commits.
a8f0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b  .** If the invok
a900: 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ed function retu
a910: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
a920: 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65  en the commit be
a930: 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62  comes a.** rollb
a940: 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ack..*/.void *sq
a950: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
a960: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
a970: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a980: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
a990: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
a9a0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  se */.  int (*xC
a9b0: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
a9c0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
a9d0: 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20   invoke on each 
a9e0: 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64  commit */.  void
a9f0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
aa00: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
aa10: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
aa20: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
aa30: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
aa40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
aa50: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
aa60: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b   db->pCommitArg;
aa70: 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  .  db->xCommitCa
aa80: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
aa90: 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69  ck;.  db->pCommi
aaa0: 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  tArg = pArg;.  s
aab0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
aac0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
aad0: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
aae0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
aaf0: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
ab00: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
ab10: 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61  me a row is upda
ab20: 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ted,.** inserted
ab30: 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e   or deleted usin
ab40: 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
ab50: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
ab60: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64  oid *sqlite3_upd
ab70: 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
ab80: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
ab90: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
aba0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
abb0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
abc0: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
abd0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20  (void*,int,char 
abe0: 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e  const *,char con
abf0: 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36  st *,sqlite_int6
ac00: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
ac30: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
ac40: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
ac50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ac60: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
ac70: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
ac80: 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
ac90: 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
aca0: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
acb0: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d  db->pUpdateArg =
acc0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
acd0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
ace0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
acf0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
ad00: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
ad10: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
ad20: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
ad30: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
ad40: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20  lled.** back by 
ad50: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
ad60: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
ad70: 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62  d *sqlite3_rollb
ad80: 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ack_hook(.  sqli
ad90: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
ada0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
adb0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
adc0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
add0: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
ade0: 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c  (void*), /* Call
adf0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
ae00: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae20: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
ae30: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
ae40: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
ae50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ae60: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
ae70: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c   pRet = db->pRol
ae80: 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e  lbackArg;.  db->
ae90: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
aea0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
aeb0: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
aec0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
aed0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
aee0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
aef0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
af00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
af10: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20  T_WAL./*.** The 
af20: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
af30: 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  () callback regi
af40: 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65  stered by sqlite
af50: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
af60: 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b  oint()..** Invok
af70: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
af80: 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
af90: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
afa0: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
afb0: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
afc0: 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c  han sqlite3.pWal
afd0: 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69  Arg cast to an i
afe0: 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75  nteger (the valu
aff0: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a  e configured by.
b000: 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  ** wal_autocheck
b010: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e  point())..*/ .in
b020: 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  t sqlite3WalDefa
b030: 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20  ultHook(.  void 
b040: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  *pClientData,   
b050: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f    /* Argument */
b060: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
b070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
b080: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
b090: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
b0a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
b0b0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20  */.  int nFrame 
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b0d0: 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b  ize of WAL */.){
b0e0: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53  .  if( nFrame>=S
b0f0: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
b100: 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b  (pClientData) ){
b110: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
b120: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
b130: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
b140: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
b150: 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  zDb);.    sqlite
b160: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
b170: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
b180: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
b190: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b1a0: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
b1b0: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
b1c0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
b1d0: 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  ) callback to au
b1e0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
b1f0: 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61  kpoint.** a data
b200: 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69  base after commi
b210: 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
b220: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
b230: 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f   nFrame or.** mo
b240: 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  re frames in the
b250: 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69   log file. Passi
b260: 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67  ng zero or a neg
b270: 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74  ative value as t
b280: 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72  he.** nFrame par
b290: 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20  ameter disables 
b2a0: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
b2b0: 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a  oints entirely..
b2c0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
b2d0: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
b2e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
b2f0: 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73  eplaces any exis
b300: 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ting callback.**
b310: 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   registered usin
b320: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
b330: 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20  ok(). Likewise, 
b340: 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61  registering a ca
b350: 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  llback.** using 
b360: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
b370: 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  () disables the 
b380: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
b390: 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  oint mechanism.*
b3a0: 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
b3b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
b3c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
b3d0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
b3e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
b3f0: 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65  t nFrame){.#ifde
b400: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
b410: 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  L.  UNUSED_PARAM
b420: 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
b430: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72  ED_PARAMETER(nFr
b440: 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ame);.#else.  if
b450: 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20  ( nFrame>0 ){.  
b460: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
b470: 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61  ok(db, sqlite3Wa
b480: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51  lDefaultHook, SQ
b490: 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
b4a0: 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  nFrame));.  }els
b4b0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  e{.    sqlite3_w
b4c0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30  al_hook(db, 0, 0
b4d0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
b4e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b4f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
b500: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
b510: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
b520: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
b530: 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a  tion is written.
b540: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74  ** into the writ
b550: 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74  e-ahead-log by t
b560: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
b570: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
b580: 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f   *sqlite3_wal_ho
b590: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
b5a0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
b5b0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
b5c0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
b5d0: 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
b5e0: 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  int(*xCallback)(
b5f0: 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a  void *, sqlite3*
b600: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
b610: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
b620: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
b630: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
b640: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
b650: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
b660: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
b670: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76  ITE_OMIT_WAL.  v
b680: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
b690: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b6a0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
b6b0: 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72  Ret = db->pWalAr
b6c0: 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c  g;.  db->xWalCal
b6d0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
b6e0: 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67  k;.  db->pWalArg
b6f0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
b700: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
b710: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
b720: 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a  urn pRet;.#else.
b730: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
b740: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
b750: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
b760: 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zDb..*/.int sqli
b770: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
b780: 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  nt_v2(.  sqlite3
b790: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
b7a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
b7b0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
b7c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
b7d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b7e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61   /* Name of atta
b7f0: 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f  ched database (o
b800: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
b810: 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20   eMode,         
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b830: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
b840: 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  T_* value */.  i
b850: 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20  nt *pnLog,      
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b870: 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57  * OUT: Size of W
b880: 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73  AL log in frames
b890: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70   */.  int *pnCkp
b8a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
b8b0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
b8c0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  tal number of fr
b8d0: 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65  ames checkpointe
b8e0: 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  d */.){.#ifdef S
b8f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
b900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b910: 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  K;.#else.  int r
b920: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b940: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
b950: 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f  nt iDb = SQLITE_
b960: 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f  MAX_ATTACHED;  /
b970: 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20  * sqlite3.aDb[] 
b980: 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63  index of db to c
b990: 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  heckpoint */..  
b9a0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
b9b0: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
b9c0: 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65  es to -1 in case
b9d0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b9e0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67  . */.  if( pnLog
b9f0: 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a   ) *pnLog = -1;.
ba00: 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a    if( pnCkpt ) *
ba10: 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20  pnCkpt = -1;..  
ba20: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
ba30: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53  HECKPOINT_FULL>S
ba40: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
ba50: 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73  _PASSIVE );.  as
ba60: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
ba70: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c  CKPOINT_FULL<SQL
ba80: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
ba90: 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65  ESTART );.  asse
baa0: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
bab0: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d  POINT_PASSIVE+2=
bac0: 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
bad0: 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20  NT_RESTART );.  
bae0: 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
baf0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
bb00: 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
bb10: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
bb20: 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65  ESTART ){.    re
bb30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
bb40: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
bb50: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
bb60: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
bb70: 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
bb80: 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
bb90: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
bba0: 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
bbb0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
bbc0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
bbd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
bbe0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  or(db, SQLITE_ER
bbf0: 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  ROR, "unknown da
bc00: 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62  tabase: %s", zDb
bc10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bc20: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63  rc = sqlite3Chec
bc30: 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20  kpoint(db, iDb, 
bc40: 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
bc50: 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ckpt);.    sqlit
bc60: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
bc70: 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  0);.  }.  rc = s
bc80: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
bc90: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
bca0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
bcb0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
bcc0: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
bcd0: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
bce0: 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20  t database zDb. 
bcf0: 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  If zDb is NULL, 
bd00: 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72  or if the buffer
bd10: 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zDb points.** t
bd20: 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72  o contains a zer
bd30: 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c  o-length string,
bd40: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
bd50: 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20  tabases are .** 
bd60: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
bd70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
bd80: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  _checkpoint(sqli
bd90: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
bda0: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74  har *zDb){.  ret
bdb0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  urn sqlite3_wal_
bdc0: 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62  checkpoint_v2(db
bdd0: 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48  , zDb, SQLITE_CH
bde0: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
bdf0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e  , 0, 0);.}..#ifn
be00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
be10: 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  WAL./*.** Run a 
be20: 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61  checkpoint on da
be30: 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73  tabase iDb. This
be40: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64   is a no-op if d
be50: 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a  atabase iDb is.*
be60: 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  * not currently 
be70: 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
be80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
be90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
bea0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
beb0: 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
bec0: 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  ted, this .** fu
bed0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
bee0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64  QLITE_LOCKED and
bef0: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73   a checkpoint is
bf00: 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20   not attempted. 
bf10: 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
bf20: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e  occurs while run
bf30: 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f  ning the checkpo
bf40: 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  int, an SQLite e
bf50: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
bf60: 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20   returned (i.e. 
bf70: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f  SQLITE_IOERR). O
bf80: 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
bf90: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  _OK..**.** The m
bfa0: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
bfb0: 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c   handle db shoul
bfc0: 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65  d be held by the
bfd0: 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74   caller. The mut
bfe0: 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  ex.** associated
bff0: 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
c000: 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  ic b-tree being 
c010: 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20  checkpointed is 
c020: 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73  taken by.** this
c030: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
c040: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
c050: 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s running..**.**
c060: 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65   If iDb is passe
c070: 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  d SQLITE_MAX_ATT
c080: 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20  ACHED, then all 
c090: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
c0a0: 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70  es are.** checkp
c0b0: 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72  ointed. If an er
c0c0: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
c0d0: 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  ed it is returne
c0e0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a  d immediately -.
c0f0: 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73  ** no attempt is
c100: 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
c110: 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e  int any remainin
c120: 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  g databases..**.
c130: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  ** Parameter eMo
c140: 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c  de is one of SQL
c150: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
c160: 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20  ASSIVE, FULL or 
c170: 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20  RESTART..*/.int 
c180: 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
c190: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
c1a0: 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64  nt iDb, int eMod
c1b0: 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69  e, int *pnLog, i
c1c0: 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69  nt *pnCkpt){.  i
c1d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c1e0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
c1f0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
c200: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
c230: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74  erate through at
c240: 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20  tached dbs */.  
c250: 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20  int bBusy = 0;  
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54  /* True if SQLIT
c280: 45 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20  E_BUSY has been 
c290: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a  encountered */..
c2a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c2b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
c2c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
c2d0: 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a  ert( !pnLog || *
c2e0: 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61  pnLog==-1 );.  a
c2f0: 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c  ssert( !pnCkpt |
c300: 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b  | *pnCkpt==-1 );
c310: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
c320: 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51  b->nDb && rc==SQ
c330: 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
c340: 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c     if( i==iDb ||
c350: 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58   iDb==SQLITE_MAX
c360: 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20  _ATTACHED ){.   
c370: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
c380: 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64  treeCheckpoint(d
c390: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65  b->aDb[i].pBt, e
c3a0: 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
c3b0: 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f  kpt);.      pnLo
c3c0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43  g = 0;.      pnC
c3d0: 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  kpt = 0;.      i
c3e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
c3f0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42  SY ){.        bB
c400: 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  usy = 1;.       
c410: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c420: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c430: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
c440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
c450: 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42  Busy) ? SQLITE_B
c460: 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64  USY : rc;.}.#end
c470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
c480: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
c490: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
c4a0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61  turns true if ma
c4b0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64  in-memory should
c4c0: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
c4d0: 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61   of.** a tempora
c4e0: 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e  ry file for tran
c4f0: 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65  sient pager file
c500: 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20  s and statement 
c510: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
c520: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c530: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
c540: 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70  alue of db->temp
c550: 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a  _store (runtime.
c560: 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e  ** parameter) an
c570: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69  d the compile ti
c580: 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49  me value of SQLI
c590: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54  TE_TEMP_STORE. T
c5a0: 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
c5b0: 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
c5c0: 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
c5d0: 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74   between these t
c5e0: 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64  wo values.** and
c5f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20   this functions 
c600: 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a  return value..**
c610: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d  .**   SQLITE_TEM
c620: 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e  P_STORE     db->
c630: 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c  temp_store     L
c640: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f  ocation of tempo
c650: 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  rary database.**
c660: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
c670: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
c680: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
c690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
c6b0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
c6c0: 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
c6d0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
c6e0: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
c6f0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
c700: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
c710: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
c720: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
c730: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
c740: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
c760: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
c770: 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   1).**   1      
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7a0: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
c7b0: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
c7e0: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
c7f0: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
c800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c810: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
c820: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
c830: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
c840: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
c850: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
c860: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
c870: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
c880: 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20  **   3          
c890: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
c8b0: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
c8c0: 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1).*/.int sqlite
c8d0: 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f  3TempInMemory(co
c8e0: 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29  nst sqlite3 *db)
c8f0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  {.#if SQLITE_TEM
c900: 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74  P_STORE==1.  ret
c910: 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
c920: 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  tore==2 );.#endi
c930: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
c940: 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74  P_STORE==2.  ret
c950: 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
c960: 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69  tore!=1 );.#endi
c970: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
c980: 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74  P_STORE==3.  ret
c990: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  urn 1;.#endif.#i
c9a0: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
c9b0: 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f  ORE<1 || SQLITE_
c9c0: 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72  TEMP_STORE>3.  r
c9d0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
c9e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c9f0: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e  UTF-8 encoded En
ca00: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
ca10: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
ca20: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
ca30: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
ca40: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65   char *sqlite3_e
ca50: 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64  rrmsg(sqlite3 *d
ca60: 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
ca70: 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
ca80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
ca90: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
caa0: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20  E_NOMEM);.  }.  
cab0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
cac0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
cad0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
cae0: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
caf0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
cb00: 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PT);.  }.  sqlit
cb10: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
cb20: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
cb30: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
cb40: 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  d ){.    z = sql
cb50: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
cb60: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73  E_NOMEM);.  }els
cb70: 65 7b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  e{.    z = (char
cb80: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
cb90: 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a  text(db->pErr);.
cba0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
cbb0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
cbc0: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
cbd0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
cbe0: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
cbf0: 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Code);.    }.  }
cc00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
cc10: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
cc20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
cc30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
cc40: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
cc50: 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20  * Return UTF-16 
cc60: 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
cc70: 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
cc80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
cc90: 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
cca0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
ccb0: 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  *sqlite3_errmsg1
ccc0: 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  6(sqlite3 *db){.
ccd0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
cce0: 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20  16 outOfMem[] = 
ccf0: 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20  {.    'o', 'u', 
cd00: 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27  't', ' ', 'o', '
cd10: 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65  f', ' ', 'm', 'e
cd20: 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27  ', 'm', 'o', 'r'
cd30: 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20  , 'y', 0.  };.  
cd40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
cd50: 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20   misuse[] = {.  
cd60: 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c    'l', 'i', 'b',
cd70: 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20   'r', 'a', 'r', 
cd80: 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'y', ' ', .    '
cd90: 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74  r', 'o', 'u', 't
cda0: 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27  ', 'i', 'n', 'e'
cdb0: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c  , ' ', .    'c',
cdc0: 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20   'a', 'l', 'l', 
cdd0: 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a  'e', 'd', ' ', .
cde0: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
cdf0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
ce00: 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'f', ' ', .   
ce10: 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20   's', 'e', 'q', 
ce20: 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27  'u', 'e', 'n', '
ce30: 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a  c', 'e', 0.  };.
ce40: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
ce50: 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ;.  if( !db ){. 
ce60: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
ce70: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a  *)outOfMem;.  }.
ce80: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
ce90: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
cea0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
ceb0: 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75  urn (void *)misu
cec0: 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  se;.  }.  sqlite
ced0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
cee0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
cef0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cf00: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69   ){.    z = (voi
cf10: 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
cf20: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
cf30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
cf40: 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  t16(db->pErr);. 
cf50: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
cf60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
cf70: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
cf80: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72  , -1, sqlite3Err
cf90: 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
cfa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,.           SQL
cfb0: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
cfc0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
cfd0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
cfe0: 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
cff0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  r);.    }.    /*
d000: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
d010: 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
d020: 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
d030: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
d040: 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  t16().    ** abo
d050: 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ve. If this is t
d060: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
d070: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
d080: 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f  ed flag needs to
d090: 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72  .    ** be clear
d0a0: 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
d0b0: 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72  ing. Do this dir
d0c0: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
d0d0: 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c  f via.    ** sql
d0e0: 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74  ite3ApiExit(), t
d0f0: 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20  o avoid setting 
d100: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
d110: 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  dle error messag
d120: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62  e..    */.    db
d130: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
d140: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
d150: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d160: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d170: 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
d180: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
d190: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
d1a0: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
d1b0: 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
d1c0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
d1d0: 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20  SQLite routine. 
d1e0: 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61  If NULL is.** pa
d1f0: 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
d200: 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65  ction, we assume
d210: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
d220: 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  ed during sqlite
d230: 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  3_open()..*/.int
d240: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
d250: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
d260: 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
d270: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
d280: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
d290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d2a0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
d2b0: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
d2c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d2d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d2e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
d2f0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
d300: 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
d310: 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  k;.}.int sqlite3
d320: 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
d330: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
d340: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
d350: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
d360: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
d370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d380: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
d390: 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
d3a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d3b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d3c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d3d0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
d3e0: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Code;.}../*.** R
d3f0: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
d400: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
d410: 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
d420: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
d430: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46  .** argument.  F
d440: 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d  or now, this sim
d450: 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e  ply calls the in
d460: 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72  ternal sqlite3Er
d470: 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rStr().** functi
d480: 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
d490: 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74  r *sqlite3_errst
d4a0: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74  r(int rc){.  ret
d4b0: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
d4c0: 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r(rc);.}../*.** 
d4d0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c  Create a new col
d4e0: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
d4f0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62  for database "db
d500: 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20  ".  The name is 
d510: 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65  zName.** and the
d520: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63   encoding is enc
d530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d540: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
d550: 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a  .  sqlite3* db,.
d560: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
d570: 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a  ame, .  u8 enc,.
d580: 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
d590: 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
d5a0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
d5b0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
d5c0: 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
d5d0: 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
d5e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
d5f0: 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69  .  int enc2;.  i
d600: 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  nt nName = sqlit
d610: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
d620: 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
d630: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d640: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
d650: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  ..  /* If SQLITE
d660: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
d670: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
d680: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
d690: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
d6a0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
d6b0: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
d6c0: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
d6d0: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
d6e0: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
d6f0: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
d700: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
d710: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e  nally..  */.  en
d720: 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74  c2 = enc;.  test
d730: 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
d740: 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65  TE_UTF16 );.  te
d750: 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
d760: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
d770: 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32  ED );.  if( enc2
d780: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c  ==SQLITE_UTF16 |
d790: 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  | enc2==SQLITE_U
d7a0: 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a  TF16_ALIGNED ){.
d7b0: 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54      enc2 = SQLIT
d7c0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
d7d0: 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51   }.  if( enc2<SQ
d7e0: 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
d7f0: 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  2>SQLITE_UTF16BE
d800: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
d810: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d820: 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
d830: 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
d840: 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
d850: 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
d860: 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
d870: 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
d880: 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
d890: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
d8a0: 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
d8b0: 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
d8c0: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
d8d0: 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
d8e0: 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
d8f0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ents..  */.  pCo
d900: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
d910: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
d920: 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  enc2, zName, 0);
d930: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
d940: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
d950: 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76     if( db->activ
d960: 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20  eVdbeCnt ){.    
d970: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
d980: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
d990: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
d9a0: 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
d9b0: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
d9c0: 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69  ence due to acti
d9d0: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
d9e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d9f0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
da00: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
da10: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
da20: 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f  ents(db);..    /
da30: 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  * If collation s
da40: 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61  equence pColl wa
da50: 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74  s created direct
da60: 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ly by a call to.
da70: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
da80: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c  reate_collation,
da90: 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74   and not generat
daa0: 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  ed by synthCollS
dab0: 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65  eq(),.    ** the
dac0: 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64  n any copies mad
dad0: 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  e by synthCollSe
dae0: 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69  q() need to be i
daf0: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20  nvalidated..    
db00: 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69  ** Also, collati
db10: 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20  on destructor - 
db20: 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d  CollSeq.xDel() -
db30: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65   function may ne
db40: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
db50: 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a  called..    */ .
db60: 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e      if( (pColl->
db70: 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54  enc & ~SQLITE_UT
db80: 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e  F16_ALIGNED)==en
db90: 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  c2 ){.      Coll
dba0: 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *aColl = sql
dbb0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
dbc0: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
dbd0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, nName);.     
dbe0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
dbf0: 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
dc00: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
dc10: 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d  q *p = &aColl[j]
dc20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
dc30: 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
dc40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
dc50: 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20  ( p->xDel ){.   
dc60: 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c           p->xDel
dc70: 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20  (p->pUser);.    
dc80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dc90: 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20    p->xCmp = 0;. 
dca0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dcb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
dcc0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
dcd0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
dce0: 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29  )enc2, zName, 1)
dcf0: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
dd00: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
dd10: 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d  _NOMEM;.  pColl-
dd20: 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65  >xCmp = xCompare
dd30: 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  ;.  pColl->pUser
dd40: 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c   = pCtx;.  pColl
dd50: 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20  ->xDel = xDel;. 
dd60: 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75   pColl->enc = (u
dd70: 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26  8)(enc2 | (enc &
dd80: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
dd90: 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74  IGNED));.  sqlit
dda0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
ddb0: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74  TE_OK, 0);.  ret
ddc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ddd0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72  .../*.** This ar
dde0: 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64  ray defines hard
ddf0: 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e   upper bounds on
de00: 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20   limit values.  
de10: 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  The.** initializ
de20: 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20  er must be kept 
de30: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
de40: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a   SQLITE_LIMIT_*.
de50: 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73  ** #defines in s
de60: 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61  qlite3.h..*/.sta
de70: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48  tic const int aH
de80: 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  ardLimit[] = {. 
de90: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
dea0: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
deb0: 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _SQL_LENGTH,.  S
dec0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
ded0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ,.  SQLITE_MAX_E
dee0: 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  XPR_DEPTH,.  SQL
def0: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
df00: 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54  _SELECT,.  SQLIT
df10: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20  E_MAX_VDBE_OP,. 
df20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
df30: 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49  TION_ARG,.  SQLI
df40: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
df50: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  .  SQLITE_MAX_LI
df60: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
df70: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
df80: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
df90: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  .  SQLITE_MAX_TR
dfa0: 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a  IGGER_DEPTH,.};.
dfb0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
dfc0: 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
dfd0: 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
dfe0: 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
dff0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
e000: 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
e010: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
e020: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
e030: 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
e040: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
e050: 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
e060: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
e070: 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
e080: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
e090: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
e0a0: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
e0b0: 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
e0c0: 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
e0d0: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
e0e0: 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
e0f0: 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
e100: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
e110: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
e120: 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
e130: 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
e140: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
e150: 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
e160: 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
e170: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
e180: 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
e190: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
e1a0: 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
e1b0: 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
e1c0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
e1d0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
e1e0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
e1f0: 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30  UNCTION_ARG>1000
e200: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
e210: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
e220: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
e230: 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64   0 and 1000.#end
e240: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
e250: 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
e260: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
e270: 48 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53  HED>62.# error S
e280: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
e290: 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
e2a0: 65 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64  en 0 and 62.#end
e2b0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
e2c0: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
e2d0: 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  ENGTH<1.# error 
e2e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
e2f0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d  PATTERN_LENGTH m
e300: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
e310: 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
e320: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33  ITE_MAX_COLUMN>3
e330: 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  2767.# error SQL
e340: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d  ITE_MAX_COLUMN m
e350: 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33  ust not exceed 3
e360: 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20  2767.#endif.#if 
e370: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
e380: 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72  ER_DEPTH<1.# err
e390: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  or SQLITE_MAX_TR
e3a0: 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74  IGGER_DEPTH must
e3b0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
e3c0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
e3d0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
e3e0: 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f  f a limit.  Repo
e3f0: 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
e400: 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c  ..** If an inval
e410: 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69  id limit index i
e420: 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f  s supplied, repo
e430: 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e  rt -1..** Make n
e440: 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74  o changes but st
e450: 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f  ill report the o
e460: 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a  ld value if the.
e470: 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20  ** new limit is 
e480: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
e490: 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69  A new lower limi
e4a0: 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e  t does not shrin
e4b0: 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74  k existing const
e4c0: 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72  ructs..** It mer
e4d0: 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ely prevents new
e4e0: 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74   constructs that
e4f0: 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69   exceed the limi
e500: 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e  t.** from formin
e510: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
e520: 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20  3_limit(sqlite3 
e530: 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64  *db, int limitId
e540: 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b  , int newLimit){
e550: 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b  .  int oldLimit;
e560: 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ...  /* EVIDENCE
e570: 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
e580: 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
e590: 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
e5a0: 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
e5b0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
e5c0: 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
e5d0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
e5e0: 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
e5f0: 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
e600: 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
e610: 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
e620: 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
e630: 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
e640: 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
e650: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e660: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e670: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
e680: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
e690: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
e6a0: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e6b0: 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
e6c0: 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
e6d0: 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
e6e0: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
e6f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
e700: 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
e710: 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
e720: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
e730: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
e740: 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
e750: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
e760: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
e770: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e780: 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
e790: 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
e7a0: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
e7b0: 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
e7c0: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
e7d0: 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
e7e0: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
e7f0: 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
e800: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
e810: 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
e820: 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
e830: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
e840: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
e850: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
e860: 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
e870: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
e880: 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
e890: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
e8a0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
e8b0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
e8c0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
e900: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
e910: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
e920: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
e930: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
e940: 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
e950: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
e960: 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
e970: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
e980: 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
e990: 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
e9a0: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
e9b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
e9c0: 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
e9d0: 5f 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f  _DEPTH==(SQLITE_
e9e0: 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
e9f0: 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
ea00: 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
ea10: 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
ea20: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
ea30: 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
ea40: 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
ea50: 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
ea60: 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
ea70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
ea80: 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
ea90: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
eaa0: 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
eab0: 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
eac0: 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
ead0: 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
eae0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
eaf0: 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
eb00: 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
eb10: 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
eb20: 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
eb30: 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
eb60: 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  35419 */.}../*.*
eb70: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
eb80: 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65  is used to parse
eb90: 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e   both URIs and n
eba0: 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73  on-URI filenames
ebb0: 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a   passed by the.*
ebc0: 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75  * user to API fu
ebd0: 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
ebe0: 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65  open() or sqlite
ebf0: 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64  3_open_v2(), and
ec00: 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a   for database.**
ec10: 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20   URIs specified 
ec20: 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43  as part of ATTAC
ec30: 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  H statements..**
ec40: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
ec50: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
ec60: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
ec70: 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
ec80: 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e  o use (or.** a N
ec90: 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  ULL to signify t
eca0: 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20  he default VFS) 
ecb0: 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20  if the URI does 
ecc0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76  not contain a "v
ecd0: 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79  fs=xxx".** query
ece0: 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20   parameter. The 
ecf0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
ed00: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49  contains the URI
ed10: 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   (or non-URI fil
ed20: 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66  ename).** itself
ed30: 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
ed40: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
ed50: 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61  he *pFlags varia
ed60: 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ble should conta
ed70: 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  in.** the defaul
ed80: 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  t flags to open 
ed90: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
eda0: 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61  dle with. The va
edb0: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
edc0: 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20   *pFlags may be 
edd0: 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72  updated before r
ede0: 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20  eturning if the 
edf0: 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e  URI filename con
ee00: 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65  tains .** "cache
ee10: 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78  =xxx" or "mode=x
ee20: 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  xx" query parame
ee30: 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ters..**.** If s
ee40: 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
ee50: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
ee60: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a  . In this case *
ee70: 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20  ppVfs is set to 
ee80: 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
ee90: 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20  VFS that should 
eea0: 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  be used to open 
eeb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
eec0: 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65  e. *pzFile is se
eed0: 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
eee0: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
eef0: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
ef00: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65   the file to ope
ef10: 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
ef20: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
ef30: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
ef40: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
ef50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
ef60: 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  to release.** th
ef70: 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  is buffer..**.**
ef80: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
ef90: 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  urs, then an SQL
efa0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
efb0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
efc0: 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20  pzErrMsg.** may 
efd0: 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
efe0: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
eff0: 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73  aining an Englis
f000: 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
f010: 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74   .** message. It
f020: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
f030: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
f040: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
f050: 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ly release.** th
f060: 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c  is buffer by cal
f070: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  ling sqlite3_fre
f080: 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
f090: 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63  te3ParseUri(.  c
f0a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
f0b0: 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f  ultVfs,        /
f0c0: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20  * VFS to use if 
f0d0: 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65  no "vfs=xxx" que
f0e0: 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63  ry option */.  c
f0f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c  onst char *zUri,
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f110: 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
f120: 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f   URI to parse */
f130: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
f140: 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
f150: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51     /* IN/OUT: SQ
f160: 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
f170: 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
f180: 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20  _vfs **ppVfs,   
f190: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
f1a0: 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a   VFS to use */ .
f1b0: 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c    char **pzFile,
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61    /* OUT: Filena
f1e0: 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  me component of 
f1f0: 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  URI */.  char **
f200: 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
f210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
f220: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
f230: 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
f240: 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
f250: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f260: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
f270: 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20  gs = *pFlags;.  
f280: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
f290: 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a   = zDefaultVfs;.
f2a0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
f2b0: 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e   char c;.  int n
f2c0: 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Uri = sqlite3Str
f2d0: 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20  len30(zUri);..  
f2e0: 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73  assert( *pzErrMs
f2f0: 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  g==0 );..  if( (
f300: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
f310: 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c  OPEN_URI) || sql
f320: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
f330: 2e 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26  .bOpenUri) .   &
f340: 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d  & nUri>=5 && mem
f350: 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a  cmp(zUri, "file:
f360: 22 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20  ", 5)==0 .  ){. 
f370: 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20     char *zOpt;. 
f380: 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20     int eState;  
f390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3a0: 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65   /* Parser state
f3b0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52   when parsing UR
f3c0: 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e  I */.    int iIn
f3d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f3e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
f3f0: 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
f400: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  */.    int iOut 
f410: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
f420: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
f430: 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
f440: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
f450: 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20  = nUri+2;       
f460: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
f470: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
f480: 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  e */..    /* Mak
f490: 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54  e sure the SQLIT
f4a0: 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
f4b0: 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
f4c0: 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f  te to the VFS xO
f4d0: 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68  pen .    ** meth
f4e0: 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61  od that there ma
f4f0: 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d  y be extra param
f500: 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eters following 
f510: 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20  the file-name.  
f520: 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  */.    flags |= 
f530: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
f540: 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b  ..    for(iIn=0;
f550: 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b   iIn<nUri; iIn++
f560: 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69  ) nByte += (zUri
f570: 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20  [iIn]=='&');.   
f580: 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
f590: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
f5a0: 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
f5b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f5c0: 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69  OMEM;..    /* Di
f5d0: 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65  scard the scheme
f5e0: 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73   and authority s
f5f0: 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55  egments of the U
f600: 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  RI. */.    if( z
f610: 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a  Uri[5]=='/' && z
f620: 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20  Uri[6]=='/' ){. 
f630: 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
f640: 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
f650: 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
f660: 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='/' ) iIn++;.
f670: 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d  .      if( iIn!=
f680: 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c  7 && (iIn!=16 ||
f690: 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f   memcmp("localho
f6a0: 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39  st", &zUri[7], 9
f6b0: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  )) ){.        *p
f6c0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
f6d0: 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c  3_mprintf("inval
f6e0: 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79  id uri authority
f6f0: 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20  : %.*s", .      
f700: 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55        iIn-7, &zU
f710: 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20  ri[7]);.        
f720: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
f730: 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
f740: 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
f750: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
f760: 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 35 3b  {.      iIn = 5;
f770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
f780: 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  opy the filename
f790: 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70   and any query p
f7a0: 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74  arameters into t
f7b0: 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e  he zFile buffer.
f7c0: 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20   .    ** Decode 
f7d0: 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73  %HH escape codes
f7e0: 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20   along the way. 
f7f0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
f800: 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c  ithin this loop,
f810: 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65   variable eState
f820: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30   may be set to 0
f830: 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64  , 1 or 2, depend
f840: 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ing.    ** on th
f850: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
f860: 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  t. As follows:. 
f870: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30     **.    **   0
f880: 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e  : Parsing file-n
f890: 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a  ame..    **   1:
f8a0: 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65   Parsing name se
f8b0: 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
f8c0: 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
f8d0: 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  meter..    **   
f8e0: 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65  2: Parsing value
f8f0: 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
f900: 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
f910: 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f  arameter..    */
f920: 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b  .    eState = 0;
f930: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
f940: 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
f950: 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20  & c!='#' ){.    
f960: 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69    iIn++;.      i
f970: 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20  f( c=='%' .     
f980: 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
f990: 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20  igit(zUri[iIn]) 
f9a0: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
f9b0: 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
f9c0: 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29  iIn+1]) .      )
f9d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63  {.        int oc
f9e0: 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65  tet = (sqlite3He
f9f0: 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
fa00: 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20  +]) << 4);.     
fa10: 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69     octet += sqli
fa20: 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
fa30: 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20  [iIn++]);..     
fa40: 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74     assert( octet
fa50: 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36  >=0 && octet<256
fa60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
fa70: 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  octet==0 ){.    
fa80: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
fa90: 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
faa0: 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73  en "%00" appears
fab0: 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e   within the URI.
fac0: 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   In this.       
fad0: 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67     ** case we ig
fae0: 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e  nore all text in
faf0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
fb00: 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65  f the path, name
fb10: 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   or.          **
fb20: 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79   value currently
fb30: 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53   being parsed. S
fb40: 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72  o ignore the cur
fb50: 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20  rent character. 
fb60: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
fb70: 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74  skip to the next
fb80: 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22   "?", "=" or "&"
fb90: 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
fba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
fbb0: 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
fbc0: 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
fbd0: 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  #' .            
fbe0: 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20    && (eState!=0 
fbf0: 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20  || c!='?').     
fc00: 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
fc10: 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d  ate!=1 || (c!='=
fc20: 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20  ' && c!='&')).  
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
fc40: 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d  eState!=2 || c!=
fc50: 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29  '&').          )
fc60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49  {.            iI
fc70: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
fc80: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
fc90: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
fca0: 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74         c = octet
fcb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
fcc0: 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28  ( eState==1 && (
fcd0: 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27  c=='&' || c=='='
fce0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
fcf0: 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d   zFile[iOut-1]==
fd00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
fd10: 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f  * An empty optio
fd20: 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74  n name. Ignore t
fd30: 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67  his option altog
fd40: 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ether. */.      
fd50: 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
fd60: 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
fd70: 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69  ]!='#' && zUri[i
fd80: 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e  In-1]!='&' ) iIn
fd90: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
fda0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
fdb0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
fdc0: 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='&' ){.        
fdd0: 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
fde0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
fdf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
fe00: 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20   eState = 2;.   
fe10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
fe20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
fe30: 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30  e if( (eState==0
fe40: 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28   && c=='?') || (
fe50: 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d  eState==2 && c==
fe60: 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '&') ){.        
fe70: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65  c = 0;.        e
fe80: 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
fe90: 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69   }.      zFile[i
fea0: 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
feb0: 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  }.    if( eState
fec0: 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74  ==1 ) zFile[iOut
fed0: 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
fee0: 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
fef0: 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
ff00: 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
ff10: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
ff20: 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20   there were any 
ff30: 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65  options specifie
ff40: 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  d that should be
ff50: 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20   interpreted .  
ff60: 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f    ** here. Optio
ff70: 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ns that are inte
ff80: 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63  rpreted here inc
ff90: 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74  lude "vfs" and t
ffa0: 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  hose that.    **
ffb0: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66   correspond to f
ffc0: 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65  lags that may be
ffd0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
ffe0: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
fff0: 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20  .    ** method. 
10000 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  */.    zOpt = &z
10010 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  File[sqlite3Strl
10020 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a  en30(zFile)+1];.
10030 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b      while( zOpt[
10040 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
10050 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74  nOpt = sqlite3St
10060 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20  rlen30(zOpt);.  
10070 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d      char *zVal =
10080 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a   &zOpt[nOpt+1];.
10090 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d        int nVal =
100a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
100b0 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69  (zVal);..      i
100c0 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65  f( nOpt==3 && me
100d0 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74  mcmp("vfs", zOpt
100e0 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
100f0 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a     zVfs = zVal;.
10100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10110 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e       struct Open
10120 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20  Mode {.         
10130 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
10140 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
10150 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61  de;.        } *a
10160 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mode = 0;.      
10170 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70    char *zModeTyp
10180 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
10190 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nt mask = 0;.   
101a0 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
101b0 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   0;..        if(
101c0 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63   nOpt==5 && memc
101d0 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74  mp("cache", zOpt
101e0 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 5)==0 ){.     
101f0 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
10200 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63  ct OpenMode aCac
10210 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  heMode[] = {.   
10220 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72           { "shar
10230 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ed",  SQLITE_OPE
10240 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
10250 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
10260 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45  private", SQLITE
10270 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
10280 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
10290 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
102a0 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
102b0 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
102c0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
102d0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  E|SQLITE_OPEN_PR
102e0 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20  IVATECACHE;.    
102f0 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43        aMode = aC
10300 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20  acheMode;.      
10310 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
10320 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
10330 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b  eType = "cache";
10340 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10350 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26     if( nOpt==4 &
10360 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c  & memcmp("mode",
10370 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a   zOpt, 4)==0 ){.
10380 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
10390 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
103a0 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b   aOpenMode[] = {
103b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
103c0 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ro",  SQLITE_OPE
103d0 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
103e0 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22            { "rw"
103f0 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
10400 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20  EADWRITE }, .   
10410 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22           { "rwc"
10420 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
10430 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
10440 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
10450 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d              { "m
10460 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f  emory", SQLITE_O
10470 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20  PEN_MEMORY },.  
10480 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
10490 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
104a0 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
104b0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
104c0 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f  ADONLY | SQLITE_
104d0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
10500 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
10510 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20  OPEN_MEMORY;.   
10520 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
10530 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20  OpenMode;.      
10540 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
10550 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   & flags;.      
10560 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
10570 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20  "access";.      
10580 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
10590 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20   aMode ){.      
105a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
105b0 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20       int mode = 
105c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
105d0 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a  (i=0; aMode[i].z
105e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
105f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10600 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a  z = aMode[i].z;.
10610 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
10620 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  nVal==sqlite3Str
10630 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d  len30(z) && 0==m
10640 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e  emcmp(zVal, z, n
10650 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
10660 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f        mode = aMo
10670 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20  de[i].mode;.    
10680 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
10690 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
106a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
106b0 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30       if( mode==0
106c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
106d0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
106e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
106f0 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73  such %s mode: %s
10700 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56  ", zModeType, zV
10710 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
10720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
10730 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
10740 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
10750 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
10760 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d            if( (m
10770 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ode & ~SQLITE_OP
10780 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74  EN_MEMORY)>limit
10790 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
107a0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
107b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
107c0 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  mode not allowed
107d0 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
10800 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
10810 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
10820 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  = SQLITE_PERM;. 
10830 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
10840 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
10850 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10860 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c       flags = (fl
10870 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d  ags & ~mask) | m
10880 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ode;.        }. 
10890 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f       }..      zO
108a0 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b  pt = &zVal[nVal+
108b0 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  1];.    }..  }el
108c0 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  se{.    zFile = 
108d0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
108e0 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20  Uri+2);.    if( 
108f0 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
10900 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10910 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20    memcpy(zFile, 
10920 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
10930 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27   zFile[nUri] = '
10940 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e  \0';.    zFile[n
10950 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Uri+1] = '\0';. 
10960 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
10970 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20  ITE_OPEN_URI;.  
10980 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71  }..  *ppVfs = sq
10990 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
109a0 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56  Vfs);.  if( *ppV
109b0 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a  fs==0 ){.    *pz
109c0 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
109d0 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63  _mprintf("no suc
109e0 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73  h vfs: %s", zVfs
109f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
10a00 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70  TE_ERROR;.  }. p
10a10 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20  arse_uri_out:.  
10a20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10a30 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
10a40 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20  _free(zFile);.  
10a50 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d    zFile = 0;.  }
10a60 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61  .  *pFlags = fla
10a70 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20  gs;.  *pzFile = 
10a80 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  zFile;.  return 
10a90 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
10aa0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
10ab0 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e  the work of open
10ac0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f  ing a database o
10ad0 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73  n behalf of.** s
10ae0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e  qlite3_open() an
10af0 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  d sqlite3_open16
10b00 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  (). The database
10b10 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65   filename "zFile
10b20 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54  name"  .** is UT
10b30 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a  F-8 encoded..*/.
10b40 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
10b50 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74  atabase(.  const
10b60 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
10b70 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69  , /* Database fi
10b80 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63  lename UTF-8 enc
10b90 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  oded */.  sqlite
10ba0 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20  3 **ppDb,       
10bb0 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65   /* OUT: Returne
10bc0 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
10bd0 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
10be0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a  int flags,    /*
10bf0 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61   Operational fla
10c00 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
10c10 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f  ar *zVfs       /
10c20 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  * Name of the VF
10c30 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  S to use */.){. 
10c40 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61   /* Store alloca
10c70 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ted handle here 
10c80 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ca0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10cb0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ode */.  int isT
10cc0 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20 20  hreadsafe;      
10cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
10ce0 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65 20   for threadsafe 
10cf0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
10d00 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30   char *zOpen = 0
10d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67   /* Filename arg
10d30 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
10d40 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a   BtreeOpen() */.
10d50 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
10d60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10d70 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
10d80 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50  ge from sqlite3P
10d90 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20  arseUri() */..  
10da0 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
10db0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10dc0 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
10dd0 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
10de0 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
10df0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
10e00 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c  f..  /* Only all
10e10 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62  ow sensible comb
10e20 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73  inations of bits
10e30 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72   in the flags ar
10e40 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54  gument.  .  ** T
10e50 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
10e60 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63   any non-sense c
10e70 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73  ombination is us
10e80 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ed.  If we.  ** 
10e90 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c  do not block ill
10ea0 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  egal combination
10eb0 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64  s here, it could
10ec0 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73   trigger.  ** as
10ed0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
10ee0 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65  s in deeper laye
10ef0 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f  rs.  Sensible co
10f00 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  mbinations.  ** 
10f10 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  are:.  **.  **  
10f20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  1:  SQLITE_OPEN_
10f30 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32  READONLY.  **  2
10f40 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
10f50 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36  EADWRITE.  **  6
10f60 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
10f70 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
10f80 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20  E_OPEN_CREATE.  
10f90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
10fa0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
10fb0 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20  Y  == 0x01 );.  
10fc0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
10fd0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d  PEN_READWRITE ==
10fe0 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72   0x02 );.  asser
10ff0 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  t( SQLITE_OPEN_C
11000 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34  REATE    == 0x04
11010 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
11020 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
11030 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f  0x02 ); /* READO
11040 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  NLY */.  testcas
11050 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
11060 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45  )==0x04 ); /* RE
11070 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73  ADWRITE */.  tes
11080 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
11090 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f  s&7))==0x40 ); /
110a0 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52  * READWRITE | CR
110b0 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28  EATE */.  if( ((
110c0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20  1<<(flags&7)) & 
110d0 30 78 34 36 29 3d 3d 30 20 29 20 72 65 74 75 72  0x46)==0 ) retur
110e0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
110f0 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73 71 6c  BKPT;..  if( sql
11100 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
11110 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29  .bCoreMutex==0 )
11120 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
11130 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
11140 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
11150 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
11160 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
11170 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
11180 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
11190 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
111a0 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
111b0 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65  adsafe = 1;.  }e
111c0 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61  lse{.    isThrea
111d0 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47  dsafe = sqlite3G
111e0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
111f0 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66  lMutex;.  }.  if
11200 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
11210 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
11220 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  HE ){.    flags 
11230 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
11240 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
11250 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
11260 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
11270 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
11280 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
11290 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
112a0 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
112b0 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75  /* Remove harmfu
112c0 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20  l bits from the 
112d0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
112e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
112f0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
11300 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45  X and SQLITE_OPE
11310 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67  N_FULLMUTEX flag
11320 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c  s were.  ** deal
11330 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72  t with in the pr
11340 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63  evious code bloc
11350 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73  k.  Besides thes
11360 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a  e, the only.  **
11370 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61   valid input fla
11380 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f  gs for sqlite3_o
11390 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c  pen_v2() are SQL
113a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
113b0 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  Y,.  ** SQLITE_O
113c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53  PEN_READWRITE, S
113d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
113e0 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  E, SQLITE_OPEN_S
113f0 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a  HAREDCACHE,.  **
11400 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
11410 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73  VATECACHE, and s
11420 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74  ome reserved bit
11430 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73  s.  Silently mas
11440 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f  k.  ** off all o
11450 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f  ther flags..  */
11460 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
11470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
11480 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
11490 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
114a0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
114b0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
114c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
114d0 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20  IN_DB |.        
114e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
114f0 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20  EN_TEMP_DB | .  
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
11510 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
11520 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  NT_DB | .       
11530 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11540 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
11550 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
11560 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
11570 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  EMP_JOURNAL | . 
11580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11590 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
115a0 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
115b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
115c0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
115d0 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L |.            
115e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e     SQLITE_OPEN_N
115f0 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  OMUTEX |.       
11600 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11610 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a  PEN_FULLMUTEX |.
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
11630 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
11640 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a              );..
11650 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
11660 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74  e sqlite data st
11670 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20  ructure */.  db 
11680 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
11690 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69  ero( sizeof(sqli
116a0 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62  te3) );.  if( db
116b0 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64  ==0 ) goto opend
116c0 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54  b_out;.  if( isT
116d0 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20  hreadsafe ){.   
116e0 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c   db->mutex = sql
116f0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
11700 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
11710 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  RSIVE);.    if( 
11720 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  db->mutex==0 ){.
11730 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11740 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62  ee(db);.      db
11750 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
11760 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20   opendb_out;.   
11770 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
11780 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
11790 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
117a0 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20  rrMask = 0xff;. 
117b0 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20   db->nDb = 2;.  
117c0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
117d0 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
117e0 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
117f0 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73  DbStatic;..  ass
11800 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
11810 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
11820 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
11830 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
11840 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
11850 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
11860 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  t));.  db->autoC
11870 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
11880 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
11890 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  1;.  db->nextPag
118a0 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
118b0 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
118c0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c  _ShortColNames |
118d0 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65   SQLITE_AutoInde
118e0 78 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  x | SQLITE_Enabl
118f0 65 54 72 69 67 67 65 72 0a 23 69 66 20 53 51 4c  eTrigger.#if SQL
11900 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
11910 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20  _FORMAT<4.      
11920 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
11930 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
11940 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  t.#endif.#ifdef 
11950 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11960 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20  AD_EXTENSION.   
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
11980 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
11990 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20  sion.#endif.#if 
119a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52  SQLITE_DEFAULT_R
119b0 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52  ECURSIVE_TRIGGER
119c0 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S.              
119d0 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54     | SQLITE_RecT
119e0 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23  riggers.#endif.#
119f0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
11a00 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
11a10 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54  N_KEYS) && SQLIT
11a20 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47  E_DEFAULT_FOREIG
11a30 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20  N_KEYS.         
11a40 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
11a50 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e  _ForeignKeys.#en
11a60 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
11a70 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
11a80 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
11a90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11aa0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
11ab0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
11ac0 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
11ad0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
11ae0 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
11af0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
11b00 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77  BINARY. BINARY w
11b10 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54  orks for both UT
11b20 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46  F-8.  ** and UTF
11b30 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65  -16, so add a ve
11b40 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  rsion for each t
11b50 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65  o avoid any unne
11b60 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e  cessary.  ** con
11b70 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  versions. The on
11b80 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61  ly error that ca
11b90 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20  n occur here is 
11ba0 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
11bb0 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74  re..  */.  creat
11bc0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
11bd0 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
11be0 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  UTF8, 0, binColl
11bf0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
11c00 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
11c10 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
11c20 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e  _UTF16BE, 0, bin
11c30 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
11c40 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
11c50 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
11c60 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c  LITE_UTF16LE, 0,
11c70 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
11c80 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
11c90 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
11ca0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76   SQLITE_UTF8, (v
11cb0 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46  oid*)1, binCollF
11cc0 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  unc, 0);.  if( d
11cd0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11ce0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
11cf0 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62  db_out;.  }.  db
11d00 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71  ->pDfltColl = sq
11d10 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
11d20 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
11d30 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a  , "BINARY", 0);.
11d40 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44    assert( db->pD
11d50 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20  fltColl!=0 );.. 
11d60 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55   /* Also add a U
11d70 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73  TF-8 case-insens
11d80 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  itive collation 
11d90 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63  sequence. */.  c
11da0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
11db0 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c  b, "NOCASE", SQL
11dc0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63  ITE_UTF8, 0, noc
11dd0 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
11de0 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73  , 0);..  /* Pars
11df0 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55  e the filename/U
11e00 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a  RI argument. */.
11e10 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20    db->openFlags 
11e20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20  = flags;.  rc = 
11e30 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
11e40 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  zVfs, zFilename,
11e50 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56   &flags, &db->pV
11e60 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72  fs, &zOpen, &zEr
11e70 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21  rMsg);.  if( rc!
11e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11ea0 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c  _NOMEM ) db->mal
11eb0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
11ec0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
11ed0 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20  db, rc, zErrMsg 
11ee0 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72  ? "%s" : 0, zErr
11ef0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
11f00 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
11f10 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
11f20 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
11f30 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64  Open the backend
11f40 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72   database driver
11f50 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
11f60 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e  e3BtreeOpen(db->
11f70 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c  pVfs, zOpen, db,
11f80 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74   &db->aDb[0].pBt
11f90 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61               fla
11fb0 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs | SQLITE_OPEN
11fc0 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28  _MAIN_DB);.  if(
11fd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11fe0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
11ff0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
12000 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12010 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12020 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
12030 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
12040 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
12050 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61  out;.  }.  db->a
12060 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
12070 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
12080 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
12090 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
120a0 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  1].pSchema = sql
120b0 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
120c0 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65  , 0);...  /* The
120d0 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f   default safety_
120e0 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61  level for the ma
120f0 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27  in database is '
12100 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74  full'; for the t
12110 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  emp.  ** databas
12120 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20  e it is 'NONE'. 
12130 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
12140 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66   pager layer def
12150 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  aults.  .  */.  
12160 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65  db->aDb[0].zName
12170 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d   = "main";.  db-
12180 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[0].safety_l
12190 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e  evel = 3;.  db->
121a0 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22  aDb[1].zName = "
121b0 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62  temp";.  db->aDb
121c0 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [1].safety_level
121d0 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67   = 1;..  db->mag
121e0 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
121f0 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62  C_OPEN;.  if( db
12200 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12210 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
12220 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
12230 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75   Register all bu
12240 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ilt-in functions
12250 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74  , but do not att
12260 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65  empt to read the
12270 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73  .  ** database s
12280 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20  chema yet. This 
12290 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  is delayed until
122a0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
122b0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
122c0 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20  * is accessed.. 
122d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72   */.  sqlite3Err
122e0 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
122f0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  , 0);.  sqlite3R
12300 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
12310 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20  nctions(db);..  
12320 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69  /* Load automati
12330 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65  c extensions - e
12340 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68  xtensions that h
12350 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65  ave been registe
12360 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  red.  ** using t
12370 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d  he sqlite3_autom
12380 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29  atic_extension()
12390 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20   API..  */.  rc 
123a0 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
123b0 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d  e(db);.  if( rc=
123c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
123d0 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61    sqlite3AutoLoa
123e0 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  dExtensions(db);
123f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12400 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
12410 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
12430 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
12440 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
12450 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
12460 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS1.  if( !db->m
12470 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12480 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
12490 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71  lite3Fts1Init(sq
124a0 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
124b0 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  = sqlite3Fts1Ini
124c0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
124d0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
124e0 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69  _ENABLE_FTS2.  i
124f0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
12500 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
12510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
12520 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
12530 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts2Init(sqlite3*
12540 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12550 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b  te3Fts2Init(db);
12560 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
12570 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
12580 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62  E_FTS3.  if( !db
12590 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
125a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
125b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
125c0 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b  te3Fts3Init(db);
125d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
125e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
125f0 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d  E_ICU.  if( !db-
12600 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
12610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12620 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
12630 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20  e3IcuInit(db);. 
12640 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
12650 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12660 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d  RTREE.  if( !db-
12670 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
12680 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
12690 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
126a0 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a  3RtreeInit(db);.
126b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
126c0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
126d0 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53  c, 0);..  /* -DS
126e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
126f0 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
12700 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
12710 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
12720 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
12730 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
12740 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
12750 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
12760 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
12770 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
12780 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
12790 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
127a0 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
127b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
127c0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
127d0 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
127e0 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
127f0 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
12800 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
12810 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
12820 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
12830 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
12840 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
12850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
12860 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
12870 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
12880 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20  if..  /* Enable 
12890 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61  the lookaside-ma
128a0 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a  lloc subsystem *
128b0 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  /.  setupLookasi
128c0 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65  de(db, 0, sqlite
128d0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
128e0 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20  Lookaside,.     
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12900 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
12910 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
12920 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77  e);..  sqlite3_w
12930 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
12940 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46  t(db, SQLITE_DEF
12950 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45  AULT_WAL_AUTOCHE
12960 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64  CKPOINT);..opend
12970 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  b_out:.  sqlite3
12980 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20  _free(zOpen);.  
12990 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73  if( db ){.    as
129a0 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21  sert( db->mutex!
129b0 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61  =0 || isThreadsa
129c0 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  fe==0 || sqlite3
129d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
129e0 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20  llMutex==0 );.  
129f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12a00 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12a10 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
12a20 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
12a30 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
12a40 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
12a50 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72  NOMEM );.  if( r
12a60 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
12a70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
12a80 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62  lose(db);.    db
12a90 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
12aa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12ab0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
12ac0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
12ad0 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44  SICK;.  }.  *ppD
12ae0 62 20 3d 20 64 62 3b 0a 20 20 72 65 74 75 72 6e  b = db;.  return
12af0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
12b00 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  0, rc);.}../*.**
12b10 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
12b20 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
12b30 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
12b40 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
12b50 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
12b60 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
12b70 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
12b80 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
12b90 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
12bb0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12bc0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
12bd0 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
12be0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
12bf0 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
12c00 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
12c10 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
12c20 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
12c30 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
12c40 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
12c50 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
12c60 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
12c70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
12c80 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
12c90 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
12ca0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
12cb0 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
12cc0 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
12cd0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
12ce0 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
12cf0 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
12d00 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
12d10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12d20 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
12d30 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
12d40 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
12d50 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
12d60 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
12d70 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
12d80 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
12d90 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
12da0 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
12db0 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
12dc0 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
12dd0 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
12de0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
12df0 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
12e00 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
12e10 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
12e20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20  ppDb );.  *ppDb 
12e30 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
12e40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
12e50 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
12e60 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
12e70 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
12e80 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56   rc;.#endif.  pV
12e90 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
12ea0 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
12eb0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
12ec0 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
12ed0 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
12ee0 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
12ef0 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
12f00 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
12f10 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
12f20 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
12f30 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
12f40 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
12f50 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
12f60 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
12f70 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
12f80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12f90 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
12fa0 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
12fb0 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
12fc0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
12fd0 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
12fe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
12ff0 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
13000 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
13010 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
13020 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53    ENC(*ppDb) = S
13030 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
13040 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
13050 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13060 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
13070 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
13080 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
13090 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
130a0 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
130b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
130c0 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
130d0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
130e0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
130f0 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
13100 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
13110 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
13120 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
13130 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
13140 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
13150 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
13160 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
13170 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
13180 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
13190 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
131a0 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
131b0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
131c0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
131d0 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
131e0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
131f0 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
13200 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
13210 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
13220 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
13230 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
13240 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
13250 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
13260 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
13270 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
13280 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  c;.}../*.** Regi
13290 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
132a0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
132b0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
132c0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
132d0 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
132e0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
132f0 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
13300 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
13310 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
13320 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
13330 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
13340 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
13350 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
13360 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
13370 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
13380 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
13390 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
133a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
133b0 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
133c0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
133d0 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
133e0 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
133f0 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
13400 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
13410 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
13420 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
13430 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13440 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
13450 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
13460 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13470 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
13480 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
13490 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
134a0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
134b0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
134c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
134d0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
134e0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
134f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
13500 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20  ame,.  int enc, 
13510 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
13520 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
13530 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
13540 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
13550 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
13560 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13570 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a    char *zName8;.
13580 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13590 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
135a0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
135b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
135c0 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69  .  zName8 = sqli
135d0 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
135e0 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
135f0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
13600 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a    if( zName8 ){.
13610 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43      rc = createC
13620 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
13630 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  me8, (u8)enc, pC
13640 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
13650 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
13660 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b  ree(db, zName8);
13670 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
13680 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
13690 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
136a0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
136b0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
136c0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
136d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
136e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
136f0 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
13700 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
13710 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
13720 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
13730 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
13740 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
13750 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
13760 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
13770 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
13780 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
13790 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65  needed(.  sqlite
137a0 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
137b0 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
137c0 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
137d0 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69  eded)(void*,sqli
137e0 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
137f0 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  p,const char*).)
13800 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
13810 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
13820 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
13830 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65  eeded = xCollNee
13840 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ded;.  db->xColl
13850 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20  Needed16 = 0;.  
13860 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
13870 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
13880 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
13890 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
138a0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
138b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
138c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
138d0 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
138e0 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
138f0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
13900 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
13910 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
13920 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
13930 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
13940 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
13950 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
13960 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
13970 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
13980 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73  on_needed16(.  s
13990 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
139a0 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
139b0 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
139c0 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69  ollNeeded16)(voi
139d0 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
139e0 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76  eTextRep,const v
139f0 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74  oid*).){.  sqlit
13a00 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
13a10 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
13a20 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30  >xCollNeeded = 0
13a30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
13a40 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65  ded16 = xCollNee
13a50 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f  ded16;.  db->pCo
13a60 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
13a70 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
13a80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13a90 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
13aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13ab0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
13ac0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
13ad0 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
13ae0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
13af0 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
13b00 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
13b10 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20  an anachronism. 
13b20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73  It used to be us
13b30 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ed to recover fr
13b40 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  om a.** malloc()
13b50 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51   failure, but SQ
13b60 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68  Lite now does th
13b70 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
13b80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13b90 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
13ba0 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
13bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
13bc0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  dif../*.** Test 
13bd0 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
13be0 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  r not the databa
13bf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
13c00 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a   in autocommit.*
13c10 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  * mode.  Return 
13c20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e  TRUE if it is an
13c30 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20  d FALSE if not. 
13c40 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   Autocommit mode
13c50 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66   is on.** by def
13c60 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69  ault.  Autocommi
13c70 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79  t is disabled by
13c80 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
13c90 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64  nt and reenabled
13ca0 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20  .** by the next 
13cb0 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
13cc0 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54  CK..**.******* T
13cd0 48 49 53 20 49 53 20 41 4e 20 45 58 50 45 52 49  HIS IS AN EXPERI
13ce0 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49  MENTAL API AND I
13cf0 53 20 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41  S SUBJECT TO CHA
13d00 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e  NGE ******.*/.in
13d10 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  t sqlite3_get_au
13d20 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  tocommit(sqlite3
13d30 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
13d40 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a  db->autoCommit;.
13d50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
13d60 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
13d70 61 72 65 20 73 75 62 74 69 74 75 74 65 73 20 66  are subtitutes f
13d80 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c  or constants SQL
13d90 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20  ITE_CORRUPT,.** 
13da0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53  SQLITE_MISUSE, S
13db0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
13dc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64  SQLITE_IOERR and
13dd0 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20   possibly other 
13de0 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e  error.** constan
13df0 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 72  ts.  They server
13e00 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a   two purposes:.*
13e10 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65  *.**   1.  Serve
13e20 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74   as a convenient
13e30 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
13e40 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20  breakpoint in a 
13e50 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20  debugger.**     
13e60 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e    to detect when
13e70 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63   version error c
13e80 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73  onditions occurs
13e90 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e  ..**.**   2.  In
13ea0 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67  voke sqlite3_log
13eb0 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  () to provide th
13ec0 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f  e source code lo
13ed0 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  cation where.** 
13ee0 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65        a low-leve
13ef0 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74  l error is first
13f00 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e   detected..*/.in
13f10 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74  t sqlite3Corrupt
13f20 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
13f30 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
13f40 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
13f50 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
13f60 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
13f70 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20  TE_CORRUPT,.    
13f80 20 20 20 20 20 20 20 20 20 20 22 64 61 74 61 62            "datab
13f90 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61  ase corruption a
13fa0 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e  t line %d of [%.
13fb0 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  10s]",.         
13fc0 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b       lineno, 20+
13fd0 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
13fe0 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ());.  return SQ
13ff0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a  LITE_CORRUPT;.}.
14000 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73  int sqlite3Misus
14010 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  eError(int linen
14020 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
14030 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14040 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
14050 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
14060 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20  ITE_MISUSE, .   
14070 20 20 20 20 20 20 20 20 20 20 20 22 6d 69 73 75             "misu
14080 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  se at line %d of
14090 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
140a0 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c           lineno,
140b0 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72   20+sqlite3_sour
140c0 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  ceid());.  retur
140d0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
140e0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61  .}.int sqlite3Ca
140f0 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20  ntopenError(int 
14100 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
14110 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
14120 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
14130 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
14140 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  g(SQLITE_CANTOPE
14150 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  N, .            
14160 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66    "cannot open f
14170 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f  ile at line %d o
14180 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20  f [%.10s]",.    
14190 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f            lineno
141a0 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75  , 20+sqlite3_sou
141b0 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75  rceid());.  retu
141c0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
141d0 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  EN;.}...#ifndef 
141e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
141f0 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
14200 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  s is a convenien
14210 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  ce routine that 
14220 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
14230 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69  all thread-speci
14240 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20  fic.** data for 
14250 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20  this thread has 
14260 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64  been deallocated
14270 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e  ..**.** SQLite n
14280 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68  o longer uses th
14290 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61  read-specific da
142a0 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  ta so this routi
142b0 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e  ne is now a.** n
142c0 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74  o-op.  It is ret
142d0 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72  ained for histor
142e0 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69  ical compatibili
142f0 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
14300 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
14310 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64  up(void){.}.#end
14320 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
14330 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
14340 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66  n about a specif
14350 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64  ic column of a d
14360 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
14370 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e  * See comment in
14380 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69   sqlite3.h (sqli
14390 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74  te.h.in) for det
143a0 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ails..*/.#ifdef 
143b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
143c0 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e  LUMN_METADATA.in
143d0 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  t sqlite3_table_
143e0 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
143f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14410 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  * Connection han
14420 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
14430 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20  har *zDbName,   
14440 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
14450 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f   name or NULL */
14460 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14470 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f  TableName,     /
14480 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
14490 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
144a0 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a  olumnName,    /*
144b0 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
144c0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
144d0 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a  zDataType,    /*
144e0 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65   OUTPUT: Declare
144f0 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20  d data type */. 
14500 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
14510 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20  CollSeq,     /* 
14520 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f  OUTPUT: Collatio
14530 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
14540 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75  */.  int *pNotNu
14550 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
14560 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
14570 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   if NOT NULL con
14580 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a  straint exists *
14590 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72  /.  int *pPrimar
145a0 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  yKey,           
145b0 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
145c0 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f  if column part o
145d0 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  f PK */.  int *p
145e0 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20  Autoinc         
145f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
14600 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
14610 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e  is auto-incremen
14620 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
14630 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
14640 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  g = 0;.  Table *
14650 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  pTab = 0;.  Colu
14660 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20  mn *pCol = 0;.  
14670 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61  int iCol;..  cha
14680 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79  r const *zDataTy
14690 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
146a0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d  onst *zCollSeq =
146b0 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c   0;.  int notnul
146c0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69  l = 0;.  int pri
146d0 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69  marykey = 0;.  i
146e0 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a  nt autoinc = 0;.
146f0 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65  .  /* Ensure the
14700 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
14710 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64   has been loaded
14720 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
14730 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
14740 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
14750 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
14760 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
14770 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
14780 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  g);.  if( SQLITE
14790 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67  _OK!=rc ){.    g
147a0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
147b0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
147c0 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65  the table in que
147d0 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20  stion */.  pTab 
147e0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
147f0 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d  le(db, zTableNam
14800 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  e, zDbName);.  i
14810 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62  f( !pTab || pTab
14820 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
14830 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67   pTab = 0;.    g
14840 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
14850 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
14860 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69  e column for whi
14870 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65  ch info is reque
14880 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71  sted */.  if( sq
14890 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
148a0 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
148b0 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
148c0 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  Key;.    if( iCo
148d0 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  l>=0 ){.      pC
148e0 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
148f0 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20  [iCol];.    }.  
14900 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
14910 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
14920 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
14930 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
14940 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
14950 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
14960 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
14970 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d  l->zName, zColum
14980 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
14990 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
149a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
149b0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  Col==pTab->nCol 
149c0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
149d0 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72  0;.      goto er
149e0 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ror_out;.    }. 
149f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
14a00 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f  lowing block sto
14a10 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66  res the meta inf
14a20 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
14a30 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20  ll be returned. 
14a40 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65   ** to the calle
14a50 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  r in local varia
14a60 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20  bles zDataType, 
14a70 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c  zCollSeq, notnul
14a80 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20  l, primarykey.  
14a90 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20  ** and autoinc. 
14aa0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
14ab0 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73  ere are two poss
14ac0 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20  ibilities:.  ** 
14ad0 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65  .  **     1. The
14ae0 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d   specified colum
14af0 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64  n name was rowid
14b00 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f  ", "oid" or "_ro
14b10 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20  wid_" .  **     
14b20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20     and there is 
14b30 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65  no explicitly de
14b40 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d  clared IPK colum
14b50 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  n. .  **.  **   
14b60 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69    2. The table i
14b70 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64  s not a view and
14b80 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
14b90 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a   identified an .
14ba0 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c    **        expl
14bb0 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
14bc0 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74  column. Copy met
14bd0 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
14be0 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a  om *pCol..  */ .
14bf0 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20    if( pCol ){.  
14c00 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43    zDataType = pC
14c10 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a  ol->zType;.    z
14c20 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e  CollSeq = pCol->
14c30 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75  zColl;.    notnu
14c40 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75  ll = pCol->notNu
14c50 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61  ll!=0;.    prima
14c60 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e  rykey  = (pCol->
14c70 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c  colFlags & COLFL
14c80 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a  AG_PRIMKEY)!=0;.
14c90 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54      autoinc = pT
14ca0 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
14cb0 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
14cc0 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
14cd0 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c  ement)!=0;.  }el
14ce0 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70  se{.    zDataTyp
14cf0 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
14d00 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20     primarykey = 
14d10 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43  1;.  }.  if( !zC
14d20 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43  ollSeq ){.    zC
14d30 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59  ollSeq = "BINARY
14d40 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  ";.  }..error_ou
14d50 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t:.  sqlite3Btre
14d60 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
14d70 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
14d80 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
14d90 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
14da0 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
14db0 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
14dc0 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
14dd0 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
14de0 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
14df0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
14e00 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
14e10 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
14e20 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
14e30 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
14e40 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
14e50 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
14e60 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
14e70 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
14e80 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
14e90 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
14ea0 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
14eb0 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
14ec0 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
14ed0 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
14ee0 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
14ef0 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
14f00 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
14f10 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
14f20 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
14f30 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
14f40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
14f50 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
14f60 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
14f70 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
14f80 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
14f90 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
14fa0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
14fb0 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
14fc0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
14fd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
14fe0 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45  rror(db, rc, (zE
14ff0 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
15000 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
15010 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
15020 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
15030 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
15040 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
15050 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
15060 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
15070 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
15080 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
15090 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
150a0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
150b0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
150c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
150d0 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
150e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
150f0 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
15100 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
15110 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
15120 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
15130 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
15140 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
15150 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
15160 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
15170 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
15180 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
15190 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
151a0 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
151b0 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
151c0 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
151d0 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
151e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
151f0 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
15200 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
15210 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
15220 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15230 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
15240 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
15250 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
15260 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15270 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
15280 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
15290 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
152a0 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
152b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
152c0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
152d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
152e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
152f0 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
15300 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
15310 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
15320 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
15330 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
15340 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
15350 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
15360 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
15370 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
15380 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15390 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
153a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
153b0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
153c0 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20  ex);.  pBtree = 
153d0 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
153e0 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
153f0 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
15400 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
15410 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
15420 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20  3_file *fd;.    
15430 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15440 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
15450 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
15460 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65  treePager(pBtree
15470 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15480 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
15490 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
154a0 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
154b0 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30     assert( fd!=0
154c0 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d   );.    if( op==
154d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
154e0 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  E_POINTER ){.   
154f0 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c     *(sqlite3_fil
15500 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20  e**)pArg = fd;. 
15510 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15520 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
15530 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  f( fd->pMethods 
15540 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
15550 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
15560 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29  ol(fd, op, pArg)
15570 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
15590 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20  OTFOUND;.    }. 
155a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
155b0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
155c0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
155d0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
155e0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
155f0 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74     .}../*.** Int
15600 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65  erface to the te
15610 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  sting logic..*/.
15620 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  int sqlite3_test
15630 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c  _control(int op,
15640 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20   ...){.  int rc 
15650 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
15660 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
15670 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20  _TEST.  va_list 
15680 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
15690 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
156a0 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a  ( op ){..    /*.
156b0 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20      ** Save the 
156c0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
156d0 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a   the PRNG..    *
156e0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
156f0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
15700 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SAVE: {.      sq
15710 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61  lite3PrngSaveSta
15720 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
15730 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
15740 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20  .    ** Restore 
15750 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
15760 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73   PRNG to the las
15770 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73  t state saved us
15780 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f  ing.    ** PRNG_
15790 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53  SAVE.  If PRNG_S
157a0 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65  AVE has never be
157b0 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64  fore been called
157c0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
157d0 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b  is verb acts lik
157e0 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20  e PRNG_RESET..  
157f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
15800 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
15810 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20  NG_RESTORE: {.  
15820 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
15830 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20  estoreState();. 
15840 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15850 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
15860 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20   Reset the PRNG 
15870 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e  back to its unin
15880 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e  itialized state.
15890 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a    The next call.
158a0 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65      ** to sqlite
158b0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77  3_randomness() w
158c0 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50  ill reseed the P
158d0 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67  RNG using a sing
158e0 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  le call.    ** t
158f0 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  o the xRandomnes
15900 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  s method of the 
15910 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20  default VFS..   
15920 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
15930 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
15940 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20  G_RESET: {.     
15950 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65   sqlite3PrngRese
15960 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  tState();.      
15970 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15980 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
15990 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
159a0 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73  l(BITVEC_TEST, s
159b0 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20  ize, program).  
159c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
159d0 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61  a test against a
159e0 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f   Bitvec object o
159f0 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f  f size.  The pro
15a00 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20  gram argument.  
15a10 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79    ** is an array
15a20 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61   of integers tha
15a30 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65  t defines the te
15a40 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f  st.  Return -1 o
15a50 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72  n a.    ** memor
15a60 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
15a70 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73  or, 0 on success
15a80 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  , or non-zero fo
15a90 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  r an error..    
15aa0 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74  ** See the sqlit
15ab0 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
15ac0 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69  est() for additi
15ad0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
15ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15af0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
15b00 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b  L_BITVEC_TEST: {
15b10 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
15b20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
15b30 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f  .      int *aPro
15b40 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  g = va_arg(ap, i
15b50 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt*);.      rc =
15b60 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
15b70 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50  iltinTest(sz, aP
15b80 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rog);.      brea
15b90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
15ba0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
15bb0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45  _test_control(BE
15bc0 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
15bd0 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29  S, xBegin, xEnd)
15be0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
15bf0 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f  egister hooks to
15c00 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74   call to indicat
15c10 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29  e which malloc()
15c20 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a   failures .    *
15c30 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20  * are benign..  
15c40 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
15c50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45  LITE_TESTCTRL_BE
15c60 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b  NIGN_MALLOC_HOOK
15c70 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  S: {.      typed
15c80 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66  ef void (*void_f
15c90 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a  unction)(void);.
15ca0 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
15cb0 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e  ion xBenignBegin
15cc0 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
15cd0 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64  ction xBenignEnd
15ce0 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42  ;.      xBenignB
15cf0 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70  egin = va_arg(ap
15d00 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
15d10 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45  ;.      xBenignE
15d20 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nd = va_arg(ap, 
15d30 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
15d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e        sqlite3Ben
15d50 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78  ignMallocHooks(x
15d60 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65  BenignBegin, xBe
15d70 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20  nignEnd);.      
15d80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15d90 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
15da0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
15db0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
15dc0 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  L_PENDING_BYTE, 
15dd0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a  unsigned int X).
15de0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
15df0 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  t the PENDING by
15e00 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  te to the value 
15e10 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  in the argument,
15e20 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20   if X>0..    ** 
15e30 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
15e40 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e  if X==0.  Return
15e50 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
15e60 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20  e pending byte. 
15e70 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73     ** as it exis
15e80 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73  ting before this
15e90 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
15ea0 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
15eb0 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43  ** IMPORTANT:  C
15ec0 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44  hanging the PEND
15ed0 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78  ING byte from 0x
15ee0 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73  40000000 results
15ef0 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e   in.    ** an in
15f00 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62  compatible datab
15f10 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ase file format.
15f20 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
15f30 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20  ENDING byte.    
15f40 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74  ** while any dat
15f50 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
15f60 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73   is open results
15f70 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e   in undefined an
15f80 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72  d.    ** dileter
15f90 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20  ious behavior.. 
15fa0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15fb0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
15fc0 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20  ENDING_BYTE: {. 
15fd0 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e       rc = PENDIN
15fe0 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20  G_BYTE;.#ifndef 
15ff0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
16000 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
16010 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77  unsigned int new
16020 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Val = va_arg(ap,
16030 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a   unsigned int);.
16040 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56          if( newV
16050 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64  al ) sqlite3Pend
16060 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c  ingByte = newVal
16070 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
16080 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16090 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
160a0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
160b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
160c0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
160d0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
160e0 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
160f0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
16100 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
16110 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
16120 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
16130 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
16140 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49  compile-time.  I
16150 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20  f X is true and 
16160 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20  assert().    ** 
16170 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
16180 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
16190 65 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58  e is true.  If X
161a0 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20   is true and.   
161b0 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20   ** assert() is 
161c0 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
161d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
161e0 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69  is zero.  If X i
161f0 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61  s.    ** false a
16200 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65  nd assert() is e
16210 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
16220 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73   assertion fires
16230 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
16240 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20  process aborts. 
16250 20 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61   If X is false a
16260 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64  nd assert() is d
16270 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
16280 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  e.    ** return 
16290 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20  value is zero.. 
162a0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
162b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
162c0 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76  SSERT: {.      v
162d0 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20  olatile int x = 
162e0 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
162f0 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   (x = va_arg(ap,
16300 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  int))!=0 );.    
16310 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20    rc = x;.      
16320 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20  break;.    }... 
16330 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
16340 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
16350 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
16360 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58  RL_ALWAYS, int X
16370 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
16380 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
16390 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
163a0 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20  test to see how 
163b0 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20  the ALWAYS and. 
163c0 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72     ** NEVER macr
163d0 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  os were defined 
163e0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
163f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16400 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
16410 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a  is ALWAYS(X).  .
16420 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
16430 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65  e recommended te
16440 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20  st is X==2.  If 
16450 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
16460 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e   is 2, that mean
16470 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28  s.    ** ALWAYS(
16480 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
16490 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73  e both no-op pas
164a0 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
164b0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20  , which is the. 
164c0 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65     ** default se
164d0 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  tting.  If the r
164e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31  eturn value is 1
164f0 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20  , then ALWAYS() 
16500 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  is either.    **
16510 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74   hard-coded to t
16520 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61  rue or else it a
16530 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72  sserts if its ar
16540 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e  gument is false.
16550 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73  .    ** The firs
16560 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64  t behavior (hard
16570 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20  -coded to true) 
16580 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
16590 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
165a0 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
165b0 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
165c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64   is disabled and
165d0 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20   the second.    
165e0 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73  ** behavior (ass
165f0 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d  ert if the argum
16600 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20  ent to ALWAYS() 
16610 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65  is false) is the
16620 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
16630 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
16640 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
16650 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  t assert() is en
16660 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  abled..    **.  
16670 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d    ** The run-tim
16680 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65  e test procedure
16690 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65   might look some
166a0 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a  thing like this:
166b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
166c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
166d0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
166e0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
166f0 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20  S, 2)==2 ){.    
16700 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
16710 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
16720 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74  are no-op pass-t
16730 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20  hrough macros.  
16740 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66    **    }else if
16750 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
16760 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
16770 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31  STCTRL_ASSERT, 1
16780 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  ) ){.    **     
16790 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73   // ALWAYS(x) as
167a0 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20  serts that x is 
167b0 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61  true. NEVER(x) a
167c0 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73  sserts x is fals
167d0 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  e..    **    }el
167e0 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se{.    **      
167f0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20  // ALWAYS(x) is 
16800 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e  a constant 1.  N
16810 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e  EVER(x) is a con
16820 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20  stant 0..    ** 
16830 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20     }.    */.    
16840 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
16850 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20  CTRL_ALWAYS: {. 
16860 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
16870 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
16880 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78     rc = ALWAYS(x
16890 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
168a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
168b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
168c0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
168d0 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71  CTRL_RESERVE, sq
168e0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
168f0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
16900 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65  Set the nReserve
16910 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74   size to N for t
16920 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
16930 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16940 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69  .    ** connecti
16950 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20  on db..    */.  
16960 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
16970 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20  STCTRL_RESERVE: 
16980 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
16990 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
169a0 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
169b0 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
169c0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
169d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
169e0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
169f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16a00 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62  eeSetPageSize(db
16a10 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
16a20 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   x, 0);.      sq
16a30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
16a40 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
16a50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
16a60 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65  ..    /*  sqlite
16a70 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
16a80 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
16a90 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71  PTIMIZATIONS, sq
16aa0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
16ab0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
16ac0 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
16ad0 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69  e various optimi
16ae0 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74  zations for test
16af0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54  ing purposes.  T
16b00 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d  he .    ** argum
16b10 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61  ent N is a bitma
16b20 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69  sk of optimizati
16b30 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ons to be disabl
16b40 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a  ed.  For normal.
16b50 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
16b60 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20   N should be 0. 
16b70 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
16b80 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d  t a test program
16b90 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a   (like the.    *
16ba0 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74  * SQL Logic Test
16bb0 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64   or SLT test mod
16bc0 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65  ule) can run the
16bd0 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70   same SQL multip
16be0 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20  le times.    ** 
16bf0 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74  with various opt
16c00 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62  imizations disab
16c10 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68  led to verify th
16c20 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77  at the same answ
16c30 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74  er.    ** is obt
16c40 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63  ained in every c
16c50 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
16c60 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
16c70 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
16c80 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NS: {.      sqli
16c90 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
16ca0 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
16cb0 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
16cc0 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
16cd0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20      db->flags = 
16ce0 28 78 20 26 20 53 51 4c 49 54 45 5f 4f 70 74 4d  (x & SQLITE_OptM
16cf0 61 73 6b 29 20 7c 20 28 64 62 2d 3e 66 6c 61 67  ask) | (db->flag
16d00 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 70 74 4d  s & ~SQLITE_OptM
16d10 61 73 6b 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ask);.      brea
16d20 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  k;.    }..#ifdef
16d30 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
16d40 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  D.    /* sqlite3
16d50 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
16d60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
16d70 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63  KEYWORD, const c
16d80 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20  har *zWord).    
16d90 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f  **.    ** If zWo
16da0 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20  rd is a keyword 
16db0 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68  recognized by th
16dc0 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72  e parser, then r
16dd0 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a  eturn the.    **
16de0 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f   number of keywo
16df0 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72  rds.  Or if zWor
16e00 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f  d is not a keywo
16e10 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  rd, return 0..  
16e20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69    ** .    ** Thi
16e30 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69  s test feature i
16e40 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
16e50 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   in the amalgama
16e60 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a  tion since.    *
16e70 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b  * the SQLITE_N_K
16e80 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20  EYWORD macro is 
16e90 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74  not defined in t
16ea0 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69  his file if SQLi
16eb0 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69  te.    ** is bui
16ec0 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  lt using separat
16ed0 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a  e source files..
16ee0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
16ef0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
16f00 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20  ISKEYWORD: {.   
16f10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16f20 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70  Word = va_arg(ap
16f30 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
16f40 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
16f50 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57  lite3Strlen30(zW
16f60 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ord);.      rc =
16f70 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64   (sqlite3Keyword
16f80 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c  Code((u8*)zWord,
16f90 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51   n)!=TK_ID) ? SQ
16fa0 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a  LITE_N_KEYWORD :
16fb0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
16fc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a  .    }.#endif ..
16fd0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
16fe0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
16ff0 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41  TE_TESTCTRL_SCRA
17000 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26  TCHMALLOC, sz, &
17010 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20  pNew, pFree);.  
17020 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73    **.    ** Pass
17030 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69   pFree into sqli
17040 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29  te3ScratchFree()
17050 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e  . .    ** If sz>
17060 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  0 then allocate 
17070 61 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72  a scratch buffer
17080 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20   into pNew.  .  
17090 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
170a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43  LITE_TESTCTRL_SC
170b0 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  RATCHMALLOC: {. 
170c0 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65       void *pFree
170d0 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20  , **ppNew;.     
170e0 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73   int sz;.      s
170f0 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
17100 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77  nt);.      ppNew
17110 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
17120 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72  id**);.      pFr
17130 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ee = va_arg(ap, 
17140 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66  void*);.      if
17150 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20  ( sz ) *ppNew = 
17160 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
17170 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20  lloc(sz);.      
17180 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
17190 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ee(pFree);.     
171a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
171b0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
171c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
171d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
171e0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
171f0 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
17200 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
17210 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
17220 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72  n-zero, configur
17230 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73  e the wrappers s
17240 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a  o that all.    *
17250 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * subsequent cal
17260 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28  ls to localtime(
17270 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66  ) and variants f
17280 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73  ail. If onoff is
17290 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e   zero,.    ** un
172a0 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  do this setting.
172b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
172c0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
172d0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
172e0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
172f0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
17300 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20  ocaltimeFault = 
17310 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
17320 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17330 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
17340 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
17350 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 20  REE_EXPLAIN).   
17360 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
17370 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
17380 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c 41  E_TESTCTRL_EXPLA
17390 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20 2a 2a 20  IN_STMT,.    ** 
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
173c0 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tmt*,const char*
173d0 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  *);.    **.    *
173e0 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  * If compiled wi
173f0 74 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  th SQLITE_ENABLE
17400 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 2c 20 65  _TREE_EXPLAIN, e
17410 61 63 68 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ach sqlite3_stmt
17420 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a 20 61 20   holds.    ** a 
17430 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
17440 72 69 62 65 73 20 74 68 65 20 6f 70 74 69 6d 69  ribes the optimi
17450 7a 65 64 20 70 61 72 73 65 20 74 72 65 65 2e 20  zed parse tree. 
17460 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74 72   This test-contr
17470 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  ol.    ** return
17480 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
17490 68 61 74 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  hat string..    
174a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
174b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c  TE_TESTCTRL_EXPL
174c0 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20 20 20 20  AIN_STMT: {.    
174d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
174e0 70 53 74 6d 74 20 3d 20 76 61 5f 61 72 67 28 61  pStmt = va_arg(a
174f0 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  p, sqlite3_stmt*
17500 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
17510 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d 20 76 61  har **pzRet = va
17520 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
17530 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20 20 2a 70  har**);.      *p
17540 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  zRet = sqlite3Vd
17550 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 28 56  beExplanation((V
17560 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20 20  dbe*)pStmt);.   
17570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17580 23 65 6e 64 69 66 0a 0a 20 20 7d 0a 20 20 76 61  #endif..  }.  va
17590 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
175a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
175b0 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a  BUILTIN_TEST */.
175c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
175d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
175e0 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c  utility routine,
175f0 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69   useful to VFS i
17600 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20  mplementations, 
17610 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  that checks.** t
17620 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62  o see if a datab
17630 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55  ase file was a U
17640 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65  RI that containe
17650 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65  d a specific que
17660 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ry .** parameter
17670 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61  , and if so obta
17680 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
17690 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d   the query param
176a0 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
176b0 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
176c0 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61  nt is the filena
176d0 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  me pointer passe
176e0 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e  d into the xOpen
176f0 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
17700 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  a VFS implementa
17710 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61  tion.  The zPara
17720 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  m argument is th
17730 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
17740 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
17750 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20   we seek.  This 
17760 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
17770 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
17780 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d   zParam.** param
17790 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74  eter if it exist
177a0 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d  s.  If the param
177b0 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78  eter does not ex
177c0 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
177d0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e  e.** returns a N
177e0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
177f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
17800 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
17810 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  r(const char *zF
17820 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
17830 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20  har *zParam){.  
17840 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
17850 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
17860 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
17870 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
17880 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68  ename) + 1;.  wh
17890 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  ile( zFilename[0
178a0 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ] ){.    int x =
178b0 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
178c0 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  e, zParam);.    
178d0 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
178e0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
178f0 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  lename) + 1;.   
17900 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75   if( x==0 ) retu
17910 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  rn zFilename;.  
17920 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
17930 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
17940 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
17950 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
17960 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17970 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66   boolean value f
17980 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
17990 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eter..*/.int sql
179a0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
179b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
179c0 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
179d0 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20  ar *zParam, int 
179e0 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20  bDflt){.  const 
179f0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
17a00 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
17a10 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
17a20 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44  m);.  bDflt = bD
17a30 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e  flt!=0;.  return
17a40 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42   z ? sqlite3GetB
17a50 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29  oolean(z, bDflt)
17a60 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   : bDflt;.}../*.
17a70 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62  ** Return a 64-b
17a80 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
17a90 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
17aa0 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74  ameter..*/.sqlit
17ab0 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
17ac0 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f  _uri_int64(.  co
17ad0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
17ae0 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame,    /* Filen
17af0 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f  ame as passed to
17b00 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73   xOpen */.  cons
17b10 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
17b20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72        /* URI par
17b30 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f  ameter sought */
17b40 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
17b50 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20   bDflt       /* 
17b60 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65  return if parame
17b70 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a  ter is missing *
17b80 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
17b90 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
17ba0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
17bb0 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
17bc0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
17bd0 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73   v;.  if( z && s
17be0 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
17bf0 26 76 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  &v, sqlite3Strle
17c00 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
17c10 54 46 38 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  TF8)==SQLITE_OK 
17c20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
17c30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
17c40 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
17c50 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
17c60 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
17c70 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
17c80 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
17c90 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
17ca0 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
17cb0 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
17cc0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
17cd0 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
17ce0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
17cf0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
17d00 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
17d10 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26 20  [i].pBt.     && 
17d20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  (zDbName==0 || s
17d30 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
17d40 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  bName, db->aDb[i
17d50 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20  ].zName)==0).   
17d60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17d70 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
17d80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17d90 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17da0 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e  Return the filen
17db0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
17dc0 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
17dd0 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ith a database.*
17de0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
17df0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
17e00 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
17e10 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
17e20 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
17e30 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
17e40 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
17e50 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
17e60 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
17e70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
17e80 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74  eGetFilename(pBt
17e90 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) : 0;.}../*.** 
17ea0 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61  Return 1 if data
17eb0 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
17ec0 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77  y or 0 if read/w
17ed0 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  rite.  Return -1
17ee0 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64   if.** no such d
17ef0 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a  atabase exists..
17f00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
17f10 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  b_readonly(sqlit
17f20 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
17f30 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
17f40 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c  Btree *pBt = sql
17f50 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
17f60 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
17f70 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73    return pBt ? s
17f80 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
17f90 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 42 74 72  donly(sqlite3Btr
17fa0 65 65 50 61 67 65 72 28 70 42 74 29 29 20 3a 20  eePager(pBt)) : 
17fb0 2d 31 3b 0a 7d 0a                                -1;.}.