/ Hex Artifact Content
Login

Artifact aacb100c6bae0141b8afbc846b5e0cfc3c28236e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c 69   Initialize SQLi
0a10: 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  te.  .**.** This
0a20: 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
0a30: 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 69   called to initi
0a40: 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
0a50: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a 20   allocation,.** 
0a60: 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20 73  VFS, and mutex s
0a70: 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72 20  ubsystems prior 
0a80: 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65 72  to doing any ser
0a90: 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a 2a  ious work with.*
0aa0: 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20 61  * SQLite.  But a
0ab0: 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64 6f  s long as you do
0ac0: 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69 74   not compile wit
0ad0: 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  h SQLITE_OMIT_AU
0ae0: 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20 72  TOINIT.** this r
0af0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
0b00: 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63 61  alled automatica
0b10: 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74 69  lly by key routi
0b20: 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20 73  nes such as.** s
0b30: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20 20  qlite3_open().  
0b40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0b50: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 65  ine is a no-op e
0b60: 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65 72  xcept on its ver
0b70: 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f 72  y first call for
0b80: 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a 2a   the process,.**
0b90: 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72 73   or for the firs
0ba0: 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20 63  t call after a c
0bb0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73  all to sqlite3_s
0bc0: 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54  hutdown..**.** T
0bd0: 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20  he first thread 
0be0: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  to call this rou
0bf0: 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69 6e  tine runs the in
0c00: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f 0a  itialization to.
0c10: 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20  ** completion.  
0c20: 49 66 20 73 75 62 73 65 71 75 65 6e 74 20 74 68  If subsequent th
0c30: 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73 20  reads call this 
0c40: 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20 74  routine before t
0c50: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72 65  he first.** thre
0c60: 61 64 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ad has finished 
0c70: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0c80: 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65 6e  on process, then
0c90: 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 0a   the subsequent.
0ca0: 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74 20  ** threads must 
0cb0: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  block until the 
0cc0: 66 69 72 73 74 20 74 68 72 65 61 64 20 66 69 6e  first thread fin
0cd0: 69 73 68 65 73 20 77 69 74 68 20 74 68 65 20 69  ishes with the i
0ce0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 2a  nitialization..*
0cf0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0d00: 68 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c 6c  hread might call
0d10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
0d20: 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63 75  cursively.  Recu
0d30: 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20 74  rsive.** calls t
0d40: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  o this routine s
0d50: 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b 2c  hould not block,
0d60: 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74 68   of course.  Oth
0d70: 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69 6e  erwise the.** in
0d80: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
0d90: 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65 72  cess would never
0da0: 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a   complete..**.**
0db0: 20 4c 65 74 20 58 20 62 65 20 74 68 65 20 66 69   Let X be the fi
0dc0: 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 65 6e  rst thread to en
0dd0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
0de0: 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d 65  .  Let Y be some
0df0: 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64   other.** thread
0e00: 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74 68  .  Then while th
0e10: 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63 61  e initial invoca
0e20: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f 75  tion of this rou
0e30: 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a 20  tine by X is.** 
0e40: 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20 69  incomplete, it i
0e50: 73 20 72 65 71 75 69 72 65 64 20 74 68 61 74 3a  s required that:
0e60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61 6c  .**.**    *  Cal
0e70: 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ls to this routi
0e80: 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20 62  ne from Y must b
0e90: 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 6f  lock until the o
0ea0: 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20 20  uter-most.**    
0eb0: 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f 6d     call by X com
0ec0: 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  pletes..**.**   
0ed0: 20 2a 20 20 52 65 63 75 72 73 69 76 65 20 63 61   *  Recursive ca
0ee0: 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  lls to this rout
0ef0: 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64 20  ine from thread 
0f00: 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  X return immedia
0f10: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77 69  tely.**       wi
0f20: 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a  thout blocking..
0f30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  */.int sqlite3_i
0f40: 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29 7b  nitialize(void){
0f50: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
0f60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
0f70: 4d 61 73 74 65 72 3b 20 29 20 20 20 20 20 20 20  Master; )       
0f80: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74  /* The main stat
0f90: 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69 6e  ic mutex */.  in
0fa0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
0fd0: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 23 69  sult code */..#i
0fe0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
0ff0: 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c 69  _WSD.  rc = sqli
1000: 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39  te3_wsd_init(409
1010: 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63  6, 24);.  if( rc
1020: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1030: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1040: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1050: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
1060: 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  ady completely i
1070: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
1080: 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20   this call.  ** 
1090: 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  to sqlite3_initi
10a0: 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62  alize() should b
10b0: 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  e a no-op.  But 
10c0: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
10d0: 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  on.  ** must be 
10e0: 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73  complete.  So is
10f0: 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65  Init must not be
1100: 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76   set until the v
1110: 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ery end.  ** of 
1120: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20  this routine..  
1130: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1140: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1150: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
1160: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61  ITE_OK;..  /* Ma
1170: 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75 74 65  ke sure the mute
1180: 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69  x subsystem is i
1190: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20  nitialized.  If 
11a0: 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20  unable to .  ** 
11b0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
11c0: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20  utex subsystem, 
11d0: 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74  return early wit
11e0: 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a  h the error..  *
11f0: 2a 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20  * If the system 
1200: 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20  is so sick that 
1210: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1220: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65   allocate a mute
1230: 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  x,.  ** there is
1240: 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65   not much SQLite
1250: 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20   is going to be 
1260: 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a  able to do..  **
1270: 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  .  ** The mutex 
1280: 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74  subsystem must t
1290: 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72 69  ake care of seri
12a0: 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a  alizing its own.
12b0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74    ** initializat
12c0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
12d0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69   sqlite3MutexIni
12e0: 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  t();.  if( rc ) 
12f0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1300: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1310: 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20  malloc() system 
1320: 61 6e 64 20 74 68 65 20 72 65 63 75 72 73 69 76  and the recursiv
1330: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1340: 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70  ex..  ** This op
1350: 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65  eration is prote
1360: 63 74 65 64 20 62 79 20 74 68 65 20 53 54 41 54  cted by the STAT
1370: 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e  IC_MASTER mutex.
1380: 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a    Note that.  **
1390: 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73   MutexAlloc() is
13a0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74   called for a st
13b0: 61 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72  atic mutex prior
13c0: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   to initializing
13d0: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   the.  ** malloc
13e0: 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69   subsystem - thi
13f0: 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
1400: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  he allocation of
1410: 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d   a static.  ** m
1420: 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65  utex must not re
1430: 71 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72  quire support fr
1440: 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75  om the malloc su
1450: 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20  bsystem..  */.  
1460: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61  MUTEX_LOGIC( pMa
1470: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
1480: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1490: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14a0: 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  TER); ).  sqlite
14b0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
14c0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
14d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
14e0: 4d 75 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20  MutexInit = 1;. 
14f0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1500: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
1510: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  ocInit ){.    rc
1520: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1530: 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66  Init();.  }.  if
1540: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1550: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
1560: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
1570: 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  locInit = 1;.   
1580: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1590: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
15a0: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71  utex ){.      sq
15b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15c0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20  g.pInitMutex =. 
15d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15e0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15f0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1600: 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  VE);.      if( s
1610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1620: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26  ig.bCoreMutex &&
1630: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1640: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1650: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1660: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1670: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1680: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1690: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
16a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16b0: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b  nRefInitMutex++;
16c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
16d0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
16e0: 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 63  er);..  /* If rc
16f0: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
1700: 4b 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  K at this point,
1710: 20 74 68 65 6e 20 65 69 74 68 65 72 20 74 68 65   then either the
1720: 20 6d 61 6c 6c 6f 63 0a 20 20 2a 2a 20 73 75 62   malloc.  ** sub
1730: 73 79 73 74 65 6d 20 63 6f 75 6c 64 20 6e 6f 74  system could not
1740: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1750: 6f 72 20 74 68 65 20 73 79 73 74 65 6d 20 66 61  or the system fa
1760: 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  iled to allocate
1770: 0a 20 20 2a 2a 20 74 68 65 20 70 49 6e 69 74 4d  .  ** the pInitM
1780: 75 74 65 78 20 6d 75 74 65 78 2e 20 52 65 74 75  utex mutex. Retu
1790: 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 65  rn an error in e
17a0: 69 74 68 65 72 20 63 61 73 65 2e 20 20 2a 2f 0a  ither case.  */.
17b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17d0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17e0: 44 6f 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  Do the rest of t
17f0: 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1800: 6e 20 75 6e 64 65 72 20 74 68 65 20 72 65 63 75  n under the recu
1810: 72 73 69 76 65 20 6d 75 74 65 78 20 73 6f 0a 20  rsive mutex so. 
1820: 20 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c   ** that we will
1830: 20 62 65 20 61 62 6c 65 20 74 6f 20 68 61 6e 64   be able to hand
1840: 6c 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  le recursive cal
1850: 6c 73 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ls into.  ** sql
1860: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1870: 29 2e 20 20 54 68 65 20 72 65 63 75 72 73 69 76  ).  The recursiv
1880: 65 20 63 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79  e calls normally
1890: 20 63 6f 6d 65 20 74 68 72 6f 75 67 68 0a 20 20   come through.  
18a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ** sqlite3_os_in
18b0: 69 74 28 29 20 77 68 65 6e 20 69 74 20 69 6e 76  it() when it inv
18c0: 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 76 66 73  okes sqlite3_vfs
18d0: 5f 72 65 67 69 73 74 65 72 28 29 2c 20 62 75 74  _register(), but
18e0: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 72 65 63 75   other.  ** recu
18f0: 72 73 69 76 65 20 63 61 6c 6c 73 20 6d 69 67 68  rsive calls migh
1900: 74 20 61 6c 73 6f 20 62 65 20 70 6f 73 73 69 62  t also be possib
1910: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d  le..  **.  ** IM
1920: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
1930: 20 52 2d 30 30 31 34 30 2d 33 37 34 34 35 20 53   R-00140-37445 S
1940: 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 63 61  QLite automatica
1950: 6c 6c 79 20 73 65 72 69 61 6c 69 7a 65 73 20 63  lly serializes c
1960: 61 6c 6c 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  alls.  ** to the
1970: 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 2c 20 73   xInit method, s
1980: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1990: 6f 64 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74  od need not be t
19a0: 68 72 65 61 64 73 61 66 65 2e 0a 20 20 2a 2a 0a  hreadsafe..  **.
19b0: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
19c0: 6e 67 20 6d 75 74 65 78 20 69 73 20 77 68 61 74  ng mutex is what
19d0: 20 73 65 72 69 61 6c 69 7a 65 73 20 61 63 63 65   serializes acce
19e0: 73 73 20 74 6f 20 74 68 65 20 61 70 70 64 65 66  ss to the appdef
19f0: 20 70 63 61 63 68 65 20 78 49 6e 69 74 0a 20 20   pcache xInit.  
1a00: 2a 2a 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ** methods.  The
1a10: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
1a20: 6d 65 74 68 6f 64 73 2e 78 49 6e 69 74 28 29 20  methods.xInit() 
1a30: 61 6c 6c 20 69 73 20 65 6d 62 65 64 64 65 64 20  all is embedded 
1a40: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 61 6c 6c  in the.  ** call
1a50: 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
1a60: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 2e 0a 20  eInitialize().. 
1a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1a80: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
1a90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1aa0: 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28  nitMutex);.  if(
1ab0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1ac0: 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26  nfig.isInit==0 &
1ad0: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
1ae0: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1af0: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 75 6e 63 44  ==0 ){.    FuncD
1b00: 65 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  efHash *pHash = 
1b10: 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48  &GLOBAL(FuncDefH
1b20: 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  ash, sqlite3Glob
1b30: 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20  alFunctions);.  
1b40: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1b50: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1b60: 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 1;.    memset
1b70: 28 70 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  (pHash, 0, sizeo
1b80: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46  f(sqlite3GlobalF
1b90: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
1ba0: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 47  sqlite3RegisterG
1bb0: 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29  lobalFunctions()
1bc0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
1bd0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1be0: 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b  PCacheInit==0 ){
1bf0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c00: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1c10: 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ize();.    }.   
1c20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1c40: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c50: 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31  isPCacheInit = 1
1c60: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1c70: 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20  ite3OsInit();.  
1c80: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1c90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ca0: 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65     sqlite3PCache
1cb0: 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71 6c  BufferSetup( sql
1cc0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1cd0: 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20  .pPage, .       
1ce0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1cf0: 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73  Config.szPage, s
1d00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1d10: 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  ig.nPage);.     
1d20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d30: 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b  nfig.isInit = 1;
1d40: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1d60: 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  nProgress = 0;. 
1d70: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1d80: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
1d90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1da0: 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  itMutex);..  /* 
1db0: 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68  Go back under th
1dc0: 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 61  e static mutex a
1dd0: 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  nd clean up the 
1de0: 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d  recursive.  ** m
1df0: 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20  utex to prevent 
1e00: 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e  a resource leak.
1e10: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1e20: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
1e30: 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47  ter);.  sqlite3G
1e40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
1e50: 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69  InitMutex--;.  i
1e60: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1e70: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1e80: 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61  utex<=0 ){.    a
1e90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c  ssert( sqlite3Gl
1ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
1eb0: 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  nitMutex==0 );. 
1ec0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1ed0: 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f  _free(sqlite3Glo
1ee0: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1ef0: 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  utex);.    sqlit
1f00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1f10: 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20  InitMutex = 0;. 
1f20: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1f30: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
1f40: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1f50: 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61  lowing is just a
1f60: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f   sanity check to
1f70: 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74   make sure SQLit
1f80: 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20  e has.  ** been 
1f90: 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74  compiled correct
1fa0: 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72  ly.  It is impor
1fb0: 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73  tant to run this
1fc0: 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20   code, but.  ** 
1fd0: 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  we don't want to
1fe0: 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65   run it too ofte
1ff0: 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50  n and soak up CP
2000: 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a  U cycles for no.
2010: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f    ** reason.  So
2020: 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20   we run it once 
2030: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
2040: 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ation..  */.#ifn
2050: 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64  def NDEBUG.#ifnd
2060: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
2070: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20  LOATING_POINT.  
2080: 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  /* This section 
2090: 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22  of code's only "
20a0: 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20 61  output" is via a
20b0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
20c0: 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63  ts. */.  if ( rc
20d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20e0: 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75 36     u64 x = (((u6
20f0: 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20  4)1)<<63)-1;.   
2100: 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61   double y;.    a
2110: 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d  ssert(sizeof(x)=
2120: 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  =8);.    assert(
2130: 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f  sizeof(x)==sizeo
2140: 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  f(y));.    memcp
2150: 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20  y(&y, &x, 8);.  
2160: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2170: 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d  3IsNaN(y) );.  }
2180: 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  .#endif.#endif..
2190: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69 6e    /* Do extra in
21a0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  itialization ste
21b0: 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79 20  ps requested by 
21c0: 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52 41  the SQLITE_EXTRA
21d0: 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70 69  _INIT.  ** compi
21e0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a  le-time option..
21f0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2200: 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20  TE_EXTRA_INIT.  
2210: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2220: 4b 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  K && sqlite3Glob
2230: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2240: 29 7b 0a 20 20 20 20 69 6e 74 20 53 51 4c 49 54  ){.    int SQLIT
2250: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 63 6f 6e  E_EXTRA_INIT(con
2260: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 72  st char*);.    r
2270: 63 20 3d 20 53 51 4c 49 54 45 5f 45 58 54 52 41  c = SQLITE_EXTRA
2280: 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23 65  _INIT(0);.  }.#e
2290: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
22a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  c;.}../*.** Undo
22b0: 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
22c0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
22d0: 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20  ze().  Must not 
22e0: 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a  be called while.
22f0: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  ** there are out
2300: 73 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73  standing databas
2310: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2320: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2330: 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20  ons or.** while 
2340: 61 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69  any part of SQLi
2350: 74 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  te is otherwise 
2360: 69 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68  in use in any th
2370: 72 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  read.  This.** r
2380: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  outine is not th
2390: 72 65 61 64 73 61 66 65 2e 20 20 42 75 74 20 69  readsafe.  But i
23a0: 74 20 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76  t is safe to inv
23b0: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
23c0: 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69  .** on when SQLi
23d0: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68  te is already sh
23e0: 75 74 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c  ut down.  If SQL
23f0: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ite is already s
2400: 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e  hut down.** when
2410: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2420: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74   invoked, then t
2430: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
2440: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
2450: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2460: 73 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a  shutdown(void){.
2470: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2480: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
2490: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
24a0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
24b0: 0a 20 20 20 20 76 6f 69 64 20 53 51 4c 49 54 45  .    void SQLITE
24c0: 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28  _EXTRA_SHUTDOWN(
24d0: 76 6f 69 64 29 3b 0a 20 20 20 20 53 51 4c 49 54  void);.    SQLIT
24e0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
24f0: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ();.#endif.    s
2500: 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b  qlite3_os_end();
2510: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2520: 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f  et_auto_extensio
2530: 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n();.    sqlite3
2540: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2550: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  nit = 0;.  }.  i
2560: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2570: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
2580: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2590: 65 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e  e3PcacheShutdown
25a0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
25b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
25c0: 61 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20  acheInit = 0;.  
25d0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
25e0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
25f0: 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20  llocInit ){.    
2600: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64  sqlite3MallocEnd
2610: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2620: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
2630: 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20 20  llocInit = 0;.  
2640: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2650: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2660: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2670: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2690: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
26a0: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
26b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
26d0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
26e0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
26f0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2700: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2710: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2720: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2730: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2740: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2750: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2760: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2770: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2780: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2790: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
27a0: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
27b0: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
27c0: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
27d0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
27e0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
27f0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2800: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2810: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2820: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
2830: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2840: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
2850: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
2860: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
2870: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
2880: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
2890: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
28a0: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
28b0: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
28c0: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
28d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
28e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
28f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
2900: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
2910: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
2920: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
2930: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
2940: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2950: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
2960: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
2970: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
2980: 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66  ile. .    */.#if
2990: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
29a0: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53  THREADSAFE) && S
29b0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
29c0: 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
29d0: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
29e0: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
29f0: 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d  /* Disable all m
2a00: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2a10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2a20: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2a30: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
2a40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2a50: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a70: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2a80: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
2a90: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2aa0: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e   Disable mutexin
2ab0: 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  g of database co
2ac0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
2ad0: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74     /* Enable mut
2ae0: 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61  exing of core da
2af0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
2b00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2b10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
2b20: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
2b30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b40: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2b50: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
2b60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2b70: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2b80: 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20  ERIALIZED: {.   
2b90: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c     /* Enable all
2ba0: 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20   mutexing */.   
2bb0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2bc0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2bd0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2be0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2bf0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b  .bFullMutex = 1;
2c00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2c10: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2c20: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58  ITE_CONFIG_MUTEX
2c30: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
2c40: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
2c50: 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ive mutex implem
2c60: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2c70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2c80: 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76  onfig.mutex = *v
2c90: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2ca0: 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a  3_mutex_methods*
2cb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2cc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2cd0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
2ce0: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
2cf0: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
2d00: 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70  urrent mutex imp
2d10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
2d20: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
2d30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
2d40: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
2d50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2d60: 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61  utex;.      brea
2d70: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
2d80: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
2d90: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
2da0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
2db0: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
2dc0: 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d  ve malloc implem
2dd0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2de0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2df0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72  onfig.m = *va_ar
2e00: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
2e10: 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  m_methods*);.   
2e20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2e30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2e40: 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43  CONFIG_GETMALLOC
2e50: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74  : {.      /* Ret
2e60: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
2e70: 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65  t malloc() imple
2e80: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
2e90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
2eb0: 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65  lloc==0 ) sqlite
2ec0: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
2ed0: 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  ;.      *va_arg(
2ee0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
2ef0: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
2f00: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2f10: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
2f20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2f30: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
2f40: 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20  STATUS: {.      
2f50: 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  /* Enable or dis
2f60: 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  able the malloc 
2f70: 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f  status collectio
2f80: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
2f90: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2fa0: 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67  Memstat = va_arg
2fb0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
2fc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2fd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2fe0: 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a  NFIG_SCRATCH: {.
2ff0: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
3000: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
3010: 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73  scratch memory s
3020: 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  pace */.      sq
3030: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3040: 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.pScratch = va_
3050: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
3060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3070: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
3080: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
3090: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
30a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
30b0: 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .nScratch = va_a
30c0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
30d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30f0: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
3100: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
3110: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
3120: 66 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d  for page cache m
3130: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
3140: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3150: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d  alConfig.pPage =
3160: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3170: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3180: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
3190: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
31a0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
31b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
31c0: 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67  g.nPage = va_arg
31d0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
31e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
31f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3200: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
3210: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
3220: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3230: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3240: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
3250: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3260: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
3270: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
3280: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
32a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
32b0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
32c0: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
32d0: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
32e0: 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c   page cache impl
32f0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3300: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3310: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20  lConfig.pcache2 
3320: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
3330: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3340: 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62  hods2*);.      b
3350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3360: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3370: 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b  IG_GETPCACHE2: {
3380: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3390: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
33a0: 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20  cache2.xInit==0 
33b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
33c0: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
33d0: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
33e0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
33f0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
3400: 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69  ethods2*) = sqli
3410: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3420: 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62  pcache2;.      b
3430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
3440: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3450: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
3460: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3470: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3480: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
3490: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
34a0: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
34b0: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
34c0: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
34d0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
34e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
34f0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
3500: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
3510: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3520: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
3530: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3540: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3550: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3560: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3570: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3590: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
35a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
35b0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
35c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
35d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
35e0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
35f0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
3600: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
3610: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
3620: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
3630: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3640: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
3650: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
3660: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3670: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
3680: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
3690: 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72  the heap pointer
36a0: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72   is NULL, then r
36b0: 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f  estore the mallo
36c0: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
36d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
36e0: 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72   to NULL pointer
36f0: 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c  s too.  This wil
3700: 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c  l cause the mall
3710: 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20  oc to go.       
3720: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
3730: 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e  default implemen
3740: 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69  tation when sqli
3750: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
3760: 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   is.        ** r
3770: 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  un..        */. 
3780: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
3790: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
37a0: 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ig.m, 0, sizeof(
37b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37c0: 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d  fig.m));.      }
37d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
37e0: 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   The heap pointe
37f0: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
3800: 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20  hen install one 
3810: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
3820: 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20  * mem5.c/mem3.c 
3830: 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74  methods. If neit
3840: 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  her ENABLE_MEMSY
3850: 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a  S3 nor.        *
3860: 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  * ENABLE_MEMSYS5
3870: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74   is defined, ret
3880: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
3890: 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
38a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
38b0: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
38c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
38d0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
38e0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
38f0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3900: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
3910: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
3920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3930: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
3940: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
3950: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
3960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3970: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3980: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
3990: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
39a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39b0: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
39c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
39d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
39e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
39f0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
3a00: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3a10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3a20: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
3a30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3a40: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69  e logger funccti
3a50: 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74  on and its first
3a60: 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a   argument..    *
3a70: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73  * The default is
3a80: 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20   NULL.  Logging 
3a90: 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74  is disabled if t
3aa0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
3ab0: 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55  ter is.    ** NU
3ac0: 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
3ad0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3ae0: 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f  G_LOG: {.      /
3af0: 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
3b00: 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
3b10: 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
3b20: 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
3b30: 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
3b40: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
3b50: 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
3b60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3b70: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
3b80: 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69  (ap, void(*)(voi
3b90: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
3ba0: 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  r*));.      */. 
3bb0: 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
3bc0: 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  d(*LOGFUNC_t)(vo
3bd0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3be0: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
3bf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c00: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
3c10: 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20  , LOGFUNC_t);.  
3c20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3c30: 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20  lConfig.pLogArg 
3c40: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3c50: 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d*);.      break
3c60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3c70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3c80: 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  URI: {.      sql
3c90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3ca0: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
3cb0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3cd0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
3ce0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3cf0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3d10: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3d20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3d30: 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c  .** Set up the l
3d40: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73  ookaside buffers
3d50: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
3d60: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52  connection..** R
3d70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3d80: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a  on success.  .**
3d90: 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73   If lookaside is
3da0: 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c   already active,
3db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
3dc0: 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  USY..**.** The s
3dd0: 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  z parameter is t
3de0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
3df0: 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61  es in each looka
3e00: 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68  side slot..** Th
3e10: 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20  e cnt parameter 
3e20: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3e30: 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61   slots.  If pSta
3e40: 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a  rt is NULL the.*
3e50: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
3e60: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
3e70: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
3e80: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3e90: 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74  ()..** If pStart
3ea0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3eb0: 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62  n it is sz*cnt b
3ec0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74  ytes of memory t
3ed0: 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65  o use for.** the
3ee0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
3ef0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3f00: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
3f10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3f20: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c  d *pBuf, int sz,
3f30: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69   int cnt){.  voi
3f40: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
3f50: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
3f60: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
3f70: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
3f80: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
3f90: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
3fa0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
3fb0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
3fc0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
3fd0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
3fe0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
3ff0: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
4000: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
4010: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
4020: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
4030: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
4040: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
4050: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
4060: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
4070: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
4080: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
4090: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
40a0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
40b0: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
40c0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
40d0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
40e0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
40f0: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
4100: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
4110: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
4120: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
4130: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
4140: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
4150: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
4160: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
4170: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
4180: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
4190: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
41a0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
41b0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
41c0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
41d0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
41e0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
41f0: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
4200: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
4210: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4220: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
4230: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
4240: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
4250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
4260: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
4270: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
4280: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
4290: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
42a0: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
42b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
42c0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
42d0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
42e0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
42f0: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
4300: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
4310: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
4320: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
4330: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4340: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
4350: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
4360: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
4370: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
4380: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
4390: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
43a0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
43b0: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
43c0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
43d0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
43e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
43f0: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
4400: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
4410: 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62  bled = 1;.    db
4420: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
4430: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
4440: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
4450: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4460: 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64  .pEnd = 0;.    d
4470: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
4480: 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64  abled = 0;.    d
4490: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
44a0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
44b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
44c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
44d0: 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73  urn the mutex as
44e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
44f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
4500: 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ion..*/.sqlite3_
4510: 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64  mutex *sqlite3_d
4520: 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20  b_mutex(sqlite3 
4530: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
4540: 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a  b->mutex;.}../*.
4550: 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d 75  ** Free up as mu
4560: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20  ch memory as we 
4570: 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76  can from the giv
4580: 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  en database.** c
4590: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  onnection..*/.in
45a0: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c  t sqlite3_db_rel
45b0: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69  ease_memory(sqli
45c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
45d0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  i;.  sqlite3_mut
45e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
45f0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
4600: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
4610: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
4620: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
4630: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
4640: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
4650: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
4660: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
4670: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
4680: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
4690: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
46a0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
46b0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
46c0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
46d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
46e0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
46f0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
4700: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4710: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
4720: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
4730: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
4740: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
4750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
4760: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
4770: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
4780: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
4790: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
47a0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
47b0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
47c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
47d0: 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  BCONFIG_LOOKASID
47e0: 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  E: {.      void 
47f0: 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61  *pBuf = va_arg(a
4800: 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d  p, void*); /* IM
4810: 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34  P: R-26835-10964
4820: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
4830: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4840: 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50  t);       /* IMP
4850: 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20  : R-47871-25994 
4860: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74  */.      int cnt
4870: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4880: 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  t);      /* IMP:
4890: 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a   R-04460-53386 *
48a0: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74  /.      rc = set
48b0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
48c0: 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a  pBuf, sz, cnt);.
48d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
48e0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
48f0: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
4900: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
4910: 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20        int op;   
4920: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
4930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
4940: 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b  mask;    /* Mask
4950: 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73   of the bit in s
4960: 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20  qlite3.flags to 
4970: 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20  set/clear */.   
4980: 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d     } aFlagOp[] =
4990: 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c   {.        { SQL
49a0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
49b0: 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c  BLE_FKEY,    SQL
49c0: 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20  ITE_ForeignKeys 
49d0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20     },.        { 
49e0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
49f0: 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20  ENABLE_TRIGGER, 
4a00: 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
4a10: 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d  gger  },.      }
4a20: 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  ;.      unsigned
4a30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63   int i;.      rc
4a40: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
4a50: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30   /* IMP: R-42790
4a60: 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20  -23372 */.      
4a70: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4a80: 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69  Size(aFlagOp); i
4a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
4aa0: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d   aFlagOp[i].op==
4ab0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  op ){.          
4ac0: 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61  int onoff = va_a
4ad0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4ae0: 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73         int *pRes
4af0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4b00: 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t*);.          i
4b10: 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62  nt oldFlags = db
4b20: 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  ->flags;.       
4b30: 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29     if( onoff>0 )
4b40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  {.            db
4b50: 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67  ->flags |= aFlag
4b60: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
4b70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4b80: 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  onoff==0 ){.    
4b90: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
4ba0: 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d  s &= ~aFlagOp[i]
4bb0: 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20  .mask;.         
4bc0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4bd0: 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66   oldFlags!=db->f
4be0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lags ){.        
4bf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
4c00: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
4c10: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
4c20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
4c30: 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20  f( pRes ){.     
4c40: 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28         *pRes = (
4c50: 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61  db->flags & aFla
4c60: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b  gOp[i].mask)!=0;
4c70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4c80: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
4c90: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
4ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4cb0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
4cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
4cd0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
4ce0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
4cf0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
4d00: 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  e if the buffer 
4d10: 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69  z[0..n-1] contai
4d20: 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a  ns all spaces..*
4d30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
4d40: 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61  Spaces(const cha
4d50: 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
4d60: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b  while( n>0 && z[
4d70: 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d  n-1]==' ' ){ n--
4d80: 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d  ; }.  return n==
4d90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
4da0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
4db0: 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
4dc0: 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59  on named "BINARY
4dd0: 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79  " which is alway
4de0: 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a  s.** available..
4df0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64  **.** If the pad
4e00: 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
4e10: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73   not NULL then s
4e20: 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20  pace padding at 
4e30: 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74  the end.** of st
4e40: 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64  rings is ignored
4e50: 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e  .  This implemen
4e60: 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c  ts the RTRIM col
4e70: 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lation..*/.stati
4e80: 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e  c int binCollFun
4e90: 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c  c(.  void *padFl
4ea0: 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ag,.  int nKey1,
4eb0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
4ec0: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
4ed0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
4ee0: 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  y2.){.  int rc, 
4ef0: 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e  n;.  n = nKey1<n
4f00: 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e  Key2 ? nKey1 : n
4f10: 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d  Key2;.  rc = mem
4f20: 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
4f30: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
4f40: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64  0 ){.    if( pad
4f50: 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c  Flag.     && all
4f60: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
4f70: 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e  Key1)+n, nKey1-n
4f80: 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  ).     && allSpa
4f90: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
4fa0: 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20  2)+n, nKey2-n). 
4fb0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c     ){.      /* L
4fc0: 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65  eave rc unchange
4fd0: 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65  d at 0 */.    }e
4fe0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
4ff0: 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20  nKey1 - nKey2;. 
5000: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5010: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
5020: 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20  nother built-in 
5030: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
5040: 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a  ce: NOCASE. .**.
5050: 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e  ** This collatin
5060: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e  g sequence is in
5070: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
5080: 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65  d for "case inde
5090: 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61  pendant.** compa
50a0: 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73  rison". SQLite's
50b0: 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70   knowledge of up
50c0: 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61  per and lower ca
50d0: 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a  se equivalents.*
50e0: 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74  * extends only t
50f0: 6f 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74  o the 26 charact
5100: 65 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20  ers used in the 
5110: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
5120: 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d  ..**.** At the m
5130: 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f  oment there is o
5140: 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c  nly a UTF-8 impl
5150: 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  ementation..*/.s
5160: 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65  tatic int nocase
5170: 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20  CollatingFunc(. 
5180: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
5190: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
51a0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
51b0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
51c0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
51d0: 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69  {.  int r = sqli
51e0: 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20  te3StrNICmp(.   
51f0: 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a     (const char *
5200: 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63  )pKey1, (const c
5210: 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b  har *)pKey2, (nK
5220: 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31  ey1<nKey2)?nKey1
5230: 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45  :nKey2);.  UNUSE
5240: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
5250: 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72  sed);.  if( 0==r
5260: 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79   ){.    r = nKey
5270: 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72  1-nKey2;.  }.  r
5280: 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn r;.}../*.*
5290: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57  * Return the ROW
52a0: 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ID of the most r
52b0: 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a  ecent insert.*/.
52c0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c  sqlite_int64 sql
52d0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
52e0: 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  _rowid(sqlite3 *
52f0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
5300: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a  ->lastRowid;.}..
5310: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5320: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
5330: 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72  es in the most r
5340: 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71  ecent call to sq
5350: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f  lite3_exec()..*/
5360: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61  .int sqlite3_cha
5370: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
5380: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5390: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
53a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
53b0: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
53c0: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
53d0: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
53e0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
53f0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
5400: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5410: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f    return db->nTo
5420: 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  talChange;.}../*
5430: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70  .** Close all op
5440: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54  en savepoints. T
5450: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  his function onl
5460: 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69  y manipulates fi
5470: 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64  elds of the.** d
5480: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
5490: 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e  bject, it does n
54a0: 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76  ot close any sav
54b0: 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79  epoints that may
54c0: 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74   be open.** at t
54d0: 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20  he b-tree/pager 
54e0: 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  level..*/.void s
54f0: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
5500: 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  oints(sqlite3 *d
5510: 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d  b){.  while( db-
5520: 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  >pSavepoint ){. 
5530: 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54     Savepoint *pT
5540: 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f  mp = db->pSavepo
5550: 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61  int;.    db->pSa
5560: 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e  vepoint = pTmp->
5570: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
5580: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d  e3DbFree(db, pTm
5590: 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53  p);.  }.  db->nS
55a0: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
55b0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
55c0: 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e   0;.  db->isTran
55d0: 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74  sactionSavepoint
55e0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 0;.}../*.** I
55f0: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
5600: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73  ctor function as
5610: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75  sociated with Fu
5620: 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e  ncDef p, if any.
5630: 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74   Except,.** if t
5640: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  his is not the l
5650: 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ast copy of the 
5660: 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74  function, do not
5670: 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74   invoke it. Mult
5680: 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f  iple.** copies o
5690: 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74  f a single funct
56a0: 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20  ion are created 
56b0: 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63  when create_func
56c0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
56d0: 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f  .** with SQLITE_
56e0: 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ANY as the encod
56f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5700: 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  oid functionDest
5710: 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  roy(sqlite3 *db,
5720: 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20   FuncDef *p){.  
5730: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
5740: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d  pDestructor = p-
5750: 3e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  >pDestructor;.  
5760: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
5770: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
5780: 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  or->nRef--;.    
5790: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d  if( pDestructor-
57a0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
57b0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78    pDestructor->x
57c0: 44 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63  Destroy(pDestruc
57d0: 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b  tor->pUserData);
57e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
57f0: 46 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75  Free(db, pDestru
5800: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ctor);.    }.  }
5810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5820: 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61 73   TRUE if databas
5830: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
5840: 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  has unfinalized 
5850: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
5860: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
5870: 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63  shed sqlite3_bac
5880: 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a  kup objects.  .*
5890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
58a0: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71  nectionIsBusy(sq
58b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
58c0: 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t j;.  assert( s
58d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
58e0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
58f0: 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20    if( db->pVdbe 
5900: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
5910: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
5920: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; j++){.    Btre
5930: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
5940: 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [j].pBt;.    if(
5950: 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42   pBt && sqlite3B
5960: 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70  treeIsInBackup(p
5970: 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Bt) ) return 1;.
5980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5990: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
59a0: 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74  n existing SQLit
59b0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74  e database.*/.st
59c0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
59d0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  Close(sqlite3 *d
59e0: 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62  b, int forceZomb
59f0: 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29  ie){.  if( !db )
5a00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5a10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
5a20: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
5a30: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
5a40: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
5a50: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
5a60: 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
5a70: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
5a80: 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
5a90: 46 6f 72 63 65 20 78 44 65 73 74 72 6f 79 20 63  Force xDestroy c
5aa0: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
5ab0: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
5ac0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
5ad0: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d  rnalSchema(db, -
5ae0: 31 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  1);..  /* If a t
5af0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
5b00: 65 6e 2c 20 74 68 65 20 52 65 73 65 74 49 6e 74  en, the ResetInt
5b10: 65 72 6e 61 6c 53 63 68 65 6d 61 28 29 20 63 61  ernalSchema() ca
5b20: 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69  ll above.  ** wi
5b30: 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c  ll not have call
5b40: 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ed the xDisconne
5b50: 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61  ct() method on a
5b60: 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  ny virtual.  ** 
5b70: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62  tables in the db
5b80: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
5b90: 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  y. The following
5ba0: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
5bb0: 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c  back().  ** call
5bc0: 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20   will do so. We 
5bd0: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
5be0: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
5bf0: 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a   for active.  **
5c00: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
5c10: 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d  below, as the v-
5c20: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
5c30: 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72  tion may be stor
5c40: 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72  ing.  ** some pr
5c50: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
5c60: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  s internally..  
5c70: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  */.  sqlite3Vtab
5c80: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20  Rollback(db);.. 
5c90: 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76   /* Legacy behav
5ca0: 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f  ior (sqlite3_clo
5cb0: 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69  se() behavior) i
5cc0: 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  s to return.  **
5cd0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20   SQLITE_BUSY if 
5ce0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
5cf0: 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  an not be closed
5d00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
5d10: 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a  */.  if( !forceZ
5d20: 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74  ombie && connect
5d30: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
5d40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5d50: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
5d60: 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c  Y, "unable to cl
5d70: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
5d80: 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20  alized ".       
5d90: 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75  "statements or u
5da0: 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70  nfinished backup
5db0: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
5dc0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
5dd0: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
5de0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
5df0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
5e00: 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rt the connectio
5e10: 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20  n into a zombie 
5e20: 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  and then close i
5e30: 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  t..  */.  db->ma
5e40: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
5e50: 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c  IC_ZOMBIE;.  sql
5e60: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
5e70: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29  dCloseZombie(db)
5e80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
5e90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
5ea0: 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e  wo variations on
5eb0: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
5ec0: 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e  rface for closin
5ed0: 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
5ee0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
5ef0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
5f00: 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20  version returns 
5f10: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
5f20: 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f  ** leaves the co
5f30: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20  nnection option 
5f40: 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66  if there are unf
5f50: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
5f60: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
5f70: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
5f80: 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20  lite3_backups.  
5f90: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
5fa0: 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f  e_v2().** versio
5fb0: 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e  n forces the con
5fc0: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d  nection to becom
5fd0: 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68  e a zombie if th
5fe0: 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f  ere are.** unclo
5ff0: 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61  sed resources, a
6000: 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20  nd arranges for 
6010: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65  deallocation whe
6020: 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72  n the last.** pr
6030: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20  epare statement 
6040: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
6050: 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74  p closes..*/.int
6060: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
6070: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
6080: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
6090: 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71  (db,0); }.int sq
60a0: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73  lite3_close_v2(s
60b0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
60c0: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
60d0: 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a  (db,1); }.../*.*
60e0: 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  * Close the mute
60f0: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f  x on database co
6100: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a  nnection db..**.
6110: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
6120: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
6130: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a  ection db is a z
6140: 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74  ombie (meaning t
6150: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73  hat there.** has
6160: 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61   been a prior ca
6170: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ll to sqlite3_cl
6180: 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74  ose(db) or sqlit
6190: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29  e3_close_v2(db))
61a0: 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71   and.** every sq
61b0: 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e  lite3_stmt has n
61c0: 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  ow been finalize
61d0: 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69  d and every sqli
61e0: 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a  te3_backup has.*
61f0: 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e  * finished, then
6200: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
6210: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
6220: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
6230: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c  dCloseZombie(sql
6240: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
6250: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6270: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
6280: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
6290: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
62a0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73  re outstanding s
62b0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73  qlite3_stmt or s
62c0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
62d0: 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66  jects.  ** or if
62e0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
62f0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
6300: 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74   closed by sqlit
6310: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20  e3_close_v2(),. 
6320: 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65   ** then just le
6330: 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ave the mutex an
6340: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
6350: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d   if( db->magic!=
6360: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
6370: 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f  BIE || connectio
6380: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
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 3b 0a 20  );.    return;. 
63c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
63d0: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
63e0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
63f0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
6400: 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20  ection has.  ** 
6410: 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74  closed all sqlit
6420: 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69  e3_stmt and sqli
6430: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
6440: 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a  ts and has been.
6450: 20 20 2a 2a 20 70 61 73 65 64 20 74 6f 20 73 71    ** pased to sq
6460: 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61  lite3_close (mea
6470: 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20  ning that it is 
6480: 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72  a zombie).  Ther
6490: 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61  efore,.  ** go a
64a0: 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c  head and free al
64b0: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a  l resources..  *
64c0: 2f 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  /..  /* Free any
64d0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76   outstanding Sav
64e0: 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
64f0: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  s. */.  sqlite3C
6500: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
6510: 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  b);..  for(j=0; 
6520: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
6530: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
6540: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a  pDb = &db->aDb[j
6550: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
6560: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
6570: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
6580: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
6590: 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20  pDb->pBt = 0;.  
65a0: 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a      if( j!=1 ){.
65b0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63          pDb->pSc
65c0: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
65d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
65e0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
65f0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29  alSchema(db, -1)
6600: 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65  ;..  /* Tell the
6610: 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e   code in notify.
6620: 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  c that the conne
6630: 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  ction no longer 
6640: 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c  holds any.  ** l
6650: 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f  ocks and does no
6660: 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75  t require any fu
6670: 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  rther unlock-not
6680: 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
6690: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e   */.  sqlite3Con
66a0: 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62  nectionClosed(db
66b0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  );..  assert( db
66c0: 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73  ->nDb<=2 );.  as
66d0: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64  sert( db->aDb==d
66e0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a  b->aDbStatic );.
66f0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72    for(j=0; j<Arr
6700: 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63  aySize(db->aFunc
6710: 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46  .a); j++){.    F
6720: 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a  uncDef *pNext, *
6730: 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66  pHash, *p;.    f
6740: 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61  or(p=db->aFunc.a
6750: 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29  [j]; p; p=pHash)
6760: 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d 20  {.      pHash = 
6770: 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20  p->pHash;.      
6780: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
6790: 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74      functionDest
67a0: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  roy(db, p);.    
67b0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
67c0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
67d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
67e0: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
67f0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
6800: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
6810: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
6820: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
6830: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
6840: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f  Next(i)){.    Co
6850: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
6860: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
6870: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
6880: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64   /* Invoke any d
6890: 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73  estructors regis
68a0: 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74  tered for collat
68b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
68c0: 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66  r data. */.    f
68d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
68e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  ){.      if( pCo
68f0: 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20  ll[j].xDel ){.  
6900: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78        pColl[j].x
6910: 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73  Del(pColl[j].pUs
6920: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
6930: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
6940: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b  Free(db, pColl);
6950: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
6960: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f  shClear(&db->aCo
6970: 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
6980: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6990: 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69  UALTABLE.  for(i
69a0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
69b0: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
69c0: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
69d0: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(i)){.    Mod
69e0: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
69f0: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
6a00: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
6a10: 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20   pMod->xDestroy 
6a20: 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78  ){.      pMod->x
6a30: 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41  Destroy(pMod->pA
6a40: 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ux);.    }.    s
6a50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6a60: 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71   pMod);.  }.  sq
6a70: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
6a80: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
6a90: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45  ndif..  sqlite3E
6aa0: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
6ab0: 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c  OK, 0); /* Deall
6ac0: 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65  ocates any cache
6ad0: 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e  d error strings.
6ae0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45   */.  if( db->pE
6af0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
6b00: 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70  3ValueFree(db->p
6b10: 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Err);.  }.  sqli
6b20: 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f  te3CloseExtensio
6b30: 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d  ns(db);..  db->m
6b40: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
6b50: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
6b60: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
6b70: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
6b80: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
6b90: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
6ba0: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
6bb0: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
6bc0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
6bd0: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
6be0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
6bf0: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
6c00: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
6c10: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
6c20: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
6c30: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
6c40: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
6c50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
6c60: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
6c70: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
6c80: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
6c90: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
6ca0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6cb0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
6cc0: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
6cd0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
6ce0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
6cf0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
6d00: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
6d10: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
6d20: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
6d30: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
6d40: 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20  ide.nOut==0 );  
6d50: 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f  /* Fails on a lo
6d60: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c  okaside memory l
6d70: 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  eak */.  if( db-
6d80: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
6d90: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
6da0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
6db0: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
6dc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
6dd0: 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(db);.}../*.**
6de0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
6df0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49  tabase files.  I
6e00: 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
6e10: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  t SQLITE_OK, the
6e20: 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75  n.** any open cu
6e30: 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
6e40: 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22  dated ("tripped"
6e50: 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69   - as in "trippi
6e60: 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20  ng a circuit.** 
6e70: 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61  breaker") and ma
6e80: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69  de to return tri
6e90: 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61  pCode if there a
6ea0: 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a  re any further.*
6eb0: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73  * attempts to us
6ec0: 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  e that cursor..*
6ed0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
6ee0: 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65  llbackAll(sqlite
6ef0: 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43  3 *db, int tripC
6f00: 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ode){.  int i;. 
6f10: 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30   int inTrans = 0
6f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6f30: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
6f40: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
6f50: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
6f60: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72  nMalloc();.  for
6f70: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
6f80: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6f90: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
6fa0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
6fb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
6fc0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6fd0: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  ns(p) ){.       
6fe0: 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20   inTrans = 1;.  
6ff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7000: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
7010: 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20  (p, tripCode);. 
7020: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e       db->aDb[i].
7030: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20  inTrans = 0;.   
7040: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
7050: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
7060: 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
7070: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
7080: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53   if( db->flags&S
7090: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
70a0: 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ges ){.    sqlit
70b0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
70c0: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
70d0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
70e0: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
70f0: 62 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  b, -1);.  }..  /
7100: 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63  * Any deferred c
7110: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
7120: 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65  ions have now be
7130: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
7140: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
7150: 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ons = 0;..  /* I
7160: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
7170: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
7180: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
7190: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
71a0: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
71b0: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
71c0: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
71d0: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
71e0: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
71f0: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
7200: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
7210: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7220: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
7230: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
7240: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
7250: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
7260: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
7270: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
7280: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
7290: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
72a0: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
72b0: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
72c0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
72d0: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
72e0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
72f0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
7300: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
7310: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
7320: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
7330: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
7340: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
7350: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
7360: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
7370: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
7380: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
7390: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
73a0: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
73b0: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
73c0: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
73d0: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
73e0: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
73f0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
7400: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
7410: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
7420: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
7430: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
7440: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
7450: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
7460: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
7470: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
7480: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
7490: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
74a0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
74b0: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
74c0: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
74d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
74e0: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
74f0: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
7500: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
7510: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
7520: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
7530: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
7540: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
7550: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
7560: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
7570: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
7580: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
7590: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
75a0: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
75b0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
75c0: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
75d0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
75e0: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
75f0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
7600: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
7610: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
7620: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
7630: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
7640: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
7650: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
7660: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
7670: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
7680: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
7690: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
76a0: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
76b0: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
76c0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
76d0: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
76e0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
76f0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
7700: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
7710: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
7720: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
7730: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
7740: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
7750: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
7760: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
7770: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
7780: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
7790: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
77a0: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
77b0: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
77c0: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
77d0: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
77e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
77f0: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
7800: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
7810: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
7820: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
7830: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
7840: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
7850: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
7860: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7870: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
7880: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
7890: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
78a0: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
78b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
78c0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
78d0: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
78e0: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
78f0: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
7900: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
7910: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
7920: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
7930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7940: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
7950: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
7960: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
7970: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
7980: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
7990: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
79a0: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
79b0: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
79c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
79d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
79e0: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
79f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
7a00: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
7a10: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
7a20: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
7a30: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
7a40: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
7a50: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
7a60: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
7a70: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
7a80: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
7a90: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
7aa0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
7ab0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7ac0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
7ad0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
7ae0: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
7b00: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
7b10: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
7b40: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
7b50: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
7b60: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
7b70: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
7b80: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
7b90: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
7ba0: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
7bb0: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
7bc0: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
7bd0: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
7be0: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
7bf0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
7c00: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
7c10: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
7c20: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
7c30: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
7c40: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
7c50: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
7c60: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
7c70: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
7c80: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
7c90: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
7ca0: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
7cb0: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
7cc0: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
7cd0: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
7ce0: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
7cf0: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
7d00: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
7d10: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
7d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
7d30: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
7d40: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
7d50: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
7d60: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
7d70: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
7d80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
7d90: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
7da0: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
7db0: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
7dc0: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
7dd0: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
7de0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
7df0: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
7e00: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
7e10: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
7e20: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
7e30: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
7e40: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
7e50: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
7e60: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
7e70: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
7e80: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
7e90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7ea0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
7eb0: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
7ec0: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
7ed0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
7ee0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
7ef0: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
7f00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7f10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
7f20: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
7f30: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
7f40: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
7f50: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
7f60: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
7f70: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
7f80: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
7f90: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
7fa0: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
7fb0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
7fc0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
7fd0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
7fe0: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
7ff0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
8000: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
8010: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
8020: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
8030: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
8040: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
8050: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
8060: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
8070: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
8080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
8090: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
80a0: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
80b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
80c0: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
80d0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
80e0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
80f0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
8100: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
8110: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
8120: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
8130: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
8140: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
8150: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
8160: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
8170: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
8180: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8190: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
81a0: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
81b0: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
81c0: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
81d0: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
81e0: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
81f0: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
8200: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8210: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8220: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8230: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
8240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
8250: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
8260: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8270: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
8280: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
8290: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
82a0: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
82b0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
82c0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
82d0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
82e0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
82f0: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
8300: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
8310: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
8320: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
8330: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
8340: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
8350: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
8360: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
8370: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
8380: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
8390: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
83a0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
83b0: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
83c0: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
83d0: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
83e0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f  ProgressOps = nO
83f0: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
8400: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
8410: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
8420: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
8430: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
8440: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
8450: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
8460: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
8470: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8480: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
8490: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
84a0: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
84b0: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
84c0: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
84d0: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
84e0: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
84f0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
8500: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
8510: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
8520: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
8530: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
8540: 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30   ms){.  if( ms>0
8550: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79   ){.    db->busy
8560: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
8570: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
8580: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
8590: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
85a0: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
85b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
85c0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
85d0: 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ler(db, 0, 0);. 
85e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
85f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8600: 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e  Cause any pendin
8610: 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73  g operation to s
8620: 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69  top at its earli
8630: 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  est opportunity.
8640: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8650: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
8660: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75  e3 *db){.  db->u
8670: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
8680: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
8690: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
86a0: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
86b0: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
86c0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
86d0: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
86e0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
86f0: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
8700: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
8710: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
8720: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
8730: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
8740: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8750: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
8760: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
8770: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
8780: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
8790: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
87a0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
87b0: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
87c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
87d0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
87e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
87f0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
8800: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
8810: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
8820: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
8830: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
8840: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
8850: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8860: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
8870: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
8880: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
8890: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46  3_context*),.  F
88a0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
88b0: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
88c0: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
88d0: 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65  t nName;..  asse
88e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
88f0: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
8900: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
8910: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
8920: 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28       (xFunc && (
8930: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
8940: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46  ) || .      (!xF
8950: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
8960: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
8970: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
8980: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
8990: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
89a0: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
89b0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
89c0: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
89d0: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
89e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46  ite3Strlen30( zF
89f0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
8a00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8a10: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
8a20: 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20  .  }.  .#ifndef 
8a30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
8a40: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
8a50: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
8a60: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
8a70: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
8a80: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
8a90: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
8aa0: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
8ab0: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
8ac0: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
8ad0: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
8ae0: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
8af0: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
8b00: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
8b10: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
8b20: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
8b30: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
8b40: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
8b50: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
8b60: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
8b70: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
8b80: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
8b90: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
8ba0: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
8bb0: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
8bc0: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
8bd0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
8be0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
8bf0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
8c00: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
8c10: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
8c20: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
8c30: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
8c40: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  tructor);.    if
8c50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8c60: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
8c70: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
8c80: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
8c90: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
8ca0: 55 54 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20  UTF16LE,.       
8cb0: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
8cc0: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
8cd0: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
8ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8cf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8d00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8d10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
8d20: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
8d30: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
8d40: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
8d50: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
8d60: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
8d70: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
8d80: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
8d90: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
8da0: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
8db0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
8dc0: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
8dd0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
8de0: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
8df0: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
8e00: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
8e10: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
8e20: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
8e30: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
8e40: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
8e50: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
8e60: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
8e70: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
8e80: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
8e90: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
8ea0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
8eb0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
8ec0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
8ed0: 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63  p->iPrefEnc==enc
8ee0: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
8ef0: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
8f00: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
8f10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8f20: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
8f30: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
8f40: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
8f50: 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e  /modify user-fun
8f60: 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74  ction due to act
8f70: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
8f80: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8f90: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
8fa0: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
8fb0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
8fc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8fd0: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
8fe0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
8ff0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
9000: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
9010: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
9020: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61  unctionName, nNa
9030: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
9040: 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  c, 1);.  assert(
9050: 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  p || db->mallocF
9060: 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70  ailed);.  if( !p
9070: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9080: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9090: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64  ..  /* If an old
90a0: 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  er version of th
90b0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  e function with 
90c0: 61 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73  a configured des
90d0: 74 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20  tructor is.  ** 
90e0: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69  being replaced i
90f0: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
9100: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65  ctor function he
9110: 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f  re. */.  functio
9120: 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b  nDestroy(db, p);
9130: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ..  if( pDestruc
9140: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
9150: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  ructor->nRef++;.
9160: 20 20 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75    }.  p->pDestru
9170: 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74  ctor = pDestruct
9180: 6f 72 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d  or;.  p->flags =
9190: 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d   0;.  p->xFunc =
91a0: 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74   xFunc;.  p->xSt
91b0: 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d  ep = xStep;.  p-
91c0: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
91d0: 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  nal;.  p->pUserD
91e0: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
91f0: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31  .  p->nArg = (u1
9200: 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  6)nArg;.  return
9210: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9220: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
9230: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
9240: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
9250: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
9260: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
9270: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
9280: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
9290: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
92a0: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
92b0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
92c0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
92d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
92e0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
92f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
9300: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
9310: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
9320: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
9330: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
9340: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
9350: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
9360: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
9370: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
9380: 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20  xStep,.         
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61             xFina
93b0: 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  l, 0);.}..int sq
93c0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
93d0: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ction_v2(.  sqli
93e0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
93f0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
9400: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
9410: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
9420: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
9430: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
9440: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
9450: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
9460: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
9470: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
9480: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
9490: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
94a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
94b0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
94c0: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
94d0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
94e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
94f0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
9500: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
9510: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
9520: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78  >mutex);.  if( x
9530: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70  Destroy ){.    p
9540: 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72  Arg = (FuncDestr
9550: 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44  uctor *)sqlite3D
9560: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
9570: 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72  sizeof(FuncDestr
9580: 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28  uctor));.    if(
9590: 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20   !pArg ){.      
95a0: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
95b0: 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20     goto out;.   
95c0: 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65   }.    pArg->xDe
95d0: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
95e0: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
95f0: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
9600: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
9610: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
9620: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
9630: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
9640: 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20  Final, pArg);.  
9650: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
9660: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
9670: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
9680: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
9690: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
96a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
96b0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75   pArg);.  }.. ou
96c0: 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
96d0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
96e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
96f0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9700: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
9710: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
9720: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
9730: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
9740: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
9750: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
9760: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
9770: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
9780: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
9790: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
97a0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
97b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
97c0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
97d0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
97e0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
97f0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
9800: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
9810: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
9820: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
9830: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
9840: 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20  char *zFunc8;.  
9850: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9860: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
9870: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
9880: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
9890: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
98a0: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
98b0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
98c0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
98d0: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
98e0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
98f0: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
9900: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46   eTextRep, p, xF
9910: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
9920: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
9930: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
9940: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
9950: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
9960: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9970: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
9980: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
9990: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
99a0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
99b0: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
99c0: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
99d0: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
99e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
99f0: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
9a00: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
9a10: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
9a20: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
9a30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
9a40: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
9a50: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
9a60: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
9a70: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
9a80: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
9a90: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
9aa0: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
9ab0: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
9ac0: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
9ad0: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
9ae0: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
9af0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
9b00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
9b10: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
9b20: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
9b30: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
9b40: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
9b50: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
9b60: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
9b70: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
9b80: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
9b90: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
9ba0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
9bb0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
9bc0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
9bd0: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
9be0: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
9bf0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
9c00: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
9c10: 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
9c20: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
9c30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
9c40: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
9c50: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
9c60: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
9c70: 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29  TE_UTF8, 0)==0 )
9c80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
9c90: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
9ca0: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
9cb0: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
9ce0: 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c  InvalidFunction,
9cf0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
9d00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
9d10: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
9d20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9d30: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9d40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9d60: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
9d70: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
9d80: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
9d90: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
9da0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
9db0: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
9dc0: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
9dd0: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
9de0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
9df0: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
9e00: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
9e10: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
9e20: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
9e30: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
9e40: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
9e50: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
9e60: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
9e70: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
9e80: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
9e90: 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72   *db, void (*xTr
9ea0: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
9eb0: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
9ec0: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
9ed0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
9ee0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
9ef0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
9f00: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
9f10: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
9f20: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
9f30: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
9f40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9f50: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
9f60: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
9f70: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
9f80: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
9f90: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
9fa0: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
9fb0: 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20   registered .** 
9fc0: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
9fd0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
9fe0: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f  **.** A NULL pro
9ff0: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  file function me
a000: 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66  ans that no prof
a010: 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  iling is execute
a020: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
a030: 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70  * profile is a p
a040: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
a050: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
a060: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
a070: 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63  lusion of.** eac
a080: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
a090: 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  that is run..*/.
a0a0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
a0b0: 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  ofile(.  sqlite3
a0c0: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78   *db,.  void (*x
a0d0: 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63  Profile)(void*,c
a0e0: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
a0f0: 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e_uint64),.  voi
a100: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69  d *pArg.){.  voi
a110: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
a120: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
a130: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
a140: 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
a150: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
a160: 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
a170: 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
a180: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
a190: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a1a0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
a1b0: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
a1c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a1d0: 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  IT_TRACE */../*.
a1e0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75  ** Register a fu
a1f0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
a200: 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  oked when a tran
a210: 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e  saction commits.
a220: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b  .** If the invok
a230: 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ed function retu
a240: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
a250: 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65  en the commit be
a260: 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62  comes a.** rollb
a270: 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ack..*/.void *sq
a280: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
a290: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
a2a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a2b0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
a2c0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
a2d0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  se */.  int (*xC
a2e0: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
a2f0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
a300: 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20   invoke on each 
a310: 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64  commit */.  void
a320: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
a330: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
a340: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
a350: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
a360: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
a370: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
a380: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
a390: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b   db->pCommitArg;
a3a0: 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  .  db->xCommitCa
a3b0: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
a3c0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69  ck;.  db->pCommi
a3d0: 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  tArg = pArg;.  s
a3e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a3f0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
a400: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
a410: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
a420: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
a430: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
a440: 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61  me a row is upda
a450: 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ted,.** inserted
a460: 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e   or deleted usin
a470: 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
a480: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
a490: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64  oid *sqlite3_upd
a4a0: 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
a4b0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
a4c0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
a4d0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
a4e0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
a4f0: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
a500: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20  (void*,int,char 
a510: 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e  const *,char con
a520: 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36  st *,sqlite_int6
a530: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
a560: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
a570: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
a580: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a590: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
a5a0: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
a5b0: 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
a5c0: 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b  >xUpdateCallback
a5d0: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
a5e0: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d  db->pUpdateArg =
a5f0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
a600: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
a610: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
a620: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
a630: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
a640: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
a650: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
a660: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
a670: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20  lled.** back by 
a680: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
a690: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
a6a0: 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62  d *sqlite3_rollb
a6b0: 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ack_hook(.  sqli
a6c0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
a6d0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
a6e0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
a6f0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
a700: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
a710: 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c  (void*), /* Call
a720: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
a730: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a750: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
a760: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
a770: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
a780: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
a790: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
a7a0: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c   pRet = db->pRol
a7b0: 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e  lbackArg;.  db->
a7c0: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
a7d0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
a7e0: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
a7f0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
a800: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a810: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
a820: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
a830: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a840: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20  T_WAL./*.** The 
a850: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
a860: 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  () callback regi
a870: 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65  stered by sqlite
a880: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
a890: 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b  oint()..** Invok
a8a0: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
a8b0: 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
a8c0: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
a8d0: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
a8e0: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
a8f0: 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c  han sqlite3.pWal
a900: 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69  Arg cast to an i
a910: 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75  nteger (the valu
a920: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a  e configured by.
a930: 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  ** wal_autocheck
a940: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e  point())..*/ .in
a950: 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  t sqlite3WalDefa
a960: 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20  ultHook(.  void 
a970: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  *pClientData,   
a980: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f    /* Argument */
a990: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
a9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
a9b0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
a9c0: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
a9d0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
a9e0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20  */.  int nFrame 
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
aa00: 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b  ize of WAL */.){
aa10: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53  .  if( nFrame>=S
aa20: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
aa30: 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b  (pClientData) ){
aa40: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
aa50: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
aa60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
aa70: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
aa80: 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  zDb);.    sqlite
aa90: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
aaa0: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
aab0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
aac0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
aad0: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
aae0: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
aaf0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
ab00: 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  ) callback to au
ab10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
ab20: 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61  kpoint.** a data
ab30: 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69  base after commi
ab40: 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
ab50: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
ab60: 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f   nFrame or.** mo
ab70: 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  re frames in the
ab80: 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69   log file. Passi
ab90: 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67  ng zero or a neg
aba0: 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74  ative value as t
abb0: 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72  he.** nFrame par
abc0: 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20  ameter disables 
abd0: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
abe0: 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a  oints entirely..
abf0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
ac00: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
ac10: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
ac20: 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73  eplaces any exis
ac30: 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ting callback.**
ac40: 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   registered usin
ac50: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
ac60: 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20  ok(). Likewise, 
ac70: 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61  registering a ca
ac80: 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  llback.** using 
ac90: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
aca0: 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  () disables the 
acb0: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
acc0: 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  oint mechanism.*
acd0: 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
ace0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
acf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
ad00: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
ad10: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
ad20: 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65  t nFrame){.#ifde
ad30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
ad40: 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  L.  UNUSED_PARAM
ad50: 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
ad60: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72  ED_PARAMETER(nFr
ad70: 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  ame);.#else.  if
ad80: 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20  ( nFrame>0 ){.  
ad90: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
ada0: 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61  ok(db, sqlite3Wa
adb0: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51  lDefaultHook, SQ
adc0: 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
add0: 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  nFrame));.  }els
ade0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  e{.    sqlite3_w
adf0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30  al_hook(db, 0, 0
ae00: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
ae10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ae20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
ae30: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
ae40: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
ae50: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
ae60: 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a  tion is written.
ae70: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74  ** into the writ
ae80: 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74  e-ahead-log by t
ae90: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
aea0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
aeb0: 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f   *sqlite3_wal_ho
aec0: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
aed0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
aee0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
aef0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
af00: 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
af10: 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  int(*xCallback)(
af20: 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a  void *, sqlite3*
af30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
af40: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
af50: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
af60: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
af70: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
af80: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
af90: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
afa0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76  ITE_OMIT_WAL.  v
afb0: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
afc0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
afd0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
afe0: 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72  Ret = db->pWalAr
aff0: 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c  g;.  db->xWalCal
b000: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
b010: 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67  k;.  db->pWalArg
b020: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
b030: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
b040: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
b050: 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a  urn pRet;.#else.
b060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
b070: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
b080: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
b090: 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zDb..*/.int sqli
b0a0: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
b0b0: 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  nt_v2(.  sqlite3
b0c0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
b0d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
b0e0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
b0f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
b100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b110: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61   /* Name of atta
b120: 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f  ched database (o
b130: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
b140: 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20   eMode,         
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b160: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
b170: 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  T_* value */.  i
b180: 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20  nt *pnLog,      
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b1a0: 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57  * OUT: Size of W
b1b0: 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73  AL log in frames
b1c0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70   */.  int *pnCkp
b1d0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
b1e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
b1f0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  tal number of fr
b200: 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65  ames checkpointe
b210: 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  d */.){.#ifdef S
b220: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
b230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b240: 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  K;.#else.  int r
b250: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b270: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
b280: 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f  nt iDb = SQLITE_
b290: 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f  MAX_ATTACHED;  /
b2a0: 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20  * sqlite3.aDb[] 
b2b0: 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63  index of db to c
b2c0: 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  heckpoint */..  
b2d0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
b2e0: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
b2f0: 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65  es to -1 in case
b300: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b310: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67  . */.  if( pnLog
b320: 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a   ) *pnLog = -1;.
b330: 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a    if( pnCkpt ) *
b340: 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20  pnCkpt = -1;..  
b350: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
b360: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53  HECKPOINT_FULL>S
b370: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
b380: 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73  _PASSIVE );.  as
b390: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
b3a0: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c  CKPOINT_FULL<SQL
b3b0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
b3c0: 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65  ESTART );.  asse
b3d0: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
b3e0: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d  POINT_PASSIVE+2=
b3f0: 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
b400: 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20  NT_RESTART );.  
b410: 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
b420: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
b430: 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
b440: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
b450: 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65  ESTART ){.    re
b460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
b470: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
b480: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
b490: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
b4a0: 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
b4b0: 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
b4c0: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
b4d0: 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
b4e0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
b4f0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
b500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
b510: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  or(db, SQLITE_ER
b520: 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  ROR, "unknown da
b530: 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62  tabase: %s", zDb
b540: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b550: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63  rc = sqlite3Chec
b560: 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20  kpoint(db, iDb, 
b570: 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
b580: 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ckpt);.    sqlit
b590: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
b5a0: 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  0);.  }.  rc = s
b5b0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
b5c0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
b5d0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
b5e0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
b5f0: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
b600: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
b610: 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20  t database zDb. 
b620: 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  If zDb is NULL, 
b630: 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72  or if the buffer
b640: 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zDb points.** t
b650: 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72  o contains a zer
b660: 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c  o-length string,
b670: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
b680: 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20  tabases are .** 
b690: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
b6a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
b6b0: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  _checkpoint(sqli
b6c0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
b6d0: 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74  har *zDb){.  ret
b6e0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  urn sqlite3_wal_
b6f0: 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62  checkpoint_v2(db
b700: 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48  , zDb, SQLITE_CH
b710: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
b720: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e  , 0, 0);.}..#ifn
b730: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b740: 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  WAL./*.** Run a 
b750: 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61  checkpoint on da
b760: 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73  tabase iDb. This
b770: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64   is a no-op if d
b780: 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a  atabase iDb is.*
b790: 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  * not currently 
b7a0: 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
b7b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
b7c0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
b7d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
b7e0: 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
b7f0: 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  ted, this .** fu
b800: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
b810: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64  QLITE_LOCKED and
b820: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73   a checkpoint is
b830: 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20   not attempted. 
b840: 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
b850: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e  occurs while run
b860: 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f  ning the checkpo
b870: 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  int, an SQLite e
b880: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
b890: 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20   returned (i.e. 
b8a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f  SQLITE_IOERR). O
b8b0: 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
b8c0: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  _OK..**.** The m
b8d0: 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
b8e0: 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c   handle db shoul
b8f0: 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65  d be held by the
b900: 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74   caller. The mut
b910: 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  ex.** associated
b920: 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
b930: 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  ic b-tree being 
b940: 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20  checkpointed is 
b950: 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73  taken by.** this
b960: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
b970: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
b980: 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s running..**.**
b990: 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65   If iDb is passe
b9a0: 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  d SQLITE_MAX_ATT
b9b0: 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20  ACHED, then all 
b9c0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
b9d0: 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70  es are.** checkp
b9e0: 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72  ointed. If an er
b9f0: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
ba00: 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  ed it is returne
ba10: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a  d immediately -.
ba20: 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73  ** no attempt is
ba30: 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
ba40: 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e  int any remainin
ba50: 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  g databases..**.
ba60: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  ** Parameter eMo
ba70: 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c  de is one of SQL
ba80: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
ba90: 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20  ASSIVE, FULL or 
baa0: 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20  RESTART..*/.int 
bab0: 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
bac0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
bad0: 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64  nt iDb, int eMod
bae0: 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69  e, int *pnLog, i
baf0: 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69  nt *pnCkpt){.  i
bb00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bb10: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
bb20: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
bb30: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb50: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
bb60: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74  erate through at
bb70: 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20  tached dbs */.  
bb80: 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20  int bBusy = 0;  
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54  /* True if SQLIT
bbb0: 45 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20  E_BUSY has been 
bbc0: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a  encountered */..
bbd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
bbe0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
bbf0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
bc00: 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a  ert( !pnLog || *
bc10: 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61  pnLog==-1 );.  a
bc20: 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c  ssert( !pnCkpt |
bc30: 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b  | *pnCkpt==-1 );
bc40: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
bc50: 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51  b->nDb && rc==SQ
bc60: 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
bc70: 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c     if( i==iDb ||
bc80: 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58   iDb==SQLITE_MAX
bc90: 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20  _ATTACHED ){.   
bca0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
bcb0: 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64  treeCheckpoint(d
bcc0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65  b->aDb[i].pBt, e
bcd0: 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
bce0: 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f  kpt);.      pnLo
bcf0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43  g = 0;.      pnC
bd00: 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  kpt = 0;.      i
bd10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
bd20: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42  SY ){.        bB
bd30: 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  usy = 1;.       
bd40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bd50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bd60: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
bd70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
bd80: 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42  Busy) ? SQLITE_B
bd90: 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64  USY : rc;.}.#end
bda0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
bdb0: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
bdc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
bdd0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61  turns true if ma
bde0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64  in-memory should
bdf0: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
be00: 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61   of.** a tempora
be10: 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e  ry file for tran
be20: 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65  sient pager file
be30: 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20  s and statement 
be40: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
be50: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
be60: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
be70: 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70  alue of db->temp
be80: 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a  _store (runtime.
be90: 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e  ** parameter) an
bea0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69  d the compile ti
beb0: 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49  me value of SQLI
bec0: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54  TE_TEMP_STORE. T
bed0: 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
bee0: 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
bef0: 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
bf00: 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74   between these t
bf10: 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64  wo values.** and
bf20: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20   this functions 
bf30: 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a  return value..**
bf40: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d  .**   SQLITE_TEM
bf50: 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e  P_STORE     db->
bf60: 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c  temp_store     L
bf70: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f  ocation of tempo
bf80: 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  rary database.**
bf90: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
bfa0: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
bfb0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
bfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
bfe0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
bff0: 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
c000: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
c010: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
c020: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
c030: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
c040: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
c050: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
c060: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
c070: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
c090: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
c0a0: 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   1).**   1      
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
c0e0: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
c110: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
c120: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
c150: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
c160: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
c170: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
c180: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
c190: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
c1a0: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
c1b0: 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20  **   3          
c1c0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
c1e0: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
c1f0: 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1).*/.int sqlite
c200: 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f  3TempInMemory(co
c210: 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29  nst sqlite3 *db)
c220: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  {.#if SQLITE_TEM
c230: 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74  P_STORE==1.  ret
c240: 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
c250: 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  tore==2 );.#endi
c260: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
c270: 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74  P_STORE==2.  ret
c280: 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
c290: 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69  tore!=1 );.#endi
c2a0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
c2b0: 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74  P_STORE==3.  ret
c2c0: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69  urn 1;.#endif.#i
c2d0: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
c2e0: 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f  ORE<1 || SQLITE_
c2f0: 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72  TEMP_STORE>3.  r
c300: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
c310: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c320: 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e  UTF-8 encoded En
c330: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
c340: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
c350: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
c360: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
c370: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65   char *sqlite3_e
c380: 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64  rrmsg(sqlite3 *d
c390: 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
c3a0: 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
c3b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
c3c0: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
c3d0: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20  E_NOMEM);.  }.  
c3e0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
c3f0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
c400: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
c410: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
c420: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
c430: 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PT);.  }.  sqlit
c440: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
c450: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
c460: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c470: 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  d ){.    z = sql
c480: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
c490: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73  E_NOMEM);.  }els
c4a0: 65 7b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  e{.    z = (char
c4b0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
c4c0: 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a  text(db->pErr);.
c4d0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
c4e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
c4f0: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
c500: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
c510: 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
c520: 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Code);.    }.  }
c530: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c540: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
c550: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
c560: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c570: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
c580: 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20  * Return UTF-16 
c590: 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
c5a0: 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
c5b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
c5c0: 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
c5d0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
c5e0: 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  *sqlite3_errmsg1
c5f0: 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  6(sqlite3 *db){.
c600: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
c610: 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20  16 outOfMem[] = 
c620: 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20  {.    'o', 'u', 
c630: 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27  't', ' ', 'o', '
c640: 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65  f', ' ', 'm', 'e
c650: 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27  ', 'm', 'o', 'r'
c660: 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20  , 'y', 0.  };.  
c670: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
c680: 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20   misuse[] = {.  
c690: 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c    'l', 'i', 'b',
c6a0: 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20   'r', 'a', 'r', 
c6b0: 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'y', ' ', .    '
c6c0: 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74  r', 'o', 'u', 't
c6d0: 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27  ', 'i', 'n', 'e'
c6e0: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c  , ' ', .    'c',
c6f0: 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20   'a', 'l', 'l', 
c700: 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a  'e', 'd', ' ', .
c710: 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
c720: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
c730: 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'f', ' ', .   
c740: 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20   's', 'e', 'q', 
c750: 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27  'u', 'e', 'n', '
c760: 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a  c', 'e', 0.  };.
c770: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
c780: 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ;.  if( !db ){. 
c790: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
c7a0: 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a  *)outOfMem;.  }.
c7b0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
c7c0: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
c7d0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
c7e0: 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75  urn (void *)misu
c7f0: 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  se;.  }.  sqlite
c800: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
c810: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
c820: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c830: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69   ){.    z = (voi
c840: 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
c850: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
c860: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
c870: 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  t16(db->pErr);. 
c880: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
c890: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
c8a0: 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
c8b0: 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72  , -1, sqlite3Err
c8c0: 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
c8d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,.           SQL
c8e0: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
c8f0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
c900: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
c910: 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
c920: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  r);.    }.    /*
c930: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
c940: 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
c950: 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
c960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
c970: 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  t16().    ** abo
c980: 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ve. If this is t
c990: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
c9a0: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
c9b0: 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f  ed flag needs to
c9c0: 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72  .    ** be clear
c9d0: 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
c9e0: 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72  ing. Do this dir
c9f0: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
ca00: 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c  f via.    ** sql
ca10: 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74  ite3ApiExit(), t
ca20: 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20  o avoid setting 
ca30: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
ca40: 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  dle error messag
ca50: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62  e..    */.    db
ca60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
ca70: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
ca80: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
ca90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
caa0: 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
cab0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
cac0: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
cad0: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
cae0: 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
caf0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
cb00: 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20  SQLite routine. 
cb10: 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61  If NULL is.** pa
cb20: 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
cb30: 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65  ction, we assume
cb40: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
cb50: 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  ed during sqlite
cb60: 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  3_open()..*/.int
cb70: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
cb80: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
cb90: 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
cba0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
cbb0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
cbc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cbd0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
cbe0: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
cbf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
cc00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
cc10: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
cc20: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
cc30: 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
cc40: 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  k;.}.int sqlite3
cc50: 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
cc60: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
cc70: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
cc80: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
cc90: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
cca0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ccb0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
ccc0: 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
ccd0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cce0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
ccf0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
cd00: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
cd10: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Code;.}../*.** C
cd20: 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c  reate a new coll
cd30: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66  ating function f
cd40: 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22  or database "db"
cd50: 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a  .  The name is z
cd60: 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Name.** and the 
cd70: 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e  encoding is enc.
cd80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
cd90: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a  reateCollation(.
cda0: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20    sqlite3* db,. 
cdb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
cdc0: 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20  me, .  u8 enc,. 
cdd0: 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
cde0: 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
cdf0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
ce00: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
ce10: 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
ce20: 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
ce30: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
ce40: 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e    int enc2;.  in
ce50: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
ce60: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ce70: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
ce80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ce90: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
cea0: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
ceb0: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
cec0: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
ced0: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
cee0: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
cef0: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
cf00: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
cf10: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
cf20: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
cf30: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
cf40: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
cf50: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
cf60: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63  ally..  */.  enc
cf70: 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63  2 = enc;.  testc
cf80: 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
cf90: 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73  E_UTF16 );.  tes
cfa0: 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
cfb0: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
cfc0: 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  D );.  if( enc2=
cfd0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c  =SQLITE_UTF16 ||
cfe0: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
cff0: 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20  F16_ALIGNED ){. 
d000: 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45     enc2 = SQLITE
d010: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
d020: 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c  }.  if( enc2<SQL
d030: 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32  ITE_UTF8 || enc2
d040: 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  >SQLITE_UTF16BE 
d050: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d060: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
d070: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
d080: 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
d090: 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
d0a0: 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
d0b0: 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
d0c0: 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
d0d0: 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
d0e0: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
d0f0: 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
d100: 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
d110: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
d120: 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
d130: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
d140: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
d150: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
d160: 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
d170: 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  nc2, zName, 0);.
d180: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
d190: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
d1a0: 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65    if( db->active
d1b0: 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20  VdbeCnt ){.     
d1c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
d1d0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
d1e0: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
d1f0: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
d200: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d210: 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76  nce due to activ
d220: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
d230: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d240: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
d250: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
d260: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
d270: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nts(db);..    /*
d280: 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
d290: 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
d2a0: 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
d2b0: 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
d2c0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
d2d0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
d2e0: 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
d2f0: 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
d300: 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
d310: 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
d320: 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
d330: 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
d340: 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
d350: 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
d360: 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
d370: 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
d380: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
d390: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
d3a0: 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
d3b0: 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
d3c0: 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
d3d0: 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
d3e0: 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
d3f0: 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
d400: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
d410: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
d420: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
d430: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
d440: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
d450: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
d460: 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
d470: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
d480: 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
d490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
d4a0: 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
d4b0: 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
d4c0: 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
d4d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d4e0: 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
d4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d500: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
d510: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
d520: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
d530: 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
d540: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
d550: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d560: 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  NOMEM;.  pColl->
d570: 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
d580: 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
d590: 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d  = pCtx;.  pColl-
d5a0: 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
d5b0: 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38  pColl->enc = (u8
d5c0: 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  )(enc2 | (enc & 
d5d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
d5e0: 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65  GNED));.  sqlite
d5f0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
d600: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75  E_OK, 0);.  retu
d610: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d620: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
d630: 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
d640: 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
d650: 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
d660: 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
d670: 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
d680: 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
d690: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
d6a0: 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
d6b0: 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
d6c0: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
d6d0: 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
d6e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
d6f0: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
d700: 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
d710: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
d720: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
d730: 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
d740: 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
d750: 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
d760: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
d770: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
d780: 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
d790: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
d7a0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
d7b0: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
d7c0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
d7d0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a  ARIABLE_NUMBER,.
d7e0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49    SQLITE_MAX_TRI
d7f0: 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a  GGER_DEPTH,.};..
d800: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
d810: 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
d820: 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
d830: 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
d840: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
d850: 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
d860: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
d870: 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
d880: 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
d890: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
d8a0: 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
d8b0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
d8c0: 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
d8d0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
d8e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
d8f0: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
d900: 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
d910: 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
d920: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
d930: 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
d940: 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
d950: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
d960: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
d970: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
d980: 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
d990: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
d9a0: 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
d9b0: 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
d9c0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d9d0: 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
d9e0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
d9f0: 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
da00: 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
da10: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
da20: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
da30: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
da40: 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a  NCTION_ARG>1000.
da50: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
da60: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
da70: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
da80: 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69  0 and 1000.#endi
da90: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
daa0: 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
dab0: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
dac0: 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51  ED>62.# error SQ
dad0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
dae0: 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
daf0: 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69  n 0 and 62.#endi
db00: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
db10: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
db20: 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  NGTH<1.# error S
db30: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
db40: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75  ATTERN_LENGTH mu
db50: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
db60: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
db70: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32  TE_MAX_COLUMN>32
db80: 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  767.# error SQLI
db90: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75  TE_MAX_COLUMN mu
dba0: 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32  st not exceed 32
dbb0: 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  767.#endif.#if S
dbc0: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
dbd0: 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f  R_DEPTH<1.# erro
dbe0: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  r SQLITE_MAX_TRI
dbf0: 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20  GGER_DEPTH must 
dc00: 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
dc10: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
dc20: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
dc30: 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72   a limit.  Repor
dc40: 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e  t the old value.
dc50: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69  .** If an invali
dc60: 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73  d limit index is
dc70: 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72   supplied, repor
dc80: 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  t -1..** Make no
dc90: 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69   changes but sti
dca0: 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c  ll report the ol
dcb0: 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a  d value if the.*
dcc0: 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e  * new limit is n
dcd0: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41  egative..**.** A
dce0: 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74   new lower limit
dcf0: 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b   does not shrink
dd00: 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72   existing constr
dd10: 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65  ucts..** It mere
dd20: 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20  ly prevents new 
dd30: 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20  constructs that 
dd40: 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74  exceed the limit
dd50: 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67  .** from forming
dd60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dd70: 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  _limit(sqlite3 *
dd80: 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c  db, int limitId,
dd90: 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a   int newLimit){.
dda0: 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a    int oldLimit;.
ddb0: 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
ddc0: 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
ddd0: 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
dde0: 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
ddf0: 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
de00: 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
de10: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
de20: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
de30: 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
de40: 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
de50: 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
de60: 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
de70: 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
de80: 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
de90: 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
dea0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
deb0: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
dec0: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
ded0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
dee0: 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
def0: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
df00: 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
df10: 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
df20: 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
df30: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
df40: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
df50: 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
df60: 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
df70: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
df80: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
df90: 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
dfa0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
dfb0: 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
dfc0: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
dfd0: 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
dfe0: 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
dff0: 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
e000: 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
e010: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e020: 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
e030: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
e040: 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
e050: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
e060: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
e070: 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
e080: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
e090: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
e0a0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
e0b0: 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
e0c0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
e0d0: 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
e0e0: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
e0f0: 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
e100: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
e110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
e150: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
e160: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
e170: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
e180: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
e190: 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
e1a0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
e1b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
e1c0: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
e1d0: 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
e1e0: 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
e1f0: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
e200: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
e210: 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
e220: 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e  DEPTH==(SQLITE_N
e230: 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
e240: 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
e250: 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
e260: 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
e270: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
e280: 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
e290: 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
e2a0: 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
e2b0: 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
e2c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
e2d0: 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
e2e0: 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
e2f0: 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
e300: 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
e310: 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
e320: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
e330: 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
e340: 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
e350: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
e360: 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
e370: 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
e380: 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e3a0: 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
e3b0: 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
e3c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
e3d0: 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
e3e0: 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
e3f0: 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
e400: 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
e410: 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
e420: 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
e430: 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
e440: 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
e450: 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
e460: 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
e470: 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
e480: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
e490: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
e4a0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
e4b0: 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
e4c0: 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
e4d0: 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
e4e0: 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
e4f0: 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
e500: 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
e510: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
e520: 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
e530: 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
e540: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
e550: 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
e560: 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
e570: 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
e580: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
e590: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
e5a0: 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
e5b0: 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
e5c0: 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
e5d0: 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
e5e0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
e5f0: 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
e600: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
e610: 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
e620: 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
e630: 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
e640: 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
e650: 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
e660: 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
e670: 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
e680: 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
e690: 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
e6a0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
e6b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
e6c0: 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
e6d0: 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
e6e0: 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
e6f0: 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
e700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e710: 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
e720: 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
e730: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
e740: 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
e750: 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
e760: 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
e770: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
e780: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
e790: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
e7a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
e7b0: 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
e7c0: 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
e7d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
e7e0: 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
e7f0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
e800: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
e810: 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
e820: 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
e830: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
e840: 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
e850: 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
e860: 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
e870: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
e880: 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
e890: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
e8a0: 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
e8b0: 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
e8c0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
e8d0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
e8e0: 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
e8f0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
e900: 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
e910: 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
e920: 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
e930: 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
e940: 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e960: 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
e970: 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
e980: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
e990: 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
e9a0: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
e9b0: 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
e9c0: 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
e9d0: 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
e9e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
e9f0: 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
ea00: 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
ea30: 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
ea40: 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
ea50: 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
ea60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
ea70: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
ea80: 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
ea90: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
eaa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
eab0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
eac0: 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
ead0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
eae0: 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
eaf0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
eb00: 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
eb10: 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
eb20: 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
eb30: 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
eb40: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
eb50: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
eb60: 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69  PEN_URI) || sqli
eb70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
eb80: 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26  bOpenUri) .   &&
eb90: 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63   nUri>=5 && memc
eba0: 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22  mp(zUri, "file:"
ebb0: 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  , 5)==0 .  ){.  
ebc0: 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
ebd0: 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
ec00: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
ec10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
ec40: 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
ec50: 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
ec60: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ec70: 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
ec80: 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
ec90: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
eca0: 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
ecb0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
ecc0: 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
ecd0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
ece0: 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
ecf0: 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
ed00: 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
ed10: 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
ed20: 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
ed30: 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
ed40: 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
ed50: 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
ed60: 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
ed70: 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
ed80: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
ed90: 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
eda0: 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
edb0: 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
edc0: 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
edd0: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
ede0: 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
edf0: 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
ee00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ee10: 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73  MEM;..    /* Dis
ee20: 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
ee30: 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
ee40: 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
ee50: 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
ee60: 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
ee70: 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
ee80: 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
ee90: 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
eea0: 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
eeb0: 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 0a  !='/' ) iIn++;..
eec0: 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37        if( iIn!=7
eed0: 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20   && (iIn!=16 || 
eee0: 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73  memcmp("localhos
eef0: 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29  t", &zUri[7], 9)
ef00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  ) ){.        *pz
ef10: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
ef20: 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
ef30: 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a  d uri authority:
ef40: 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20   %.*s", .       
ef50: 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72       iIn-7, &zUr
ef60: 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  i[7]);.        r
ef70: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
ef80: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
ef90: 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
efa0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
efb0: 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a  .      iIn = 5;.
efc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
efd0: 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  py the filename 
efe0: 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61  and any query pa
eff0: 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68  rameters into th
f000: 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20  e zFile buffer. 
f010: 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25  .    ** Decode %
f020: 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20  HH escape codes 
f030: 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a  along the way. .
f040: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69      **.    ** Wi
f050: 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20  thin this loop, 
f060: 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20  variable eState 
f070: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c  may be set to 0,
f080: 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69   1 or 2, dependi
f090: 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ng.    ** on the
f0a0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
f0b0: 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  . As follows:.  
f0c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a    **.    **   0:
f0d0: 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61   Parsing file-na
f0e0: 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20  me..    **   1: 
f0f0: 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63  Parsing name sec
f100: 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
f110: 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
f120: 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32  eter..    **   2
f130: 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20  : Parsing value 
f140: 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
f150: 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
f160: 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a  rameter..    */.
f170: 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a      eState = 0;.
f180: 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
f190: 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
f1a0: 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20   c!='#' ){.     
f1b0: 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
f1c0: 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20  ( c=='%' .      
f1d0: 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
f1e0: 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a  git(zUri[iIn]) .
f1f0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
f200: 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
f210: 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b  In+1]) .      ){
f220: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74  .        int oct
f230: 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78  et = (sqlite3Hex
f240: 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
f250: 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20  ]) << 4);.      
f260: 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74    octet += sqlit
f270: 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
f280: 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20  iIn++]);..      
f290: 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e    assert( octet>
f2a0: 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20  =0 && octet<256 
f2b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  );.        if( o
f2c0: 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ctet==0 ){.     
f2d0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
f2e0: 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
f2f0: 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20  n "%00" appears 
f300: 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20  within the URI. 
f310: 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  In this.        
f320: 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e    ** case we ign
f330: 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20  ore all text in 
f340: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
f350: 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20   the path, name 
f360: 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
f370: 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
f380: 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f  being parsed. So
f390: 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72   ignore the curr
f3a0: 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20  ent character.  
f3b0: 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73          ** and s
f3c0: 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  kip to the next 
f3d0: 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c  "?", "=" or "&",
f3e0: 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
f3f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
f400: 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
f410: 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
f420: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
f430: 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c   && (eState!=0 |
f440: 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20  | c!='?').      
f450: 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
f460: 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27  te!=1 || (c!='='
f470: 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20   && c!='&')).   
f480: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
f490: 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27  State!=2 || c!='
f4a0: 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  &').          ){
f4b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
f4c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
f4d0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
f4e0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
f4f0: 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b        c = octet;
f500: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f510: 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63   eState==1 && (c
f520: 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29  =='&' || c=='=')
f530: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f540: 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30  zFile[iOut-1]==0
f550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
f560: 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e   An empty option
f570: 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68   name. Ignore th
f580: 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65  is option altoge
f590: 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ther. */.       
f5a0: 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
f5b0: 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
f5c0: 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49  !='#' && zUri[iI
f5d0: 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b  n-1]!='&' ) iIn+
f5e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
f5f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
f600: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
f610: 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '&' ){.         
f620: 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
f630: 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\0';.        }
f640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f650: 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
f660: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
f670: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
f680: 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20   if( (eState==0 
f690: 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65  && c=='?') || (e
f6a0: 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27  State==2 && c=='
f6b0: 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  &') ){.        c
f6c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53   = 0;.        eS
f6d0: 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
f6e0: 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f  }.      zFile[iO
f6f0: 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d  ut++] = c;.    }
f700: 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d  .    if( eState=
f710: 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  =1 ) zFile[iOut+
f720: 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
f730: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
f740: 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
f750: 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a  Out++] = '\0';..
f760: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
f770: 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f  there were any o
f780: 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64  ptions specified
f790: 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
f7a0: 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20  interpreted .   
f7b0: 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e   ** here. Option
f7c0: 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72  s that are inter
f7d0: 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c  preted here incl
f7e0: 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68  ude "vfs" and th
f7f0: 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ose that.    ** 
f800: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c  correspond to fl
f810: 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ags that may be 
f820: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71  passed to the sq
f830: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a  lite3_open_v2().
f840: 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a      ** method. *
f850: 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46  /.    zOpt = &zF
f860: 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ile[sqlite3Strle
f870: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20  n30(zFile)+1];. 
f880: 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30     while( zOpt[0
f890: 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ] ){.      int n
f8a0: 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Opt = sqlite3Str
f8b0: 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20  len30(zOpt);.   
f8c0: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20     char *zVal = 
f8d0: 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20  &zOpt[nOpt+1];. 
f8e0: 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20       int nVal = 
f8f0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f900: 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66  zVal);..      if
f910: 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d  ( nOpt==3 && mem
f920: 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c  cmp("vfs", zOpt,
f930: 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
f940: 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20    zVfs = zVal;. 
f950: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f960: 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d      struct OpenM
f970: 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ode {.          
f980: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
f990: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
f9a0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d  e;.        } *aM
f9b0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f9c0: 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65   char *zModeType
f9d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
f9e0: 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  t mask = 0;.    
f9f0: 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
fa00: 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  0;..        if( 
fa10: 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d  nOpt==5 && memcm
fa20: 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c  p("cache", zOpt,
fa30: 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   5)==0 ){.      
fa40: 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
fa50: 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68  t OpenMode aCach
fa60: 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eMode[] = {.    
fa70: 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65          { "share
fa80: 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  d",  SQLITE_OPEN
fa90: 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a  _SHAREDCACHE },.
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70              { "p
fab0: 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  rivate", SQLITE_
fac0: 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
fad0: 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
fae0: 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
faf0: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
fb00: 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
fb10: 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
fb20: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  |SQLITE_OPEN_PRI
fb30: 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20  VATECACHE;.     
fb40: 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61       aMode = aCa
fb50: 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  cheMode;.       
fb60: 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b     limit = mask;
fb70: 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
fb80: 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a  Type = "cache";.
fb90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fba0: 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26    if( nOpt==4 &&
fbb0: 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20   memcmp("mode", 
fbc0: 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  zOpt, 4)==0 ){. 
fbd0: 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
fbe0: 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
fbf0: 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  aOpenMode[] = {.
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
fc10: 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  o",  SQLITE_OPEN
fc20: 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20  _READONLY },.   
fc30: 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c           { "rw",
fc40: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
fc50: 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20  ADWRITE }, .    
fc60: 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c          { "rwc",
fc70: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fc80: 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
fc90: 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
fca0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65             { "me
fcb0: 6d 6f 72 79 22 2c 0a 20 20 20 20 20 20 20 20 20  mory",.         
fcc0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
fcd0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
fce0: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
fcf0: 52 45 41 54 45 20 0a 20 20 20 20 20 20 20 20 20  REATE .         
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
fd10: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
fd20: 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  RY },.          
fd30: 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
fd40: 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
fd50: 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
fd60: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c  _OPEN_READONLY |
fd70: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fd80: 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20  DWRITE.         
fd90: 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
fda0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
fdb0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
fdc0: 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ORY;.          a
fdd0: 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65  Mode = aOpenMode
fde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69  ;.          limi
fdf0: 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73  t = mask & flags
fe00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
fe10: 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73 22  eType = "access"
fe20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
fe30: 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29       if( aMode )
fe40: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
fe50: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  i;.          int
fe60: 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20   mode = 0;.     
fe70: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d       for(i=0; aM
fe80: 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a  ode[i].z; i++){.
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
fea0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64  t char *z = aMod
feb0: 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20  e[i].z;.        
fec0: 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71      if( nVal==sq
fed0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
fee0: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56   && 0==memcmp(zV
fef0: 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a  al, z, nVal) ){.
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f                mo
ff10: 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f  de = aMode[i].mo
ff20: 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  de;.            
ff30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ff40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ff50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
ff60: 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20   mode==0 ){.    
ff70: 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
ff80: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
ff90: 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20  ntf("no such %s 
ffa0: 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65  mode: %s", zMode
ffb0: 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
ffc0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
ffd0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ffe0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
fff0: 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
10000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10010 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53    if( (mode & ~S
10020 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
10030 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  Y)>limit ){.    
10040 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
10050 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
10060 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74  ntf("%s mode not
10070 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20   allowed: %s",. 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
100b0 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
100c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
100d0 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20  _PERM;.         
100e0 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
100f0 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
10100 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61   }.          fla
10110 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d  gs = (flags & ~m
10120 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20  ask) | mode;.   
10130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
10140 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56        zOpt = &zV
10150 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20  al[nVal+1];.    
10160 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
10170 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
10180 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a  malloc(nUri+2);.
10190 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
101a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
101b0 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  OMEM;.    memcpy
101c0 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55  (zFile, zUri, nU
101d0 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e  ri);.    zFile[n
101e0 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  Uri] = '\0';.   
101f0 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d   zFile[nUri+1] =
10200 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73   '\0';.    flags
10210 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
10220 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  _URI;.  }..  *pp
10230 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
10240 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20  s_find(zVfs);.  
10250 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b  if( *ppVfs==0 ){
10260 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
10270 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10280 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25  ("no such vfs: %
10290 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72  s", zVfs);.    r
102a0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
102b0 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69  ;.  }. parse_uri
102c0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
102d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
102e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
102f0 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  ile);.    zFile 
10300 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61  = 0;.  }.  *pFla
10310 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70  gs = flags;.  *p
10320 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20  zFile = zFile;. 
10330 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10340 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10350 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  ne does the work
10360 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61   of opening a da
10370 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66  tabase on behalf
10380 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   of.** sqlite3_o
10390 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65  pen() and sqlite
103a0 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20  3_open16(). The 
103b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
103c0 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a  e "zFilename"  .
103d0 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f  ** is UTF-8 enco
103e0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
103f0 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  nt openDatabase(
10400 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10410 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74  Filename, /* Dat
10420 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55  abase filename U
10430 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a  TF-8 encoded */.
10440 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
10450 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  ,        /* OUT:
10460 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61   Returned databa
10470 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75  se handle */.  u
10480 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
10490 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69  s,    /* Operati
104a0 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20  onal flags */.  
104b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
104c0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
104d0 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
104e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
104f0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
10500 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
10510 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64  e allocated hand
10520 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
10530 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10550 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10560 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66   int isThreadsaf
10570 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10580 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72   /* True for thr
10590 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69  eadsafe connecti
105a0 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
105b0 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Open = 0;       
105c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
105d0 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  name argument to
105e0 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70   pass to BtreeOp
105f0 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  en() */.  char *
10600 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
10610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
10620 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
10630 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
10640 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62 20 3d 20  ) */..  *ppDb = 
10650 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
10660 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
10670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
10680 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
10690 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
106a0 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  c;.#endif..  /* 
106b0 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69  Only allow sensi
106c0 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
106d0 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
106e0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20  flags argument. 
106f0 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20   .  ** Throw an 
10700 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e  error if any non
10710 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69  -sense combinati
10720 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  on is used.  If 
10730 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62  we.  ** do not b
10740 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d  lock illegal com
10750 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20  binations here, 
10760 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72  it could trigger
10770 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73  .  ** assert() s
10780 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65  tatements in dee
10790 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e  per layers.  Sen
107a0 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
107b0 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a  ns.  ** are:.  *
107c0 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49  *.  **  1:  SQLI
107d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
107e0 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54  .  **  2:  SQLIT
107f0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
10800 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54  .  **  6:  SQLIT
10810 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
10820 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
10830 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73  REATE.  */.  ass
10840 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
10850 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78  _READONLY  == 0x
10860 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  01 );.  assert( 
10870 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10880 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b  WRITE == 0x02 );
10890 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
108a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20  E_OPEN_CREATE   
108b0 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65   == 0x04 );.  te
108c0 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
108d0 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20  gs&7))==0x02 ); 
108e0 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20  /* READONLY */. 
108f0 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
10900 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20  flags&7))==0x04 
10910 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
10920 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
10930 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
10940 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x40 ); /* READWR
10950 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a  ITE | CREATE */.
10960 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67    if( ((1<<(flag
10970 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30  s&7)) & 0x46)==0
10980 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10990 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20  _MISUSE_BKPT;.. 
109a0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
109b0 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
109c0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
109d0 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
109e0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
109f0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
10a00 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
10a10 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
10a20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
10a30 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
10a40 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
10a50 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
10a60 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
10a70 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
10a80 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
10a90 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
10aa0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
10ab0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  & SQLITE_OPEN_PR
10ac0 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20  IVATECACHE ){.  
10ad0 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
10ae0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
10af0 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CHE;.  }else if(
10b00 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
10b10 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
10b20 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66  Enabled ){.    f
10b30 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
10b40 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
10b50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
10b60 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66  e harmful bits f
10b70 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61  rom the flags pa
10b80 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a  rameter.  **.  *
10b90 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  * The SQLITE_OPE
10ba0 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51  N_NOMUTEX and SQ
10bb0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
10bc0 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20  TEX flags were. 
10bd0 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69   ** dealt with i
10be0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
10bf0 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69  ode block.  Besi
10c00 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f  des these, the o
10c10 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69  nly.  ** valid i
10c20 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73  nput flags for s
10c30 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
10c40 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   are SQLITE_OPEN
10c50 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20  _READONLY,.  ** 
10c60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10c70 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  WRITE, SQLITE_OP
10c80 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54  EN_CREATE, SQLIT
10c90 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
10ca0 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  HE,.  ** SQLITE_
10cb0 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
10cc0 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65  E, and some rese
10cd0 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65  rved bits.  Sile
10ce0 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
10cf0 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
10d00 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
10d10 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
10d20 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
10d30 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
10d40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
10d50 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
10d60 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10d70 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10d90 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
10da0 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
10db0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10dc0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
10dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10de0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
10df0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
10e00 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10e10 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
10e20 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
10e30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
10e40 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10e60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
10e70 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
10e80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10e90 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
10ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10eb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
10ec0 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
10ed0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
10ee0 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
10ef0 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
10f00 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
10f10 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
10f20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
10f30 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
10f40 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
10f50 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
10f60 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
10f70 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
10f80 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74  e ){.    db->mut
10f90 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
10fa0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
10fb0 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
10fc0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65      if( db->mute
10fd0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x==0 ){.      sq
10fe0 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
10ff0 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20        db = 0;.  
11000 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
11010 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
11020 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11030 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11040 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
11050 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62   0xff;.  db->nDb
11060 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69   = 2;.  db->magi
11070 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
11080 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62  _BUSY;.  db->aDb
11090 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
110a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ;..  assert( siz
110b0 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d  eof(db->aLimit)=
110c0 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d  =sizeof(aHardLim
110d0 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  it) );.  memcpy(
110e0 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72  db->aLimit, aHar
110f0 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64  dLimit, sizeof(d
11100 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64  b->aLimit));.  d
11110 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
11120 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74  1;.  db->nextAut
11130 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d  ovac = -1;.  db-
11140 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
11150 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  0;.  db->flags |
11160 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
11170 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
11180 41 75 74 6f 49 6e 64 65 78 20 7c 20 53 51 4c 49  AutoIndex | SQLI
11190 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
111a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
111b0 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c  ULT_FILE_FORMAT<
111c0 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4.              
111d0 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61     | SQLITE_Lega
111e0 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66  cyFileFmt.#endif
111f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11200 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
11210 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  SION.           
11220 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
11230 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e  oadExtension.#en
11240 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  dif.#if SQLITE_D
11250 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45  EFAULT_RECURSIVE
11260 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20  _TRIGGERS.      
11270 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
11280 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a  ITE_RecTriggers.
11290 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
112a0 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
112b0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20  T_FOREIGN_KEYS) 
112c0 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  && SQLITE_DEFAUL
112d0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20  T_FOREIGN_KEYS. 
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  | SQLITE_Foreign
11300 4b 65 79 73 0a 23 65 6e 64 69 66 0a 20 20 20 20  Keys.#endif.    
11310 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73    ;.  sqlite3Has
11320 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  hInit(&db->aColl
11330 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
11340 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11350 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
11360 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d  HashInit(&db->aM
11370 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
11380 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66    /* Add the def
11390 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
113a0 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20  equence BINARY. 
113b0 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72  BINARY works for
113c0 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a   both UTF-8.  **
113d0 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20   and UTF-16, so 
113e0 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f  add a version fo
113f0 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20  r each to avoid 
11400 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a  any unnecessary.
11410 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
11420 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72  . The only error
11430 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20   that can occur 
11440 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63  here is a malloc
11450 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f  () failure..  */
11460 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
11470 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
11480 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
11490 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
114a0 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
114b0 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
114c0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
114d0 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
114e0 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
114f0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
11500 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
11510 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16LE, 0, binColl
11520 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
11530 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
11540 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f  "RTRIM", SQLITE_
11550 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20  UTF8, (void*)1, 
11560 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
11570 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11580 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
11590 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
115a0 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43    }.  db->pDfltC
115b0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
115c0 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c  dCollSeq(db, SQL
115d0 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52  ITE_UTF8, "BINAR
115e0 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  Y", 0);.  assert
115f0 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21  ( db->pDfltColl!
11600 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  =0 );..  /* Also
11610 20 61 64 64 20 61 20 55 54 46 2d 38 20 63 61 73   add a UTF-8 cas
11620 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f  e-insensitive co
11630 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
11640 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c  . */.  createCol
11650 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41  lation(db, "NOCA
11660 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  SE", SQLITE_UTF8
11670 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61  , 0, nocaseColla
11680 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20  tingFunc, 0);.. 
11690 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69   /* Parse the fi
116a0 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d  lename/URI argum
116b0 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  ent. */.  db->op
116c0 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
116d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
116e0 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46  arseUri(zVfs, zF
116f0 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c  ilename, &flags,
11700 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70   &db->pVfs, &zOp
11710 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  en, &zErrMsg);. 
11720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11730 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
11740 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11750 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11760 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d = 1;.    sqlit
11770 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
11780 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
11790 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20   0, zErrMsg);.  
117a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
117b0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74  ErrMsg);.    got
117c0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
117d0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
117e0 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73   backend databas
117f0 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63  e driver */.  rc
11800 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
11810 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f  pen(db->pVfs, zO
11820 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44  pen, db, &db->aD
11830 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20  b[0].pBt, 0,.   
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c       flags | SQL
11860 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
11870 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
11890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
118a0 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  RR_NOMEM ){.    
118b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
118c0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  MEM;.    }.    s
118d0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
118e0 72 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  rc, 0);.    goto
118f0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
11900 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53  .  db->aDb[0].pS
11910 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
11920 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d  chemaGet(db, db-
11930 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
11940 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
11950 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
11960 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a  maGet(db, 0);...
11970 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
11980 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
11990 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
119a0 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66  ase is 'full'; f
119b0 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a  or the temp.  **
119c0 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20   database it is 
119d0 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74  'NONE'. This mat
119e0 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c  ches the pager l
119f0 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20  ayer defaults.  
11a00 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b  .  */.  db->aDb[
11a10 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  0].zName = "main
11a20 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ";.  db->aDb[0].
11a30 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33  safety_level = 3
11a40 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  ;.  db->aDb[1].z
11a50 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
11a60 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
11a70 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20  ty_level = 1;.. 
11a80 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
11a90 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
11aa0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11ab0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
11ac0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
11ad0 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
11ae0 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66  r all built-in f
11af0 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f  unctions, but do
11b00 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
11b10 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61  read the.  ** da
11b20 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65  tabase schema ye
11b30 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79  t. This is delay
11b40 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ed until the fir
11b50 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  st time the data
11b60 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63  base.  ** is acc
11b70 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  essed..  */.  sq
11b80 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
11b90 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
11ba0 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
11bb0 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
11bc0 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  db);..  /* Load 
11bd0 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73  automatic extens
11be0 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e  ions - extension
11bf0 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
11c00 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a   registered.  **
11c10 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
11c20 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74  e3_automatic_ext
11c30 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20  ension() API..  
11c40 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
11c50 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
11c60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11c70 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
11c80 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69  3AutoLoadExtensi
11c90 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20  ons(db);.    rc 
11ca0 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
11cb0 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  e(db);.    if( r
11cc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11cd0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
11ce0 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
11cf0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11d00 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66  ENABLE_FTS1.  if
11d10 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
11d20 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72  led ){.    exter
11d30 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
11d40 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  1Init(sqlite3*);
11d50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11d60 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts1Init(db);. 
11d70 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
11d80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11d90 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS2.  if( !db->
11da0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
11db0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11dc0 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
11dd0 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
11de0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
11df0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49  c = sqlite3Fts2I
11e00 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
11e10 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
11e20 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20  TE_ENABLE_FTS3. 
11e30 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
11e40 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
11e50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
11e60 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
11e70 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
11e80 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
11e90 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20  TE_ENABLE_ICU.  
11ea0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
11eb0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
11ec0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
11ed0 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69   = sqlite3IcuIni
11ee0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
11ef0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
11f00 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20  _ENABLE_RTREE.  
11f10 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
11f20 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
11f30 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
11f40 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  = sqlite3RtreeIn
11f50 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
11f60 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72  if..  sqlite3Err
11f70 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a  or(db, rc, 0);..
11f80 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
11f90 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
11fa0 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
11fb0 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
11fc0 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
11fd0 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
11fe0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
11ff0 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
12000 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
12010 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
12020 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
12030 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
12040 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
12050 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
12060 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
12070 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
12080 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
12090 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
120a0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
120b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
120c0 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
120d0 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
120e0 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12100 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
12110 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
12120 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  E);.#endif..  /*
12130 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b   Enable the look
12140 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62  aside-malloc sub
12150 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75  system */.  setu
12160 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30  pLookaside(db, 0
12170 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  , sqlite3GlobalC
12180 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
12190 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
121a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
121b0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
121c0 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73  Lookaside);..  s
121d0 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
121e0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51  heckpoint(db, SQ
121f0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
12200 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29  _AUTOCHECKPOINT)
12210 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20  ;..opendb_out:. 
12220 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
12230 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29  pen);.  if( db )
12240 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
12250 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73  ->mutex!=0 || is
12260 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c  Threadsafe==0 ||
12270 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12280 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d  nfig.bFullMutex=
12290 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
122a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
122b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
122c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
122d0 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65  code(db);.  asse
122e0 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d  rt( db!=0 || rc=
122f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
12300 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
12310 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
12320 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
12330 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20  ;.    db = 0;.  
12340 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
12350 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
12360 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
12370 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20  E_MAGIC_SICK;.  
12380 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a  }.  *ppDb = db;.
12390 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
123a0 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
123b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
123c0 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
123d0 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
123e0 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
123f0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
12400 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
12410 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
12420 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
12430 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
12460 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
12470 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
12480 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
12490 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
124a0 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
124b0 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
124c0 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
124d0 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
124e0 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
124f0 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
12500 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
12510 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
12520 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
12530 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12540 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
12550 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
12560 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
12570 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
12580 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
12590 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
125a0 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
125b0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
125c0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
125d0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
125e0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
125f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
12600 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
12610 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
12620 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
12630 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
12640 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
12650 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
12660 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
12670 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
12680 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
12690 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
126a0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
126b0 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   zFilename );.  
126c0 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a  assert( ppDb );.
126d0 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
126e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
126f0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
12700 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
12710 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
12720 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
12730 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  dif.  pVal = sql
12740 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
12750 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
12760 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
12770 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
12780 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
12790 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
127a0 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
127b0 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
127c0 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
127d0 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
127e0 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
127f0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
12800 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
12810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12820 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
12830 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
12840 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
12850 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
12860 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
12870 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
12880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12890 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
128a0 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
128b0 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
128c0 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70   ){.      ENC(*p
128d0 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
128e0 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
128f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
12900 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12910 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
12920 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
12930 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12940 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
12950 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12960 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
12970 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
12980 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
12990 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
129a0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
129b0 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
129c0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
129d0 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
129e0 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
129f0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
12a00 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
12a10 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
12a20 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
12a30 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
12a40 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
12a50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
12a60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12a70 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
12a80 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
12a90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
12aa0 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
12ab0 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
12ac0 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
12ad0 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72  Compare, 0);.  r
12ae0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
12af0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
12b00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12b10 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
12b20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12b30 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
12b40 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
12b50 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
12b60 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
12b70 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
12b80 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
12b90 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
12ba0 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
12bb0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
12bc0 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
12bd0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
12be0 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
12bf0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
12c00 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
12c10 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
12c20 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
12c30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
12c40 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
12c50 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
12c60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12c70 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
12c80 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
12c90 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
12ca0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
12cb0 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
12cc0 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
12cd0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
12ce0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
12cf0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
12d00 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
12d10 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
12d20 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
12d30 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
12d40 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
12d50 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12d60 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
12d70 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
12d80 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
12d90 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
12da0 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
12db0 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
12dc0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
12dd0 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
12de0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
12df0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
12e00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12e10 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
12e20 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65  zName8;.  sqlite
12e30 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
12e40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
12e50 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
12e60 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
12e70 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
12e80 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
12e90 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
12ea0 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e  ATIVE);.  if( zN
12eb0 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
12ec0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
12ed0 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38  (db, zName8, (u8
12ee0 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
12ef0 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
12f00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12f10 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
12f20 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
12f30 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
12f40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12f50 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
12f60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
12f70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12f80 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
12f90 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
12fa0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
12fb0 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
12fc0 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
12fd0 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
12fe0 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
12ff0 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
13000 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
13010 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
13020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
13030 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
13040 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
13050 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
13060 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
13070 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
13080 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
13090 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
130a0 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  char*).){.  sqli
130b0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
130c0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
130d0 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
130e0 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64  xCollNeeded;.  d
130f0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
13100 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c   = 0;.  db->pCol
13110 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
13120 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
13130 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13140 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
13150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13160 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
13170 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
13180 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
13190 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
131a0 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
131b0 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
131c0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
131d0 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
131e0 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
131f0 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
13200 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
13210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13220 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
13230 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  d16(.  sqlite3 *
13240 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
13250 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
13260 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
13270 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  d16)(void*,sqlit
13280 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
13290 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
132a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
132b0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
132c0 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
132d0 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
132e0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
132f0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
13300 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
13310 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
13320 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
13330 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
13340 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
13350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
13360 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
13370 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
13380 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13390 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
133a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
133b0 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
133c0 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
133d0 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
133e0 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
133f0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
13400 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
13410 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
13420 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
13430 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
13440 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
13450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13460 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
13470 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
13480 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
13490 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
134a0 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
134b0 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
134c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
134d0 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
134e0 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
134f0 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
13500 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
13510 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
13520 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
13530 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
13540 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
13550 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
13560 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  r ROLLBACK..**.*
13570 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41  ****** THIS IS A
13580 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41  N EXPERIMENTAL A
13590 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43  PI AND IS SUBJEC
135a0 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a  T TO CHANGE ****
135b0 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
135c0 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
135d0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
135e0 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
135f0 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Commit;.}../*.**
13600 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
13610 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 74  outines are subt
13620 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74  itutes for const
13630 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  ants SQLITE_CORR
13640 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  UPT,.** SQLITE_M
13650 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41  ISUSE, SQLITE_CA
13660 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49  NTOPEN, SQLITE_I
13670 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c  OERR and possibl
13680 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  y other error.**
13690 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
136a0 79 20 73 65 72 76 65 72 20 74 77 6f 20 70 75 72  y server two pur
136b0 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  poses:.**.**   1
136c0 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f  .  Serve as a co
136d0 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
136e0 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
136f0 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72  nt in a debugger
13700 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74  .**       to det
13710 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e  ect when version
13720 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
13730 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  s occurs..**.** 
13740 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c    2.  Invoke sql
13750 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72  ite3_log() to pr
13760 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65  ovide the source
13770 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77   code location w
13780 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20  here.**       a 
13790 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
137a0 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65  is first detecte
137b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
137c0 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e  3CorruptError(in
137d0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
137e0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
137f0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
13800 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
13810 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  log(SQLITE_CORRU
13820 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT,.            
13830 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72    "database corr
13840 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25  uption at line %
13850 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
13870 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
13880 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
13890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
138a0 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  RUPT;.}.int sqli
138b0 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69  te3MisuseError(i
138c0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
138d0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
138e0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
138f0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
13900 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55  _log(SQLITE_MISU
13910 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  SE, .           
13920 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69     "misuse at li
13930 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
13940 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
13950 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
13960 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
13970 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13980 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73  _MISUSE;.}.int s
13990 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72  qlite3CantopenEr
139a0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
139b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
139c0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
139d0 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
139e0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
139f0 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20  _CANTOPEN, .    
13a00 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
13a10 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c  t open file at l
13a20 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
13a30 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
13a40 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
13a50 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
13a60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13a70 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a  E_CANTOPEN;.}...
13a80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13a90 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
13aa0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
13ab0 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
13ac0 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
13ad0 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
13ae0 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
13af0 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
13b00 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
13b10 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
13b20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
13b30 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
13b40 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
13b50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
13b60 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
13b70 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
13b80 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
13b90 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
13ba0 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
13bb0 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
13bc0 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
13bd0 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
13be0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
13bf0 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
13c00 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
13c10 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
13c20 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
13c30 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
13c40 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
13c50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13c60 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
13c70 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65  ADATA.int sqlite
13c80 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
13c90 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
13ca0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
13cb0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
13cc0 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
13cd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
13ce0 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
13cf0 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
13d00 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
13d10 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
13d20 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
13d30 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
13d40 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
13d50 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
13d60 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
13d70 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
13d80 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
13d90 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
13da0 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
13db0 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
13dc0 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
13dd0 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
13de0 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
13df0 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
13e00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
13e10 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
13e20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
13e30 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
13e40 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
13e50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
13e60 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
13e70 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
13e80 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13ea0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
13eb0 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
13ec0 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
13ed0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
13ee0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
13ef0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
13f00 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
13f10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
13f20 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ;..  char const 
13f30 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
13f40 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
13f50 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
13f60 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
13f70 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
13f80 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
13f90 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e  nc = 0;..  /* En
13fa0 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
13fb0 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
13fc0 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
13fd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
13fe0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
13ff0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14000 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d  rAll(db);.  rc =
14010 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
14020 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
14030 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
14040 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
14050 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
14060 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
14070 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
14080 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
14090 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
140a0 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
140b0 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
140c0 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
140d0 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
140e0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
140f0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
14100 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
14110 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
14120 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
14130 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
14140 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  owid(zColumnName
14150 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ) ){.    iCol = 
14160 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
14170 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
14180 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
14190 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
141a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
141b0 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
141c0 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
141d0 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70  iCol++){.      p
141e0 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
141f0 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iCol];.      i
14200 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
14210 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
14220 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  , zColumnName) )
14230 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
14240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14250 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61     if( iCol==pTa
14260 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
14270 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
14280 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
14290 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
142a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
142b0 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20  lock stores the 
142c0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
142d0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
142e0 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74  turned.  ** to t
142f0 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63  he caller in loc
14300 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61  al variables zDa
14310 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71  taType, zCollSeq
14320 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61  , notnull, prima
14330 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61  rykey.  ** and a
14340 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20  utoinc. At this 
14350 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20  point there are 
14360 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65  two possibilitie
14370 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  s:.  ** .  **   
14380 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69    1. The specifi
14390 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  ed column name w
143a0 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22  as rowid", "oid"
143b0 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20   or "_rowid_" . 
143c0 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74   **        and t
143d0 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69  here is no expli
143e0 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49  citly declared I
143f0 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a  PK column. .  **
14400 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  .  **     2. The
14410 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
14420 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c  view and the col
14430 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66  umn name identif
14440 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20  ied an .  **    
14450 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64      explicitly d
14460 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20  eclared column. 
14470 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d  Copy meta inform
14480 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c  ation from *pCol
14490 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43  ..  */ .  if( pC
144a0 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54  ol ){.    zDataT
144b0 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70  ype = pCol->zTyp
144c0 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  e;.    zCollSeq 
144d0 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
144e0 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f     notnull = pCo
144f0 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20  l->notNull!=0;. 
14500 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d     primarykey  =
14510 20 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79   pCol->isPrimKey
14520 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63  !=0;.    autoinc
14530 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d   = pTab->iPKey==
14540 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74  iCol && (pTab->t
14550 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
14560 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a  oincrement)!=0;.
14570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61    }else{.    zDa
14580 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45  taType = "INTEGE
14590 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  R";.    primaryk
145a0 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  ey = 1;.  }.  if
145b0 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  ( !zCollSeq ){. 
145c0 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42     zCollSeq = "B
145d0 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72  INARY";.  }..err
145e0 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
145f0 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
14600 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65  b);..  /* Whethe
14610 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  r the function c
14620 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72  all succeeded or
14630 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65   failed, set the
14640 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
14650 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65  rs.  ** to whate
14660 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20  ver their local 
14670 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e  counterparts con
14680 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tain. If an erro
14690 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a  r did occur,.  *
146a0 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65  * this has the e
146b0 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67  ffect of zeroing
146c0 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61   all output para
146d0 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  meters..  */.  i
146e0 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20  f( pzDataType ) 
146f0 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44  *pzDataType = zD
14700 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70  ataType;.  if( p
14710 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f  zCollSeq ) *pzCo
14720 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71  llSeq = zCollSeq
14730 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c  ;.  if( pNotNull
14740 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e   ) *pNotNull = n
14750 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50  otnull;.  if( pP
14760 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72  rimaryKey ) *pPr
14770 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61  imaryKey = prima
14780 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75  rykey;.  if( pAu
14790 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e  toinc ) *pAutoin
147a0 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20  c = autoinc;..  
147b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
147c0 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  c && !pTab ){.  
147d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
147e0 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
147f0 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
14800 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
14810 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f  no such table co
14820 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54  lumn: %s.%s", zT
14830 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  ableName,.      
14840 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a    zColumnName);.
14850 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14860 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
14870 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
14880 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a  , (zErrMsg?"%s":
14890 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0), zErrMsg);.  
148a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
148b0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63  , zErrMsg);.  rc
148c0 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
148d0 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
148e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
148f0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
14900 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
14910 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  if../*.** Sleep 
14920 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
14930 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
14940 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
14950 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
14960 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d  ite3_sleep(int m
14970 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
14980 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  s *pVfs;.  int r
14990 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69  c;.  pVfs = sqli
149a0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
149b0 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29  .  if( pVfs==0 )
149c0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
149d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
149e0 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63  orks in millisec
149f0 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e  onds, but the un
14a00 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70  derlying OsSleep
14a10 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65  () .  ** API use
14a20 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  s microseconds. 
14a30 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73  Hence the 1000's
14a40 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73  ..  */.  rc = (s
14a50 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56  qlite3OsSleep(pV
14a60 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30  fs, 1000*ms)/100
14a70 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
14a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
14a90 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
14aa0 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
14ab0 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  codes..*/.int sq
14ac0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
14ad0 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69  esult_codes(sqli
14ae0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f  te3 *db, int ono
14af0 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ff){.  sqlite3_m
14b00 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
14b10 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
14b20 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
14b30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
14b40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
14b50 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
14b60 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
14b70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14b80 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
14b90 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
14ba0 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
14bb0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
14bc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
14bd0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
14be0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
14bf0 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
14c00 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
14c10 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
14c20 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
14c30 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74 65  Btree;..  sqlite
14c40 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
14c50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72  ->mutex);.  pBtr
14c60 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  ee = sqlite3DbNa
14c70 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
14c80 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42  bName);.  if( pB
14c90 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
14ca0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73  r *pPager;.    s
14cb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
14cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
14cd0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
14ce0 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
14cf0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
14d00 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
14d10 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
14d20 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65  .    fd = sqlite
14d30 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
14d40 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
14d50 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  fd!=0 );.    if(
14d60 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
14d70 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
14d80 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
14d90 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
14da0 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  fd;.      rc = S
14db0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
14dc0 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  lse if( fd->pMet
14dd0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63  hods ){.      rc
14de0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
14df0 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
14e00 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pArg);.    }else
14e10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
14e20 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
14e30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
14e40 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
14e50 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14e60 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
14e70 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
14e80 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a  n rc;   .}../*.*
14e90 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74  * Interface to t
14ea0 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63  he testing logic
14eb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14ec0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
14ed0 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e  t op, ...){.  in
14ee0 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65  t rc = 0;.#ifnde
14ef0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  f SQLITE_OMIT_BU
14f00 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f  ILTIN_TEST.  va_
14f10 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
14f20 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
14f30 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
14f40 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65    /*.    ** Save
14f50 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
14f60 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a  te of the PRNG..
14f70 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
14f80 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
14f90 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20  PRNG_SAVE: {.   
14fa0 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61     sqlite3PrngSa
14fb0 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  veState();.     
14fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
14fd0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
14fe0 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f  tore the state o
14ff0 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68  f the PRNG to th
15000 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76  e last state sav
15010 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ed using.    ** 
15020 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50  PRNG_SAVE.  If P
15030 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76  RNG_SAVE has nev
15040 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63  er before been c
15050 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  alled, then.    
15060 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74  ** this verb act
15070 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45  s like PRNG_RESE
15080 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  T..    */.    ca
15090 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
150a0 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a  RL_PRNG_RESTORE:
150b0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
150c0 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65  PrngRestoreState
150d0 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
150e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
150f0 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20     ** Reset the 
15100 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73  PRNG back to its
15110 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
15120 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20  tate.  The next 
15130 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
15140 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
15150 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20  s() will reseed 
15160 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61  the PRNG using a
15170 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20   single call.   
15180 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64   ** to the xRand
15190 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66  omness method of
151a0 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
151b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
151c0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
151d0 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a  L_PRNG_RESET: {.
151e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
151f0 67 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20  gResetState();. 
15200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15210 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
15220 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
15230 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45  ontrol(BITVEC_TE
15240 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61  ST, size, progra
15250 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m).    **.    **
15260 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69   Run a test agai
15270 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a  nst a Bitvec obj
15280 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68  ect of size.  Th
15290 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65  e program argume
152a0 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20  nt.    ** is an 
152b0 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
152c0 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  s that defines t
152d0 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e  he test.  Return
152e0 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20   -1 on a.    ** 
152f0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
15300 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75  n error, 0 on su
15310 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  ccess, or non-ze
15320 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  ro for an error.
15330 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20  .    ** See the 
15340 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
15350 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61  ltinTest() for a
15360 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15370 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
15380 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
15390 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
153a0 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ST: {.      int 
153b0 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
153c0 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
153d0 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28  *aProg = va_arg(
153e0 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
153f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
15400 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73  vecBuiltinTest(s
15410 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20  z, aProg);.     
15420 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15430 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
15440 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
15450 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  ol(BENIGN_MALLOC
15460 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20  _HOOKS, xBegin, 
15470 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  xEnd).    **.   
15480 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f   ** Register hoo
15490 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e  ks to call to in
154a0 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c  dicate which mal
154b0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a  loc() failures .
154c0 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67      ** are benig
154d0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
154e0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
154f0 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
15500 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20  _HOOKS: {.      
15510 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76  typedef void (*v
15520 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f  oid_function)(vo
15530 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  id);.      void_
15540 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
15550 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69  Begin;.      voi
15560 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
15570 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65  gnEnd;.      xBe
15580 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61  nignBegin = va_a
15590 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
155a0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65  tion);.      xBe
155b0 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67  nignEnd = va_arg
155c0 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
155d0 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
155e0 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f  e3BenignMallocHo
155f0 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e  oks(xBenignBegin
15600 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20  , xBenignEnd);. 
15610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15620 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
15630 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
15640 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
15650 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
15660 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  YTE, unsigned in
15670 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
15680 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49  ** Set the PENDI
15690 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76  NG byte to the v
156a0 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75  alue in the argu
156b0 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20  ment, if X>0..  
156c0 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61    ** Make no cha
156d0 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52  nges if X==0.  R
156e0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
156f0 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62  of the pending b
15700 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74  yte.    ** as it
15710 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65   existing before
15720 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
15730 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
15740 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e  .    ** IMPORTAN
15750 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  T:  Changing the
15760 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72   PENDING byte fr
15770 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65  om 0x40000000 re
15780 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20  sults in.    ** 
15790 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
157a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
157b0 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20  rmat.  Changing 
157c0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
157d0 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e  .    ** while an
157e0 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  y database conne
157f0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65  ction is open re
15800 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e  sults in undefin
15810 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69  ed and.    ** di
15820 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69  leterious behavi
15830 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
15840 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
15850 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
15860 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50  : {.      rc = P
15870 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66  ENDING_BYTE;.#if
15880 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15890 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20  _WSD.      {.   
158a0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
158b0 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72  t newVal = va_ar
158c0 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
158d0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
158e0 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65   newVal ) sqlite
158f0 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e  3PendingByte = n
15900 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23  ewVal;.      }.#
15910 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
15920 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
15930 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
15940 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
15950 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
15960 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20  SERT, int X).   
15970 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
15980 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
15990 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
159a0 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
159b0 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73  r not.    ** ass
159c0 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65  ert() was enable
159d0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
159e0 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
159f0 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20   and assert().  
15a00 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c    ** is enabled,
15a10 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
15a20 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20   value is true. 
15a30 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
15a40 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  d.    ** assert(
15a50 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
15a60 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
15a70 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49  alue is zero.  I
15a80 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61  f X is.    ** fa
15a90 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
15aa0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
15ab0 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20  n the assertion 
15ac0 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20  fires and the.  
15ad0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f    ** process abo
15ae0 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61  rts.  If X is fa
15af0 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
15b00 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
15b10 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
15b20 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
15b30 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ro..    */.    c
15b40 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
15b50 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20  TRL_ASSERT: {.  
15b60 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74      volatile int
15b70 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73   x = 0;.      as
15b80 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72  sert( (x = va_ar
15b90 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b  g(ap,int))!=0 );
15ba0 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20  .      rc = x;. 
15bb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15bc0 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
15bd0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
15be0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
15bf0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
15c00 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
15c10 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
15c20 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
15c30 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
15c40 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20   how the ALWAYS 
15c50 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52  and.    ** NEVER
15c60 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66   macros were def
15c70 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
15c80 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  time..    **.   
15c90 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76   ** The return v
15ca0 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58  alue is ALWAYS(X
15cb0 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ).  .    **.    
15cc0 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64  ** The recommend
15cd0 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e  ed test is X==2.
15ce0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
15cf0 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74  value is 2, that
15d00 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c   means.    ** AL
15d10 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
15d20 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f  () are both no-o
15d30 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
15d40 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  acros, which is 
15d50 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
15d60 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20  lt setting.  If 
15d70 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
15d80 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41   is 1, then ALWA
15d90 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20  YS() is either. 
15da0 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64     ** hard-coded
15db0 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65   to true or else
15dc0 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69   it asserts if i
15dd0 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ts argument is f
15de0 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  alse..    ** The
15df0 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20   first behavior 
15e00 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74  (hard-coded to t
15e10 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65  rue) is the case
15e20 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
15e30 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
15e40 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
15e50 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
15e60 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  d and the second
15e70 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  .    ** behavior
15e80 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20   (assert if the 
15e90 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41  argument to ALWA
15ea0 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69  YS() is false) i
15eb0 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
15ec0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
15ed0 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
15ee0 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
15ef0 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
15f00 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
15f10 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63  n-time test proc
15f20 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b  edure might look
15f30 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
15f40 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
15f50 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74   **    if( sqlit
15f60 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
15f70 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15f80 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b  ALWAYS, 2)==2 ){
15f90 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
15fa0 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
15fb0 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70  ER() are no-op p
15fc0 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
15fd0 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  os.    **    }el
15fe0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  se if( sqlite3_t
15ff0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
16000 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
16010 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a  RT, 1) ){.    **
16020 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
16030 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20  x) asserts that 
16040 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52  x is true. NEVER
16050 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73  (x) asserts x is
16060 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20   false..    **  
16070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
16080 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
16090 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
160a0 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20  1.  NEVER(x) is 
160b0 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20  a constant 0..  
160c0 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f    **    }.    */
160d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
160e0 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
160f0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  : {.      int x 
16100 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
16110 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57  ;.      rc = ALW
16120 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72  AYS(x);.      br
16130 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
16140 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
16150 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
16160 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
16170 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
16180 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
16190 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
161a0 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
161b0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
161c0 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
161d0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
161e0 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
161f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
16200 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
16210 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
16220 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
16230 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
16240 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
16250 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
16260 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
16270 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
16280 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
16290 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
162a0 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
162b0 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
162c0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
162d0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
162e0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
162f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
16300 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
16310 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
16320 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
16330 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
16340 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
16350 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
16360 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
16370 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
16380 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
16390 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
163a0 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
163b0 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
163c0 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
163d0 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
163e0 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
163f0 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
16400 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
16410 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
16420 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
16430 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
16440 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
16450 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
16460 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
16470 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
16480 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
16490 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
164a0 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
164b0 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
164c0 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
164d0 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
164e0 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
164f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
16500 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
16510 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
16520 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
16530 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
16540 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
16550 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
16560 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  );.      db->fla
16570 67 73 20 3d 20 28 78 20 26 20 53 51 4c 49 54 45  gs = (x & SQLITE
16580 5f 4f 70 74 4d 61 73 6b 29 20 7c 20 28 64 62 2d  _OptMask) | (db-
16590 3e 66 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  >flags & ~SQLITE
165a0 5f 4f 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20  _OptMask);.     
165b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
165c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b  ifdef SQLITE_N_K
165d0 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71  EYWORD.    /* sq
165e0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
165f0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
16600 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f  RL_ISKEYWORD, co
16610 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29  nst char *zWord)
16620 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
16630 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79  f zWord is a key
16640 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20  word recognized 
16650 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  by the parser, t
16660 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20  hen return the. 
16670 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
16680 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66  keywords.  Or if
16690 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20   zWord is not a 
166a0 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20  keyword, return 
166b0 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  0..    ** .    *
166c0 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74  * This test feat
166d0 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ure is only avai
166e0 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61  lable in the ama
166f0 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a  lgamation since.
16700 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54      ** the SQLIT
16710 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72  E_N_KEYWORD macr
16720 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  o is not defined
16730 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66   in this file if
16740 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69   SQLite.    ** i
16750 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65  s built using se
16760 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69  parate source fi
16770 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
16780 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
16790 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20  CTRL_ISKEYWORD: 
167a0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
167b0 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61  ar *zWord = va_a
167c0 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
167d0 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r*);.      int n
167e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
167f0 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20  30(zWord);.     
16800 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65   rc = (sqlite3Ke
16810 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a  ywordCode((u8*)z
16820 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29  Word, n)!=TK_ID)
16830 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57   ? SQLITE_N_KEYW
16840 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62  ORD : 0;.      b
16850 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
16860 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69  if ..    /* sqli
16870 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
16880 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
16890 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20  _SCRATCHMALLOC, 
168a0 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65  sz, &pNew, pFree
168b0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
168c0 20 50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f   Pass pFree into
168d0 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
168e0 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49  ree(). .    ** I
168f0 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f  f sz>0 then allo
16900 63 61 74 65 20 61 20 73 63 72 61 74 63 68 20 62  cate a scratch b
16910 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e  uffer into pNew.
16920 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61    .    */.    ca
16930 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
16940 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43  RL_SCRATCHMALLOC
16950 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  : {.      void *
16960 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a  pFree, **ppNew;.
16970 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20        int sz;.  
16980 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28      sz = va_arg(
16990 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
169a0 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61  ppNew = va_arg(a
169b0 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20  p, void**);.    
169c0 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67    pFree = va_arg
169d0 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
169e0 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e     if( sz ) *ppN
169f0 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ew = sqlite3Scra
16a00 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20  tchMalloc(sz);. 
16a10 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 72 61       sqlite3Scra
16a20 74 63 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a  tchFree(pFree);.
16a30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16a40 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
16a50 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
16a60 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
16a70 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
16a80 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20  T, int onoff);. 
16a90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
16aa0 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20  parameter onoff 
16ab0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e  is non-zero, con
16ac0 66 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70  figure the wrapp
16ad0 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a  ers so that all.
16ae0 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e      ** subsequen
16af0 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c  t calls to local
16b00 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61  time() and varia
16b10 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f  nts fail. If ono
16b20 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20  ff is zero,.    
16b30 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74  ** undo this set
16b40 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ting..    */.   
16b50 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
16b60 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
16b70 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73  FAULT: {.      s
16b80 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16b90 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75  ig.bLocaltimeFau
16ba0 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  lt = va_arg(ap, 
16bb0 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
16bc0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65  k;.    }..#if de
16bd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
16be0 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
16bf0 29 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ).    /*   sqlit
16c00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
16c10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
16c20 45 58 50 4c 41 49 4e 5f 53 54 4d 54 2c 0a 20 20  EXPLAIN_STMT,.  
16c30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
16c40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
16c50 74 65 33 5f 73 74 6d 74 2a 2c 63 6f 6e 73 74 20  te3_stmt*,const 
16c60 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 2a 2a 0a  char**);.    **.
16c70 20 20 20 20 2a 2a 20 49 66 20 63 6f 6d 70 69 6c      ** If compil
16c80 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45  ed with SQLITE_E
16c90 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
16ca0 49 4e 2c 20 65 61 63 68 20 73 71 6c 69 74 65 33  IN, each sqlite3
16cb0 5f 73 74 6d 74 20 68 6f 6c 64 73 0a 20 20 20 20  _stmt holds.    
16cc0 2a 2a 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  ** a string that
16cd0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6f   describes the o
16ce0 70 74 69 6d 69 7a 65 64 20 70 61 72 73 65 20 74  ptimized parse t
16cf0 72 65 65 2e 20 20 54 68 69 73 20 74 65 73 74 2d  ree.  This test-
16d00 63 6f 6e 74 72 6f 6c 0a 20 20 20 20 2a 2a 20 72  control.    ** r
16d10 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
16d20 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e   to that string.
16d30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
16d40 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
16d50 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54 3a 20 7b  _EXPLAIN_STMT: {
16d60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
16d70 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 76 61 5f  tmt *pStmt = va_
16d80 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
16d90 73 74 6d 74 2a 29 3b 0a 20 20 20 20 20 20 63 6f  stmt*);.      co
16da0 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 52 65 74  nst char **pzRet
16db0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
16dc0 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20  nst char**);.   
16dd0 20 20 20 2a 70 7a 52 65 74 20 3d 20 73 71 6c 69     *pzRet = sqli
16de0 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69  te3VdbeExplanati
16df0 6f 6e 28 28 56 64 62 65 2a 29 70 53 74 6d 74 29  on((Vdbe*)pStmt)
16e00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16e10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 7d     }.#endif..  }
16e20 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
16e30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16e40 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
16e50 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
16e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16e70 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
16e80 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
16e90 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
16ea0 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
16eb0 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
16ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
16ed0 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
16ee0 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
16ef0 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
16f00 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
16f10 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
16f20 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
16f30 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
16f40 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
16f50 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
16f60 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
16f70 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
16f80 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
16f90 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
16fa0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
16fb0 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
16fc0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
16fd0 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
16fe0 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
16ff0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
17000 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
17010 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
17020 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
17030 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
17040 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
17050 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
17060 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
17070 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
17080 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
17090 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
170a0 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
170b0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
170c0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
170d0 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
170e0 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
170f0 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d  ;.  zFilename +=
17100 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17110 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
17120 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e  .  while( zFilen
17130 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
17140 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69  t x = strcmp(zFi
17150 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
17160 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
17170 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17180 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
17190 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29  ;.    if( x==0 )
171a0 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
171b0 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  e;.    zFilename
171c0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
171d0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
171e0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
171f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
17200 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  urn a boolean va
17210 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
17220 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e  parameter..*/.in
17230 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  t sqlite3_uri_bo
17240 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72  olean(const char
17250 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
17260 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
17270 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63   int bDflt){.  c
17280 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
17290 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
172a0 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
172b0 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74  zParam);.  bDflt
172c0 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72   = bDflt!=0;.  r
172d0 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65  eturn z ? sqlite
172e0 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62  3GetBoolean(z, b
172f0 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d  Dflt) : bDflt;.}
17300 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
17310 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
17320 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
17330 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
17340 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
17350 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28  lite3_uri_int64(
17360 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17370 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
17380 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73  Filename as pass
17390 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20  ed to xOpen */. 
173a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
173b0 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52  ram,       /* UR
173c0 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67  I parameter soug
173d0 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ht */.  sqlite3_
173e0 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20 20  int64 bDflt     
173f0 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70    /* return if p
17400 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73  arameter is miss
17410 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ing */.){.  cons
17420 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
17430 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
17440 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
17450 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ram);.  sqlite3_
17460 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a  int64 v;.  if( z
17470 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f 69 36   && sqlite3Atoi6
17480 34 28 7a 2c 20 26 76 2c 20 73 71 6c 69 74 65 33  4(z, &v, sqlite3
17490 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
174a0 49 54 45 5f 55 54 46 38 29 3d 3d 53 51 4c 49 54  ITE_UTF8)==SQLIT
174b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c  E_OK ){.    bDfl
174c0 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
174d0 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  urn bDflt;.}../*
174e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42  .** Return the B
174f0 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65  tree pointer ide
17500 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61  ntified by zDbNa
17510 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  me.  Return NULL
17520 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
17530 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33  /.Btree *sqlite3
17540 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71  DbNameToBtree(sq
17550 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
17560 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
17570 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
17580 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
17590 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
175a0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20  ->aDb[i].pBt.   
175b0 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30    && (zDbName==0
175c0 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
175d0 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e  mp(zDbName, db->
175e0 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  aDb[i].zName)==0
175f0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
17600 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d  eturn db->aDb[i]
17610 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  .pBt;.    }.  }.
17620 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
17630 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17640 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
17650 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
17660 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
17670 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
17680 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
17690 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
176a0 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
176b0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
176c0 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
176d0 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44   *pBt = sqlite3D
176e0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
176f0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
17700 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
17710 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
17720 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
17730 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
17740 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
17750 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
17760 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
17770 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
17780 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
17790 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
177a0 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
177b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
177c0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
177d0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  ){.  Btree *pBt 
177e0 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
177f0 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
17800 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
17810 74 20 3f 20 73 71 6c 69 74 65 33 50 61 67 65 72  t ? sqlite3Pager
17820 49 73 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  Isreadonly(sqlit
17830 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
17840 29 29 20 3a 20 2d 31 3b 0a 7d 0a                 )) : -1;.}.