/ Hex Artifact Content
Login

Artifact b4c74ff20abd393b14b3cf7b2130758e2187a5b2:


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 35 34 38 32  ATION-OF: R-5482
06a0: 33 2d 34 31 33 34 33 20 54 68 65 20 73 71 6c 69  3-41343 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 6d 75 74  was compiled mut
0700: 65 78 69 6e 67 20 63 6f 64 65 20 6f 6d 69 74 74  exing code omitt
0710: 65 64 20 64 75 65 20 74 6f 0a 2a 2a 20 74 68 65  ed due to.** the
0720: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
0730: 46 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  FE compile-time 
0740: 6f 70 74 69 6f 6e 20 62 65 69 6e 67 20 73 65 74  option being set
0750: 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
0760: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0770: 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53  (void){ return S
0780: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
0790: 3b 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ; }..#if !define
07a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
07b0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
07c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
07d0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
07e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
07f0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0800: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0810: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0820: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0830: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0840: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0850: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0860: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0870: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0880: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0890: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
08a0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
08b0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  ivity only..*/.v
08c0: 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54  oid (*sqlite3IoT
08d0: 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72  race)(const char
08e0: 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e  *, ...) = 0;.#en
08f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
0900: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
0910: 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  al variable poin
0920: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77  ts to a string w
0930: 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e  hich is the.** n
0940: 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
0950: 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69  ry, then that di
0960: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
0970: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
0980: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
0990: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
09a0: 20 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d   the "PRAGMA tem
09b0: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
09c0: 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a  y" SQL command..
09d0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
09e0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
09f0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  = 0;../*.** Init
0a00: 69 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20  ialize SQLite.  
0a10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0a20: 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
0a30: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
0a40: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0a50: 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20  cation,.** VFS, 
0a60: 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
0a70: 74 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f  tems prior to do
0a80: 69 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20  ing any serious 
0a90: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c  work with.** SQL
0aa0: 69 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e  ite.  But as lon
0ab0: 67 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20  g as you do not 
0ac0: 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c  compile with SQL
0ad0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
0ae0: 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  T.** this routin
0af0: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
0b00: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
0b10: 79 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73  y key routines s
0b20: 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65  uch as.** sqlite
0b30: 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a  3_open().  .**.*
0b40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0b50: 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74  s a no-op except
0b60: 20 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72   on its very fir
0b70: 73 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20  st call for the 
0b80: 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66  process,.** or f
0b90: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  or the first cal
0ba0: 6c 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  l after a call t
0bb0: 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  o sqlite3_shutdo
0bc0: 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  wn..**.** The fi
0bd0: 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61  rst thread to ca
0be0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
0bf0: 72 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c  runs the initial
0c00: 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f  ization to.** co
0c10: 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75  mpletion.  If su
0c20: 62 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73  bsequent threads
0c30: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
0c40: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ne before the fi
0c50: 72 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61  rst.** thread ha
0c60: 73 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69  s finished the i
0c70: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
0c80: 6f 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20  ocess, then the 
0c90: 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68  subsequent.** th
0ca0: 72 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b  reads must block
0cb0: 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
0cc0: 20 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73   thread finishes
0cd0: 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
0ce0: 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  lization..**.** 
0cf0: 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  The first thread
0d00: 20 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73   might call this
0d10: 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69   routine recursi
0d20: 76 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65  vely.  Recursive
0d30: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  .** calls to thi
0d40: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
0d50: 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63   not block, of c
0d60: 6f 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73  ourse.  Otherwis
0d70: 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
0d80: 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20  ization process 
0d90: 77 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70  would never comp
0da0: 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20  lete..**.** Let 
0db0: 58 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74  X be the first t
0dc0: 68 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74  hread to enter t
0dd0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65  his routine.  Le
0de0: 74 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65  t Y be some othe
0df0: 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68  r.** thread.  Th
0e00: 65 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69  en while the ini
0e10: 74 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tial invocation 
0e20: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
0e30: 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d  by X is.** incom
0e40: 70 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71  plete, it is req
0e50: 75 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a  uired that:.**.*
0e60: 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f  *    *  Calls to
0e70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
0e80: 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20  om Y must block 
0e90: 75 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d  until the outer-
0ea0: 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61  most.**       ca
0eb0: 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65  ll by X complete
0ec0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52  s..**.**    *  R
0ed0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
0ee0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  o this routine f
0ef0: 72 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74  rom thread X ret
0f00: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
0f10: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74  **       without
0f20: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e   blocking..*/.in
0f30: 74 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  t sqlite3_initia
0f40: 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55  lize(void){.  MU
0f50: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
0f60: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
0f70: 72 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68  r; )       /* Th
0f80: 65 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75  e main static mu
0f90: 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  tex */.  int rc;
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
0fd0: 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
0fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
0ff0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
1000: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
1010: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1020: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1030: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1040: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c  dif..  /* If SQL
1050: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 63  ite is already c
1060: 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61  ompletely initia
1070: 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73  lized, then this
1080: 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71   call.  ** to sq
1090: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
10a0: 28 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e  () should be a n
10b0: 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69  o-op.  But the i
10c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
10d0: 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c  ** must be compl
10e0: 65 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20  ete.  So isInit 
10f0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20  must not be set 
1100: 75 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20 65  until the very e
1110: 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  nd.  ** of this 
1120: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
1130: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1140: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
1150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1160: 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  K;..  /* Make su
1170: 72 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  re the mutex sub
1180: 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61  system is initia
1190: 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c  lized.  If unabl
11a0: 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69  e to .  ** initi
11b0: 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20  alize the mutex 
11c0: 73 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72  subsystem, retur
11d0: 6e 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65  n early with the
11e0: 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20   error..  ** If 
11f0: 74 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f  the system is so
1200: 20 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72   sick that we ar
1210: 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  e unable to allo
1220: 63 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20  cate a mutex,.  
1230: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  ** there is not 
1240: 6d 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67  much SQLite is g
1250: 6f 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20  oing to be able 
1260: 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  to do..  **.  **
1270: 20 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   The mutex subsy
1280: 73 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63  stem must take c
1290: 61 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69  are of serializi
12a0: 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20  ng its own.  ** 
12b0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
12c0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
12d0: 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a  te3MutexInit();.
12e0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12f0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  n rc;..  /* Init
1300: 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f  ialize the mallo
1310: 63 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74  c() system and t
1320: 68 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e  he recursive pIn
1330: 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20  itMutex mutex.. 
1340: 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69   ** This operati
1350: 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  on is protected 
1360: 62 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41  by the STATIC_MA
1370: 53 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74  STER mutex.  Not
1380: 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65  e that.  ** Mute
1390: 78 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c  xAlloc() is call
13a0: 65 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20  ed for a static 
13b0: 6d 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69  mutex prior to i
13c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a  nitializing the.
13d0: 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73    ** malloc subs
13e0: 79 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70  ystem - this imp
13f0: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c  lies that the al
1400: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74  location of a st
1410: 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20  atic.  ** mutex 
1420: 6d 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65  must not require
1430: 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68   support from th
1440: 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  e malloc subsyst
1450: 65 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58  em..  */.  MUTEX
1460: 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
1470: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
1480: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1490: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
14a0: 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
14b0: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
14c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  );.  sqlite3Glob
14d0: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78  alConfig.isMutex
14e0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20  Init = 1;.  if( 
14f0: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1500: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1510: 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
1520: 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28  lite3MallocInit(
1530: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1540: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1550: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1560: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
1570: 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  it = 1;.    if( 
1580: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1590: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
15a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
15c0: 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20  itMutex =.      
15d0: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65       sqlite3Mute
15e0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15f0: 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
1600: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1610: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
1620: 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c  oreMutex && !sql
1630: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1640: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
1650: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1660: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1670: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
1680: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1690: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
16a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
16b0: 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a  nitMutex++;.  }.
16c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16d0: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
16e0: 0a 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e  .  /* If rc is n
16f0: 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20  ot SQLITE_OK at 
1700: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
1710: 20 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c   either the mall
1720: 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65  oc.  ** subsyste
1730: 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69  m could not be i
1740: 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68  nitialized or th
1750: 65 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20  e system failed 
1760: 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  to allocate.  **
1770: 20 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20   the pInitMutex 
1780: 6d 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e  mutex. Return an
1790: 20 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72   error in either
17a0: 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28   case.  */.  if(
17b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
17d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68  .  }..  /* Do th
17e0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e  e rest of the in
17f0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64  itialization und
1800: 65 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  er the recursive
1810: 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74   mutex so.  ** t
1820: 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61  hat we will be a
1830: 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65  ble to handle re
1840: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e  cursive calls in
1850: 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
1860: 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54  initialize().  T
1870: 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
1880: 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65  ls normally come
1890: 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71   through.  ** sq
18a0: 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20  lite3_os_init() 
18b0: 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20  when it invokes 
18c0: 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
18d0: 73 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65  ster(), but othe
18e0: 72 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65  r.  ** recursive
18f0: 20 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73   calls might als
1900: 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  o be possible.. 
1910: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
1920: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30  NTATION-OF: R-00
1930: 31 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65  140-37445 SQLite
1940: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73   automatically s
1950: 65 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a  erializes calls.
1960: 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69    ** to the xIni
1970: 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65  t method, so the
1980: 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65   xInit method ne
1990: 65 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64  ed not be thread
19a0: 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  safe..  **.  ** 
19b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75  The following mu
19c0: 74 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69  tex is what seri
19d0: 61 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f  alizes access to
19e0: 20 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63   the appdef pcac
19f0: 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65  he xInit.  ** me
1a00: 74 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69  thods.  The sqli
1a10: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
1a20: 64 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69  ds.xInit() all i
1a30: 73 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68  s embedded in th
1a40: 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  e.  ** call to s
1a50: 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74  qlite3PcacheInit
1a60: 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20  ialize()..  */. 
1a70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a80: 6e 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62  nter(sqlite3Glob
1a90: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1aa0: 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tex);.  if( sqli
1ab0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ac0: 69 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c  isInit==0 && sql
1ad0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ae0: 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29  .inProgress==0 )
1af0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73  {.    FuncDefHas
1b00: 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42  h *pHash = &GLOB
1b10: 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20  AL(FuncDefHash, 
1b20: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
1b30: 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c  ctions);.    sql
1b40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1b50: 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b  .inProgress = 1;
1b60: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73  .    memset(pHas
1b70: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c  h, 0, sizeof(sql
1b80: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
1b90: 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ons));.    sqlit
1ba0: 65 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c  e3RegisterGlobal
1bb0: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20  Functions();.   
1bc0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1bd0: 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68  alConfig.isPCach
1be0: 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eInit==0 ){.    
1bf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
1c00: 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29  acheInitialize()
1c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1c40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
1c50: 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  cheInit = 1;.   
1c60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c70: 73 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20  sInit();.    }. 
1c80: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1ca0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
1cb0: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
1cc0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
1cd0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
1ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1cf0: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
1d00: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
1d10: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
1d20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d30: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  isInit = 1;.    
1d40: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  }.    sqlite3Glo
1d50: 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67  balConfig.inProg
1d60: 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ress = 0;.  }.  
1d70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1d80: 61 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ave(sqlite3Globa
1d90: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1da0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61  ex);..  /* Go ba
1db0: 63 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61  ck under the sta
1dc0: 74 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c  tic mutex and cl
1dd0: 65 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72  ean up the recur
1de0: 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20  sive.  ** mutex 
1df0: 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73  to prevent a res
1e00: 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f  ource leak..  */
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1e20: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1e30: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1e40: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1e50: 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71  utex--;.  if( sq
1e60: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e70: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c  g.nRefInitMutex<
1e80: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1e90: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1ea0: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
1eb0: 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
1ec0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
1ed0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
1ee0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
1ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
1f00: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1f10: 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  utex = 0;.  }.  
1f20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1f30: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20  ave(pMaster);.. 
1f40: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1f50: 67 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69  g is just a sani
1f60: 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ty check to make
1f70: 20 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73   sure SQLite has
1f80: 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69  .  ** been compi
1f90: 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  led correctly.  
1fa0: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
1fb0: 74 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  to run this code
1fc0: 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f  , but.  ** we do
1fd0: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20  n't want to run 
1fe0: 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64  it too often and
1ff0: 20 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63   soak up CPU cyc
2000: 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20  les for no.  ** 
2010: 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72  reason.  So we r
2020: 75 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e  un it once durin
2030: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
2040: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
2050: 44 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51  DEBUG.#ifndef SQ
2060: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
2070: 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68  NG_POINT.  /* Th
2080: 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f  is section of co
2090: 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75  de's only "outpu
20a0: 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74  t" is via assert
20b0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a  () statements. *
20c0: 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c  /.  if ( rc==SQL
20d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36  ITE_OK ){.    u6
20e0: 34 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c  4 x = (((u64)1)<
20f0: 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62  <63)-1;.    doub
2100: 6c 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74  le y;.    assert
2110: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a  (sizeof(x)==8);.
2120: 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
2130: 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29  f(x)==sizeof(y))
2140: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c  ;.    memcpy(&y,
2150: 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73   &x, 8);.    ass
2160: 65 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61  ert( sqlite3IsNa
2170: 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  N(y) );.  }.#end
2180: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  if.#endif..  /* 
2190: 44 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c  Do extra initial
21a0: 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65  ization steps re
21b0: 71 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53  quested by the S
21c0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
21d0: 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  .  ** compile-ti
21e0: 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  me option..  */.
21f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2200: 54 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 72  TRA_INIT.  if( r
2210: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2220: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2230: 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20  fig.isInit ){.  
2240: 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54    int SQLITE_EXT
2250: 52 41 5f 49 4e 49 54 28 76 6f 69 64 29 3b 0a 20  RA_INIT(void);. 
2260: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2270: 58 54 52 41 5f 49 4e 49 54 28 29 3b 0a 20 20 7d  XTRA_INIT();.  }
2280: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2290: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
22a0: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
22b0: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
22c0: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
22d0: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
22e0: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
22f0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
2300: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2310: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
2320: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
2330: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2340: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2350: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2360: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
2370: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
2380: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
2390: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
23a0: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
23b0: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
23c0: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
23d0: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
23e0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
23f0: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
2400: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2410: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
2420: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2430: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2440: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2450: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2460: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2470: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2480: 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  nit ){.#ifdef SQ
2490: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
24a0: 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c  OWN.    void SQL
24b0: 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f  ITE_EXTRA_SHUTDO
24c0: 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51  WN(void);.    SQ
24d0: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
24e0: 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OWN();.#endif.  
24f0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
2500: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
2510: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
2520: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
2530: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2540: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2550: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2560: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2570: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
2580: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
2590: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
25a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
25b0: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
25c0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
25d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
25e0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
25f0: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
2600: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
2610: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2620: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
2630: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2640: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2650: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2660: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2670: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2680: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2690: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
26a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
26b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26c0: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
26d0: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
26e0: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
26f0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
2700: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
2710: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
2720: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
2730: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2740: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
2750: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2760: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
2770: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2780: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2790: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
27a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
27b0: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
27c0: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
27d0: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
27e0: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
27f0: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
2800: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
2810: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
2820: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
2830: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
2840: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2850: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
2860: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
2870: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
2880: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
2890: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
28a0: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
28b0: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
28c0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
28d0: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
28e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
28f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
2900: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
2910: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
2920: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
2930: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
2940: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
2950: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
2960: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
2970: 6f 6d 70 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a  ompile. .    */.
2980: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2990: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
29a0: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
29b0: 41 46 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53  AFE>0.    case S
29c0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e  QLITE_CONFIG_SIN
29d0: 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  GLETHREAD: {.   
29e0: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c     /* Disable al
29f0: 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20  l mutexing */.  
2a00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2a10: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
2a20: 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ex = 0;.      sq
2a30: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2a40: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
2a50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2a60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2a70: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54  LITE_CONFIG_MULT
2a80: 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20  ITHREAD: {.     
2a90: 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65   /* Disable mute
2aa0: 78 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65  xing of database
2ab0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
2ac0: 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20        /* Enable 
2ad0: 6d 75 74 65 78 69 6e 67 20 6f 66 20 63 6f 72 65  mutexing of core
2ae0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
2af0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2b00: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
2b10: 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20  oreMutex = 1;.  
2b20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b30: 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
2b40: 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  ex = 0;.      br
2b50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2b60: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2b70: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
2b80: 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20        /* Enable 
2b90: 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a  all mutexing */.
2ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2bb0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
2bc0: 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  utex = 1;.      
2bd0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2be0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
2bf0: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
2c00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2c10: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55  SQLITE_CONFIG_MU
2c20: 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TEX: {.      /* 
2c30: 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72  Specify an alter
2c40: 6e 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70  native mutex imp
2c50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
2c60: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2c70: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d  alConfig.mutex =
2c80: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
2c90: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
2ca0: 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ds*);.      brea
2cb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2cc0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2cd0: 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20  GETMUTEX: {.    
2ce0: 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68    /* Retrieve th
2cf0: 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20  e current mutex 
2d00: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
2d10: 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  /.      *va_arg(
2d20: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
2d30: 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  x_methods*) = sq
2d40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2d50: 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62  g.mutex;.      b
2d60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
2d70: 69 66 0a 0a 0a 20 20 20 20 63 61 73 65 20 53 51  if...    case SQ
2d80: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
2d90: 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  OC: {.      /* S
2da0: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
2db0: 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70  ative malloc imp
2dc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
2dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2de0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
2df0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
2e00: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
2e10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2e20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2e30: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
2e40: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
2e50: 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72  Retrieve the cur
2e60: 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d  rent malloc() im
2e70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
2e80: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2e90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e  3GlobalConfig.m.
2ea0: 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c  xMalloc==0 ) sql
2eb0: 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c  ite3MemSetDefaul
2ec0: 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61  t();.      *va_a
2ed0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
2ee0: 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73  em_methods*) = s
2ef0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2f00: 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61  ig.m;.      brea
2f10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2f20: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2f30: 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20  MEMSTATUS: {.   
2f40: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20     /* Enable or 
2f50: 64 69 73 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c  disable the mall
2f60: 6f 63 20 73 74 61 74 75 73 20 63 6f 6c 6c 65 63  oc status collec
2f70: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
2f80: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2f90: 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f  g.bMemstat = va_
2fa0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
2fb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2fc0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2fd0: 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a  _CONFIG_SCRATCH:
2fe0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69   {.      /* Desi
2ff0: 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66  gnate a buffer f
3000: 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  or scratch memor
3010: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
3020: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3030: 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20  nfig.pScratch = 
3040: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
3050: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3060: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53  GlobalConfig.szS
3070: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
3080: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3090: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
30a0: 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d 20 76  fig.nScratch = v
30b0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
30c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
30e0: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
30f0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
3100: 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66  Designate a buff
3110: 65 72 20 66 6f 72 20 70 61 67 65 20 63 61 63 68  er for page cach
3120: 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  e memory space *
3130: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3140: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
3150: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
3160: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3170: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3180: 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67  .szPage = va_arg
3190: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
31a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
31b0: 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f  nfig.nPage = va_
31c0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
31d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
31e0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
31f0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a  E_CONFIG_PCACHE:
3200: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f   {.      /* no-o
3210: 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  p */.      break
3220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
3240: 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  ETPCACHE: {.    
3250: 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f    /* now an erro
3260: 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  r */.      rc = 
3270: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
3280: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3290: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
32a0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32  E_CONFIG_PCACHE2
32b0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
32c0: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
32d0: 69 76 65 20 70 61 67 65 20 63 61 63 68 65 20 69  ive page cache i
32e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
32f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3300: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3310: 65 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c  e2 = *va_arg(ap,
3320: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
3330: 6d 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20  methods2*);.    
3340: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3350: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3360: 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32  ONFIG_GETPCACHE2
3370: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
3380: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3390: 67 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d  g.pcache2.xInit=
33a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
33b0: 6c 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65  lite3PCacheSetDe
33c0: 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d  fault();.      }
33d0: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
33e0: 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  p, sqlite3_pcach
33f0: 65 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73  e_methods2*) = s
3400: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3410: 69 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20  ig.pcache2;.    
3420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
3430: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3440: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
3450: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  3) || defined(SQ
3460: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
3470: 59 53 35 29 0a 20 20 20 20 63 61 73 65 20 53 51  YS5).    case SQ
3480: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50  LITE_CONFIG_HEAP
3490: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
34a0: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
34b0: 66 6f 72 20 68 65 61 70 20 6d 65 6d 6f 72 79 20  for heap memory 
34c0: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
34d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
34e0: 69 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72  ig.pHeap = va_ar
34f0: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3500: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3510: 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20  lConfig.nHeap = 
3520: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3540: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
3550: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3560: 74 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73  t);..      if( s
3570: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3580: 69 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20  ig.mnReq<1 ){.  
3590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
35a0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
35b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
35c0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
35d0: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28  alConfig.mnReq>(
35e0: 31 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20  1<<12) ){.      
35f0: 20 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71    /* cap min req
3600: 75 65 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31  uest size at 2^1
3610: 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  2 */.        sql
3620: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3630: 2e 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29  .mnReq = (1<<12)
3640: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
3650: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3660: 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d  alConfig.pHeap==
3670: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
3680: 49 66 20 74 68 65 20 68 65 61 70 20 70 6f 69 6e  If the heap poin
3690: 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ter is NULL, the
36a0: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 6d 61  n restore the ma
36b0: 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lloc implementat
36c0: 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ion.        ** b
36d0: 61 63 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e  ack to NULL poin
36e0: 74 65 72 73 20 74 6f 6f 2e 20 20 54 68 69 73 20  ters too.  This 
36f0: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d  will cause the m
3700: 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20  alloc to go.    
3710: 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69      ** back to i
3720: 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65  ts default imple
3730: 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73  mentation when s
3740: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
3750: 65 28 29 20 69 73 0a 20 20 20 20 20 20 20 20 2a  e() is.        *
3760: 2a 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a  * run..        *
3770: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  /.        memset
3780: 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  (&sqlite3GlobalC
3790: 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65  onfig.m, 0, size
37a0: 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  of(sqlite3Global
37b0: 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20  Config.m));.    
37c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37d0: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 70 6f 69   /* The heap poi
37e0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
37f0: 2c 20 74 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f  , then install o
3800: 6e 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ne of the.      
3810: 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33    ** mem5.c/mem3
3820: 2e 63 20 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e  .c methods. If n
3830: 65 69 74 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45  either ENABLE_ME
3840: 4d 53 59 53 33 20 6e 6f 72 0a 20 20 20 20 20 20  MSYS3 nor.      
3850: 20 20 2a 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53    ** ENABLE_MEMS
3860: 59 53 35 20 69 73 20 64 65 66 69 6e 65 64 2c 20  YS5 is defined, 
3870: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  return an error.
3880: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
3890: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
38a0: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
38b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
38c0: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
38d0: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
38e0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
38f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3900: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
3910: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3920: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
3930: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
3940: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
3950: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3960: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
3970: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3980: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
3990: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
39a0: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
39b0: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
39c0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
39d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
39e0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
39f0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3a00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3a10: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
3a20: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
3a30: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
3a40: 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69  ction and its fi
3a50: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
3a60: 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74    ** The default
3a70: 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69   is NULL.  Loggi
3a80: 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ng is disabled i
3a90: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  f the function p
3aa0: 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a  ointer is.    **
3ab0: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
3ac0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3ad0: 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20  NFIG_LOG: {.    
3ae0: 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
3af0: 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
3b00: 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
3b10: 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
3b20: 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
3b30: 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
3b40: 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
3b50: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
3b60: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
3b70: 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28  arg(ap, void(*)(
3b80: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
3b90: 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a  char*));.      *
3ba0: 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
3bb0: 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29  void(*LOGFUNC_t)
3bc0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
3bd0: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73   char*);.      s
3be0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3bf0: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
3c00: 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b  (ap, LOGFUNC_t);
3c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3c20: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41  obalConfig.pLogA
3c30: 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  rg = va_arg(ap, 
3c40: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72  void*);.      br
3c50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
3c60: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3c70: 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20  IG_URI: {.      
3c80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3c90: 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76  fig.bOpenUri = v
3ca0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3cb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3cc0: 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
3cd0: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
3ce0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3d00: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
3d10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3d20: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68  ./*.** Set up th
3d30: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  e lookaside buff
3d40: 65 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61  ers for a databa
3d50: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
3d60: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
3d70: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
3d80: 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65  .** If lookaside
3d90: 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
3da0: 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ve, return SQLIT
3db0: 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68  E_BUSY..**.** Th
3dc0: 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69  e sz parameter i
3dd0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3de0: 62 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f  bytes in each lo
3df0: 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a  okaside slot..**
3e00: 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74   The cnt paramet
3e10: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
3e20: 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70   of slots.  If p
3e30: 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68  Start is NULL th
3e40: 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74  e.** space for t
3e50: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
3e60: 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ory is obtained 
3e70: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
3e80: 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74  loc()..** If pSt
3e90: 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  art is not NULL 
3ea0: 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e  then it is sz*cn
3eb0: 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  t bytes of memor
3ec0: 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20  y to use for.** 
3ed0: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  the lookaside me
3ee0: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
3ef0: 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  int setupLookasi
3f00: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  de(sqlite3 *db, 
3f10: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
3f20: 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  sz, int cnt){.  
3f30: 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20  void *pStart;.  
3f40: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
3f50: 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65  e.nOut ){.    re
3f60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
3f70: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20  ;.  }.  /* Free 
3f80: 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f  any existing loo
3f90: 6b 61 73 69 64 65 20 62 75 66 66 65 72 20 66 6f  kaside buffer fo
3fa0: 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65  r this handle be
3fb0: 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  fore.  ** alloca
3fc0: 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73  ting a new one s
3fd0: 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20  o we don't have 
3fe0: 74 6f 20 68 61 76 65 20 73 70 61 63 65 20 66 6f  to have space fo
3ff0: 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20  r .  ** both at 
4000: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
4010: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f   */.  if( db->lo
4020: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4030: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
4040: 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73  _free(db->lookas
4050: 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d  ide.pStart);.  }
4060: 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f  .  /* The size o
4070: 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c  f a lookaside sl
4080: 6f 74 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f  ot after ROUNDDO
4090: 57 4e 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20  WN8 needs to be 
40a0: 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e  larger.  ** than
40b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65   a pointer to be
40c0: 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20   useful..  */.  
40d0: 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  sz = ROUNDDOWN8(
40e0: 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  sz);  /* IMP: R-
40f0: 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20  33038-09382 */. 
4100: 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69   if( sz<=(int)si
4110: 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c  zeof(LookasideSl
4120: 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20  ot*) ) sz = 0;. 
4130: 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74   if( cnt<0 ) cnt
4140: 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d   = 0;.  if( sz==
4150: 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20  0 || cnt==0 ){. 
4160: 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70     sz = 0;.    p
4170: 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  Start = 0;.  }el
4180: 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29  se if( pBuf==0 )
4190: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
41a0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
41b0: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73  ;.    pStart = s
41c0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a  qlite3Malloc( sz
41d0: 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a  *cnt );  /* IMP:
41e0: 20 52 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a   R-61949-35727 *
41f0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  /.    sqlite3End
4200: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
4210: 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
4220: 20 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   cnt = sqlite3Ma
4230: 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29  llocSize(pStart)
4240: 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  /sz;.  }else{.  
4250: 20 20 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b    pStart = pBuf;
4260: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .  }.  db->looka
4270: 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53  side.pStart = pS
4280: 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b  tart;.  db->look
4290: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b  aside.pFree = 0;
42a0: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
42b0: 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20  .sz = (u16)sz;. 
42c0: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
42d0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f     int i;.    Lo
42e0: 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a  okasideSlot *p;.
42f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e      assert( sz >
4300: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f   (int)sizeof(Loo
4310: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a  kasideSlot*) );.
4320: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
4330: 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a  deSlot*)pStart;.
4340: 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b      for(i=cnt-1;
4350: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
4360: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62     p->pNext = db
4370: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
4380: 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f  e;.      db->loo
4390: 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70  kaside.pFree = p
43a0: 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f  ;.      p = (Loo
43b0: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75  kasideSlot*)&((u
43c0: 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d  8*)p)[sz];.    }
43d0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
43e0: 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20  de.pEnd = p;.   
43f0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4400: 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20  Enabled = 1;.   
4410: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4420: 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d  Malloced = pBuf=
4430: 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65  =0 ?1:0;.  }else
4440: 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  {.    db->lookas
4450: 69 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20  ide.pEnd = 0;.  
4460: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4470: 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20  bEnabled = 0;.  
4480: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4490: 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20  bMalloced = 0;. 
44a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
44b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
44c0: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
44d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
44e0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
44f0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
4500: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
4510: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
4520: 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
4530: 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a  n db->mutex;.}..
4540: 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73  /*.** Free up as
4550: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
4560: 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20  we can from the 
4570: 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a  given database.*
4580: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
4590: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
45a0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73  release_memory(s
45b0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
45c0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt i;.  sqlite3B
45d0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
45e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
45f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
4600: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
4610: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
4620: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
4630: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
4640: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
4650: 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Pager(pBt);.    
4660: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68    sqlite3PagerSh
4670: 72 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  rink(pPager);.  
4680: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
4690: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
46a0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
46b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
46c0: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   Configuration s
46d0: 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69  ettings for an i
46e0: 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61  ndividual databa
46f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f  se connection.*/
4700: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
4710: 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a  config(sqlite3 *
4720: 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  db, int op, ...)
4730: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
4740: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
4750: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
4760: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
4770: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42    case SQLITE_DB
4780: 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45  CONFIG_LOOKASIDE
4790: 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  : {.      void *
47a0: 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70  pBuf = va_arg(ap
47b0: 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50  , void*); /* IMP
47c0: 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20  : R-26835-10964 
47d0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  */.      int sz 
47e0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
47f0: 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  );       /* IMP:
4800: 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a   R-47871-25994 *
4810: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  /.      int cnt 
4820: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4830: 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  );      /* IMP: 
4840: 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f  R-04460-53386 */
4850: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75  .      rc = setu
4860: 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70  pLookaside(db, p
4870: 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20  Buf, sz, cnt);. 
4880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4890: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
48a0: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
48b0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
48c0: 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20       int op;    
48d0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
48e0: 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d  */.        u32 m
48f0: 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ask;    /* Mask 
4900: 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71  of the bit in sq
4910: 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73  lite3.flags to s
4920: 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20  et/clear */.    
4930: 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20    } aFlagOp[] = 
4940: 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  {.        { SQLI
4950: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
4960: 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49  LE_FKEY,    SQLI
4970: 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20  TE_ForeignKeys  
4980: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
4990: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
49a0: 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53  NABLE_TRIGGER, S
49b0: 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
49c0: 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b  ger  },.      };
49d0: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
49e0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20  int i;.      rc 
49f0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
4a00: 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d  /* IMP: R-42790-
4a10: 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66  23372 */.      f
4a20: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
4a30: 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b  ize(aFlagOp); i+
4a40: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
4a50: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f  aFlagOp[i].op==o
4a60: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
4a70: 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72  nt onoff = va_ar
4a80: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
4a90: 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20        int *pRes 
4aa0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4ab0: 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  *);.          in
4ac0: 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d  t oldFlags = db-
4ad0: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
4ae0: 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b    if( onoff>0 ){
4af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
4b00: 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f  >flags |= aFlagO
4b10: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
4b20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
4b30: 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  noff==0 ){.     
4b40: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
4b50: 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e   &= ~aFlagOp[i].
4b60: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
4b70: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
4b80: 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c  oldFlags!=db->fl
4b90: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ags ){.         
4ba0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
4bb0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
4bc0: 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
4bd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
4be0: 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20  ( pRes ){.      
4bf0: 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64        *pRes = (d
4c00: 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67  b->flags & aFlag
4c10: 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a  Op[i].mask)!=0;.
4c20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4c30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4c40: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
4c50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4c60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4c70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4c80: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
4c90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
4ca0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
4cb0: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
4cc0: 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e  [0..n-1] contain
4cd0: 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f  s all spaces..*/
4ce0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53  .static int allS
4cf0: 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72  paces(const char
4d00: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77   *z, int n){.  w
4d10: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e  hile( n>0 && z[n
4d20: 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b  -1]==' ' ){ n--;
4d30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30   }.  return n==0
4d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4d50: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  is the default c
4d60: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
4d70: 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22  n named "BINARY"
4d80: 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73   which is always
4d90: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  .** available..*
4da0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46  *.** If the padF
4db0: 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
4dc0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70  not NULL then sp
4dd0: 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74  ace padding at t
4de0: 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72  he end.** of str
4df0: 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e  ings is ignored.
4e00: 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74    This implement
4e10: 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c  s the RTRIM coll
4e20: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
4e30: 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63   int binCollFunc
4e40: 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61  (.  void *padFla
4e50: 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g,.  int nKey1, 
4e60: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
4e70: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
4e80: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
4e90: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  2.){.  int rc, n
4ea0: 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b  ;.  n = nKey1<nK
4eb0: 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b  ey2 ? nKey1 : nK
4ec0: 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  ey2;.  rc = memc
4ed0: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
4ee0: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
4ef0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46   ){.    if( padF
4f00: 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  lag.     && allS
4f10: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
4f20: 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29  ey1)+n, nKey1-n)
4f30: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
4f40: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32  es(((char*)pKey2
4f50: 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20  )+n, nKey2-n).  
4f60: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65    ){.      /* Le
4f70: 61 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64  ave rc unchanged
4f80: 20 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c   at 0 */.    }el
4f90: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e  se{.      rc = n
4fa0: 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20  Key1 - nKey2;.  
4fb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4fc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e   rc;.}../*.** An
4fd0: 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63  other built-in c
4fe0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
4ff0: 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a  e: NOCASE. .**.*
5000: 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67  * This collating
5010: 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74   sequence is int
5020: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
5030: 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70   for "case indep
5040: 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72  endant.** compar
5050: 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20  ison". SQLite's 
5060: 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70  knowledge of upp
5070: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73  er and lower cas
5080: 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a  e equivalents.**
5090: 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f   extends only to
50a0: 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65   the 26 characte
50b0: 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45  rs used in the E
50c0: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e  nglish language.
50d0: 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f  .**.** At the mo
50e0: 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e  ment there is on
50f0: 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65  ly a UTF-8 imple
5100: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
5110: 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43  atic int nocaseC
5120: 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20  ollatingFunc(.  
5130: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
5140: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
5150: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
5160: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
5170: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
5180: 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74  .  int r = sqlit
5190: 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20  e3StrNICmp(.    
51a0: 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29    (const char *)
51b0: 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68  pKey1, (const ch
51c0: 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65  ar *)pKey2, (nKe
51d0: 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a  y1<nKey2)?nKey1:
51e0: 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44  nKey2);.  UNUSED
51f0: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
5200: 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20  ed);.  if( 0==r 
5210: 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31  ){.    r = nKey1
5220: 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65  -nKey2;.  }.  re
5230: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn r;.}../*.**
5240: 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49   Return the ROWI
5250: 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  D of the most re
5260: 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73  cent insert.*/.s
5270: 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69  qlite_int64 sqli
5280: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
5290: 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  rowid(sqlite3 *d
52a0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
52b0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  >lastRowid;.}../
52c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
52d0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
52e0: 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  s in the most re
52f0: 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
5300: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a  ite3_exec()..*/.
5310: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  int sqlite3_chan
5320: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
5330: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  {.  return db->n
5340: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
5350: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
5360: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69  er of changes si
5370: 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nce the database
5380: 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e   handle was open
5390: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
53a0: 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
53b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
53c0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74   return db->nTot
53d0: 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  alChange;.}../*.
53e0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65  ** Close all ope
53f0: 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68  n savepoints. Th
5400: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  is function only
5410: 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65   manipulates fie
5420: 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  lds of the.** da
5430: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62  tabase handle ob
5440: 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f  ject, it does no
5450: 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65  t close any save
5460: 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20  points that may 
5470: 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68  be open.** at th
5480: 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c  e b-tree/pager l
5490: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
54a0: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
54b0: 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ints(sqlite3 *db
54c0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e  ){.  while( db->
54d0: 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
54e0: 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d    Savepoint *pTm
54f0: 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  p = db->pSavepoi
5500: 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76  nt;.    db->pSav
5510: 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
5520: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
5530: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70  3DbFree(db, pTmp
5540: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61  );.  }.  db->nSa
5550: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64  vepoint = 0;.  d
5560: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
5570: 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73  0;.  db->isTrans
5580: 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20  actionSavepoint 
5590: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
55a0: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
55b0: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  tor function ass
55c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e  ociated with Fun
55d0: 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20  cDef p, if any. 
55e0: 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68  Except,.** if th
55f0: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  is is not the la
5600: 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  st copy of the f
5610: 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  unction, do not 
5620: 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69  invoke it. Multi
5630: 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66  ple.** copies of
5640: 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69   a single functi
5650: 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77  on are created w
5660: 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74  hen create_funct
5670: 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a  ion() is called.
5680: 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41  ** with SQLITE_A
5690: 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  NY as the encodi
56a0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
56b0: 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72  id functionDestr
56c0: 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oy(sqlite3 *db, 
56d0: 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46  FuncDef *p){.  F
56e0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
56f0: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e  Destructor = p->
5700: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69  pDestructor;.  i
5710: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
5720: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
5730: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  r->nRef--;.    i
5740: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  f( pDestructor->
5750: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
5760: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44   pDestructor->xD
5770: 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74  estroy(pDestruct
5780: 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a  or->pUserData);.
5790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
57a0: 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63  ree(db, pDestruc
57b0: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tor);.    }.  }.
57c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
57d0: 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74  n existing SQLit
57e0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e  e database.*/.in
57f0: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  t sqlite3_close(
5800: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5810: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20  HashElem *i;    
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74  /* Hash table it
5840: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
5850: 6a 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b  j;..  if( !db ){
5860: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5870: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
5880: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
5890: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
58a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
58b0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
58c0: 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
58d0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
58e0: 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46  >mutex);..  /* F
58f0: 6f 72 63 65 20 78 44 65 73 74 72 6f 79 20 63 61  orce xDestroy ca
5900: 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75  lls on all virtu
5910: 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 73  al tables */.  s
5920: 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72  qlite3ResetInter
5930: 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31  nalSchema(db, -1
5940: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  );..  /* If a tr
5950: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
5960: 6e 2c 20 74 68 65 20 52 65 73 65 74 49 6e 74 65  n, the ResetInte
5970: 72 6e 61 6c 53 63 68 65 6d 61 28 29 20 63 61 6c  rnalSchema() cal
5980: 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c  l above.  ** wil
5990: 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65  l not have calle
59a0: 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  d the xDisconnec
59b0: 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e  t() method on an
59c0: 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74  y virtual.  ** t
59d0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d  ables in the db-
59e0: 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79  >aVTrans[] array
59f0: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
5a00: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
5a10: 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20  ack().  ** call 
5a20: 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e  will do so. We n
5a30: 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62  eed to do this b
5a40: 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20  efore the check 
5a50: 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20  for active.  ** 
5a60: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62  SQL statements b
5a70: 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74  elow, as the v-t
5a80: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
5a90: 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69  ion may be stori
5aa0: 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65  ng.  ** some pre
5ab0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
5ac0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
5ad0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  /.  sqlite3VtabR
5ae0: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20  ollback(db);..  
5af0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
5b00: 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
5b10: 56 4d 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  VMs, return SQLI
5b20: 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66  TE_BUSY. */.  if
5b30: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20  ( db->pVdbe ){. 
5b40: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
5b50: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
5b60: 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
5b70: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
5b80: 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64 20 73 74  o unfinalised st
5b90: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
5ba0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5bb0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
5bc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5bd0: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73  E_BUSY;.  }.  as
5be0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 61 66  sert( sqlite3Saf
5bf0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
5c00: 28 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a  (db) );..  for(j
5c10: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
5c20: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
5c30: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  pBt = db->aDb[j]
5c40: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
5c50: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
5c60: 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29  eIsInBackup(pBt)
5c70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5c80: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
5c90: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
5ca0: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c     "unable to cl
5cb0: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
5cc0: 69 73 68 65 64 20 62 61 63 6b 75 70 20 6f 70 65  ished backup ope
5cd0: 72 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ration");.      
5ce0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5cf0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
5d00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5d10: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
5d20: 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
5d30: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
5d40: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
5d50: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
5d60: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
5d70: 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  (db);..  for(j=0
5d80: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
5d90: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
5da0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
5db0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [j];.    if( pDb
5dc0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73  ->pBt ){.      s
5dd0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
5de0: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
5df0: 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a    pDb->pBt = 0;.
5e00: 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29        if( j!=1 )
5e10: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70  {.        pDb->p
5e20: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
5e30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5e40: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
5e50: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d  rnalSchema(db, -
5e60: 31 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74  1);..  /* Tell t
5e70: 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66  he code in notif
5e80: 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e  y.c that the con
5e90: 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65  nection no longe
5ea0: 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a  r holds any.  **
5eb0: 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20   locks and does 
5ec0: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
5ed0: 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e  further unlock-n
5ee0: 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
5ef0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
5f00: 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28  onnectionClosed(
5f10: 64 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  db);..  assert( 
5f20: 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20  db->nDb<=2 );.  
5f30: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d  assert( db->aDb=
5f40: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
5f50: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41  ;.  for(j=0; j<A
5f60: 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75  rraySize(db->aFu
5f70: 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nc.a); j++){.   
5f80: 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c   FuncDef *pNext,
5f90: 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20   *pHash, *p;.   
5fa0: 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63   for(p=db->aFunc
5fb0: 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73  .a[j]; p; p=pHas
5fc0: 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20  h){.      pHash 
5fd0: 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20  = p->pHash;.    
5fe0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
5ff0: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65        functionDe
6000: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20  stroy(db, p);.  
6010: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
6020: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
6030: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6040: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  , p);.        p 
6050: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
6060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
6070: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
6080: 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  st(&db->aCollSeq
6090: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
60a0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
60b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
60c0: 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69   (CollSeq *)sqli
60d0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
60e0: 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79     /* Invoke any
60f0: 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67   destructors reg
6100: 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c  istered for coll
6110: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
6120: 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  ser data. */.   
6130: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
6140: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
6150: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a  Coll[j].xDel ){.
6160: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d          pColl[j]
6170: 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70  .xDel(pColl[j].p
6180: 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  User);.      }. 
6190: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
61a0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c  DbFree(db, pColl
61b0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
61c0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
61d0: 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
61e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
61f0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72  RTUALTABLE.  for
6200: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
6210: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
6220: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
6230: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d  hNext(i)){.    M
6240: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
6250: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
6260: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
6270: 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f  f( pMod->xDestro
6280: 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d  y ){.      pMod-
6290: 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e  >xDestroy(pMod->
62a0: 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pAux);.    }.   
62b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
62c0: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20  b, pMod);.  }.  
62d0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
62e0: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
62f0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
6300: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
6310: 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61  E_OK, 0); /* Dea
6320: 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63  llocates any cac
6330: 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67  hed error string
6340: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  s. */.  if( db->
6350: 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  pErr ){.    sqli
6360: 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d  te3ValueFree(db-
6370: 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71  >pErr);.  }.  sq
6380: 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73  lite3CloseExtens
6390: 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d  ions(db);..  db-
63a0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
63b0: 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20  MAGIC_ERROR;..  
63c0: 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61  /* The temp-data
63d0: 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61  base schema is a
63e0: 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65  llocated differe
63f0: 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74  ntly from the ot
6400: 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20  her schema.  ** 
6410: 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73  objects (using s
6420: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69  qliteMalloc() di
6430: 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
6440: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  of sqlite3BtreeS
6450: 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53  chema())..  ** S
6460: 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
6470: 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64   freed here. Tod
6480: 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20  o: Why not roll 
6490: 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20  the temp schema 
64a0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61  into.  ** the sa
64b0: 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  me sqliteMalloc(
64c0: 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61  ) as the one tha
64d0: 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20  t allocates the 
64e0: 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73  database .  ** s
64f0: 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20  tructure?.  */. 
6500: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6510: 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  b, db->aDb[1].pS
6520: 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65  chema);.  sqlite
6530: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6540: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
6550: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
6560: 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73  AGIC_CLOSED;.  s
6570: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
6580: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
6590: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
65a0: 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b  aside.nOut==0 );
65b0: 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20    /* Fails on a 
65c0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
65d0: 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64   leak */.  if( d
65e0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
65f0: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6600: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6610: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6620: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6630: 66 72 65 65 28 64 62 29 3b 0a 20 20 72 65 74 75  free(db);.  retu
6640: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6650: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
6660: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
6670: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
6680: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73  te3RollbackAll(s
6690: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
66a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72  nt i;.  int inTr
66b0: 61 6e 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ans = 0;.  asser
66c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
66d0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
66e0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
66f0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
6700: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
6710: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
6720: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
6730: 2e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66  .pBt ){.      if
6740: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
6750: 49 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b  InTrans(db->aDb[
6760: 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 20  i].pBt) ){.     
6770: 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a     inTrans = 1;.
6780: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
6790: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
67a0: 63 6b 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  ck(db->aDb[i].pB
67b0: 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  t);.      db->aD
67c0: 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30  b[i].inTrans = 0
67d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
67e0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
67f0: 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  k(db);.  sqlite3
6800: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
6810: 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  );..  if( db->fl
6820: 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72  ags&SQLITE_Inter
6830: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
6840: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
6850: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
6860: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
6870: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
6880: 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 7d  ema(db, -1);.  }
6890: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
68a0: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
68b0: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
68c0: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
68d0: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
68e0: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 0a 20  rredCons = 0;.. 
68f0: 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62   /* If one has b
6900: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
6910: 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62  invoke the rollb
6920: 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ack-hook callbac
6930: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78  k */.  if( db->x
6940: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
6950: 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20   && (inTrans || 
6960: 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29  !db->autoCommit)
6970: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c   ){.    db->xRol
6980: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62  lbackCallback(db
6990: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b  ->pRollbackArg);
69a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
69b0: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
69c0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
69d0: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
69e0: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
69f0: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
6a00: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
6a10: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
6a20: 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74  (int rc){.  stat
6a30: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63  ic const char* c
6a40: 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a  onst aMsg[] = {.
6a50: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b      /* SQLITE_OK
6a60: 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f            */ "no
6a70: 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20  t an error",.   
6a80: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52   /* SQLITE_ERROR
6a90: 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c         */ "SQL l
6aa0: 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69  ogic error or mi
6ab0: 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c  ssing database",
6ac0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
6ad0: 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c  NTERNAL    */ 0,
6ae0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
6af0: 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61  ERM        */ "a
6b00: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
6b10: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
6b20: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20   SQLITE_ABORT   
6b30: 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b      */ "callback
6b40: 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79   requested query
6b50: 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20   abort",.    /* 
6b60: 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20  SQLITE_BUSY     
6b70: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
6b80: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
6b90: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  /* SQLITE_LOCKED
6ba0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
6bb0: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
6bc0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
6bd0: 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a  TE_NOMEM       *
6be0: 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  / "out of memory
6bf0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6c00: 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20  _READONLY    */ 
6c10: 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74  "attempt to writ
6c20: 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74  e a readonly dat
6c30: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
6c40: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
6c50: 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65    */ "interrupte
6c60: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
6c70: 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f  E_IOERR       */
6c80: 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72   "disk I/O error
6c90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6ca0: 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20  _CORRUPT     */ 
6cb0: 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69  "database disk i
6cc0: 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65  mage is malforme
6cd0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
6ce0: 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f  E_NOTFOUND    */
6cf0: 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74   "unknown operat
6d00: 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ion",.    /* SQL
6d10: 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  ITE_FULL        
6d20: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20  */ "database or 
6d30: 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20  disk is full",. 
6d40: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e     /* SQLITE_CAN
6d50: 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61  TOPEN    */ "una
6d60: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
6d70: 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20  base file",.    
6d80: 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  /* SQLITE_PROTOC
6d90: 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e  OL    */ "lockin
6da0: 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20  g protocol",.   
6db0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59   /* SQLITE_EMPTY
6dc0: 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65         */ "table
6dd0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
6de0: 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  a",.    /* SQLIT
6df0: 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f  E_SCHEMA      */
6e00: 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d   "database schem
6e10: 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a  a has changed",.
6e20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f      /* SQLITE_TO
6e30: 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74  OBIG      */ "st
6e40: 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f  ring or blob too
6e50: 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51   big",.    /* SQ
6e60: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
6e70: 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20   */ "constraint 
6e80: 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  failed",.    /* 
6e90: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20  SQLITE_MISMATCH 
6ea0: 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20     */ "datatype 
6eb0: 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f  mismatch",.    /
6ec0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  * SQLITE_MISUSE 
6ed0: 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79       */ "library
6ee0: 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20   routine called 
6ef0: 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22  out of sequence"
6f00: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6f10: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
6f20: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
6f30: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
6f40: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
6f50: 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61  UTH        */ "a
6f60: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e  uthorization den
6f70: 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ied",.    /* SQL
6f80: 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20  ITE_FORMAT      
6f90: 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61  */ "auxiliary da
6fa0: 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72  tabase format er
6fb0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
6fc0: 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20  ITE_RANGE       
6fd0: 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75  */ "bind or colu
6fe0: 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  mn index out of 
6ff0: 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53  range",.    /* S
7000: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20  QLITE_NOTADB    
7010: 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e    */ "file is en
7020: 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f  crypted or is no
7030: 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20  t a database",. 
7040: 20 7d 3b 0a 20 20 72 63 20 26 3d 20 30 78 66 66   };.  rc &= 0xff
7050: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 72  ;.  if( ALWAYS(r
7060: 63 3e 3d 30 29 20 26 26 20 72 63 3c 28 69 6e 74  c>=0) && rc<(int
7070: 29 28 73 69 7a 65 6f 66 28 61 4d 73 67 29 2f 73  )(sizeof(aMsg)/s
7080: 69 7a 65 6f 66 28 61 4d 73 67 5b 30 5d 29 29 20  izeof(aMsg[0])) 
7090: 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29  && aMsg[rc]!=0 )
70a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 4d 73  {.    return aMs
70b0: 67 5b 72 63 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g[rc];.  }else{.
70c0: 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 6b 6e      return "unkn
70d0: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 7d 0a  own error";.  }.
70e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
70f0: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
7100: 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b   a busy callback
7110: 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64   that sleeps and
7120: 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20   tries.** again 
7130: 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20  until a timeout 
7140: 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64  value is reached
7150: 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76  .  The timeout v
7160: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  alue is.** an in
7170: 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
7180: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73  milliseconds pas
7190: 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69  sed in as the fi
71a0: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  rst.** argument.
71b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
71c0: 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79  qliteDefaultBusy
71d0: 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20  Callback(. void 
71e0: 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  *ptr,           
71f0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7200: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69  connection */. i
7210: 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20  nt count        
7220: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7230: 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65  r of times table
7240: 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a   has been busy *
7250: 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.){.#if SQLITE_
7260: 4f 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e  OS_WIN || (defin
7270: 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
7280: 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a  && HAVE_USLEEP).
7290: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
72a0: 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20  8 delays[] =.   
72b0: 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c    { 1, 2, 5, 10,
72c0: 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c   15, 20, 25, 25,
72d0: 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20    25,  50,  50, 
72e0: 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  100 };.  static 
72f0: 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b  const u8 totals[
7300: 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c  ] =.     { 0, 1,
7310: 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20   3,  8, 18, 33, 
7320: 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38  53, 78, 103, 128
7330: 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20  , 178, 228 };.# 
7340: 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72  define NDELAY Ar
7350: 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a  raySize(delays).
7360: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7370: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a  (sqlite3 *)ptr;.
7380: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20    int timeout = 
7390: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  db->busyTimeout;
73a0: 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72  .  int delay, pr
73b0: 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ior;..  assert( 
73c0: 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66  count>=0 );.  if
73d0: 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59  ( count < NDELAY
73e0: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
73f0: 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20  delays[count];. 
7400: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
7410: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73  s[count];.  }els
7420: 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  e{.    delay = d
7430: 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b  elays[NDELAY-1];
7440: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
7450: 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20  als[NDELAY-1] + 
7460: 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44  delay*(count-(ND
7470: 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  ELAY-1));.  }.  
7480: 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61  if( prior + dela
7490: 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  y > timeout ){. 
74a0: 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f     delay = timeo
74b0: 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20  ut - prior;.    
74c0: 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72  if( delay<=0 ) r
74d0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
74e0: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
74f0: 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30  ->pVfs, delay*10
7500: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
7510: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
7520: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
7530: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
7540: 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33  eout = ((sqlite3
7550: 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d   *)ptr)->busyTim
7560: 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75  eout;.  if( (cou
7570: 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d  nt+1)*1000 > tim
7580: 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  eout ){.    retu
7590: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
75a0: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
75b0: 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20  Vfs, 1000000);. 
75c0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
75d0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  f.}../*.** Invok
75e0: 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79  e the given busy
75f0: 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   handler..**.** 
7600: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
7610: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f  called when an o
7620: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20  peration failed 
7630: 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20  with a lock..** 
7640: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
7650: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
7660: 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65  , the lock is re
7670: 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  tried.  If it.**
7680: 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20   returns 0, the 
7690: 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73  operation aborts
76a0: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
76b0: 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  BUSY error..*/.i
76c0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  nt sqlite3Invoke
76d0: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79  BusyHandler(Busy
76e0: 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69  Handler *p){.  i
76f0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56  nt rc;.  if( NEV
7700: 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78  ER(p==0) || p->x
7710: 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42  Func==0 || p->nB
7720: 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30  usy<0 ) return 0
7730: 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e  ;.  rc = p->xFun
7740: 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42  c(p->pArg, p->nB
7750: 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  usy);.  if( rc==
7760: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  0 ){.    p->nBus
7770: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
7780: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b  .    p->nBusy++;
7790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
77a0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ; .}../*.** This
77b0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
77c0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
77d0: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
77e0: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
77f0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
7800: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
7810: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
7820: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7830: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20  _busy_handler(. 
7840: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
7850: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
7860: 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  d*,int),.  void 
7870: 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74  *pArg.){.  sqlit
7880: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
7890: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
78a0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75  >busyHandler.xFu
78b0: 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62  nc = xBusy;.  db
78c0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41  ->busyHandler.pA
78d0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d  rg = pArg;.  db-
78e0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75  >busyHandler.nBu
78f0: 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sy = 0;.  sqlite
7900: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
7910: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
7920: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7930: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7940: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
7950: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
7960: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
7970: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
7980: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
7990: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
79a0: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
79b0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
79c0: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
79d0: 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72  ument. The progr
79e0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c  ess callback wil
79f0: 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  l.** be invoked 
7a00: 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64  every nOps opcod
7a10: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
7a20: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
7a30: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
7a40: 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73  *db, .  int nOps
7a50: 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72  ,.  int (*xProgr
7a60: 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20  ess)(void*), .  
7a70: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
7a80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
7a90: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
7aa0: 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a    if( nOps>0 ){.
7ab0: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
7ac0: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
7ad0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
7ae0: 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20  Ops = nOps;.    
7af0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
7b00: 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65   = pArg;.  }else
7b10: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
7b20: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ess = 0;.    db-
7b30: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
7b40: 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  0;.    db->pProg
7b50: 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d  ressArg = 0;.  }
7b60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7b70: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
7b80: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
7b90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7ba0: 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61   installs a defa
7bb0: 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ult busy handler
7bc0: 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20   that waits for 
7bd0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
7be0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
7bf0: 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72  seconds before r
7c00: 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69  eturning 0..*/.i
7c10: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
7c20: 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20  timeout(sqlite3 
7c30: 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20  *db, int ms){.  
7c40: 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20  if( ms>0 ){.    
7c50: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
7c60: 3d 20 6d 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  = ms;.    sqlite
7c70: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
7c80: 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  b, sqliteDefault
7c90: 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76  BusyCallback, (v
7ca0: 6f 69 64 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73  oid*)db);.  }els
7cb0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  e{.    sqlite3_b
7cc0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
7cd0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
7ce0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7cf0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e  ../*.** Cause an
7d00: 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74  y pending operat
7d10: 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69  ion to stop at i
7d20: 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f  ts earliest oppo
7d30: 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  rtunity..*/.void
7d40: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
7d50: 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  pt(sqlite3 *db){
7d60: 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  .  db->u1.isInte
7d70: 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a  rrupted = 1;.}..
7d80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
7d90: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
7da0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
7db0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7dc0: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
7dd0: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
7de0: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
7df0: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
7e00: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
7e10: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
7e20: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
7e30: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
7e40: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
7e50: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
7e60: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7e70: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
7e80: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
7e90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
7ea0: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
7eb0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
7ec0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
7ed0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
7ee0: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
7ef0: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
7f00: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
7f10: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7f20: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
7f30: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
7f40: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
7f50: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
7f60: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
7f70: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
7f80: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
7f90: 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72  t*),.  FuncDestr
7fa0: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
7fb0: 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  or.){.  FuncDef 
7fc0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
7fd0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7fe0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
7ff0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
8000: 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  f( zFunctionName
8010: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46  ==0 ||.      (xF
8020: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c  unc && (xFinal |
8030: 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20  | xStep)) || .  
8040: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
8050: 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70  xFinal && !xStep
8060: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46  )) ||.      (!xF
8070: 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20  unc && (!xFinal 
8080: 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  && xStep)) ||.  
8090: 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20      (nArg<-1 || 
80a0: 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  nArg>SQLITE_MAX_
80b0: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c  FUNCTION_ARG) ||
80c0: 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61  .      (255<(nNa
80d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
80e0: 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e  en30( zFunctionN
80f0: 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65  ame))) ){.    re
8100: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
8110: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a  SE_BKPT;.  }.  .
8120: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8130: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49  MIT_UTF16.  /* I
8140: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
8150: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
8160: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
8170: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
8180: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
8190: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
81a0: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
81b0: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
81c0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
81d0: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
81e0: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
81f0: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
8200: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49   **.  ** If SQLI
8210: 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66  TE_ANY is specif
8220: 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76  ied, add three v
8230: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  ersions of the f
8240: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  unction.  ** to 
8250: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  the hash table..
8260: 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d    */.  if( enc==
8270: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a  SQLITE_UTF16 ){.
8280: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
8290: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
82a0: 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53  }else if( enc==S
82b0: 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20  QLITE_ANY ){.   
82c0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
82d0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
82e0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
82f0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
8300: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
8310: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
8320: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
8330: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
8340: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
8350: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8360: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
8370: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
8380: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
8390: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
83a0: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
83b0: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
83c0: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
83d0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
83e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
83f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
8400: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
8410: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
8420: 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65  _UTF16BE;.  }.#e
8430: 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49  lse.  enc = SQLI
8440: 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a  TE_UTF8;.#endif.
8450: 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
8460: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e   an existing fun
8470: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f  ction is being o
8480: 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c  verridden or del
8490: 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a  eted. If so,.  *
84a0: 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
84b0: 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e  active VMs, then
84c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
84d0: 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69  USY. If a functi
84e0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  on.  ** is being
84f0: 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65   overridden/dele
8500: 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72  ted but there ar
8510: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
8520: 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20   allow the.  ** 
8530: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  operation to con
8540: 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69  tinue but invali
8550: 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70  date all precomp
8560: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
8570: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
8580: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
8590: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
85a0: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
85b0: 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69  (u8)enc, 0);.  i
85c0: 66 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66  f( p && p->iPref
85d0: 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e  Enc==enc && p->n
85e0: 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20  Arg==nArg ){.   
85f0: 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56   if( db->activeV
8600: 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20  dbeCnt ){.      
8610: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
8620: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
8630: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
8640: 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
8650: 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75  user-function du
8660: 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
8670: 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
8680: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
8690: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
86a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
86b0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
86c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
86d0: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
86e0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
86f0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71   }.  }..  p = sq
8700: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
8710: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
8720: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
8730: 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20  , (u8)enc, 1);. 
8740: 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d   assert(p || db-
8750: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a  >mallocFailed);.
8760: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
8770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8780: 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
8790: 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69  f an older versi
87a0: 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  on of the functi
87b0: 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67  on with a config
87c0: 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20  ured destructor 
87d0: 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  is.  ** being re
87e0: 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68  placed invoke th
87f0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e  e destructor fun
8800: 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20  ction here. */. 
8810: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
8820: 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20  (db, p);..  if( 
8830: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
8840: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
8850: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d  nRef++;.  }.  p-
8860: 3e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  >pDestructor = p
8870: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d  Destructor;.  p-
8880: 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d  >flags = 0;.  p-
8890: 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a  >xFunc = xFunc;.
88a0: 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74    p->xStep = xSt
88b0: 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69  ep;.  p->xFinali
88c0: 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70  ze = xFinal;.  p
88d0: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55  ->pUserData = pU
88e0: 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41  serData;.  p->nA
88f0: 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a  rg = (u16)nArg;.
8900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8910: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
8920: 61 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e  ate new user fun
8930: 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ctions..*/.int s
8940: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8950: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
8960: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
8970: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
8980: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
8990: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
89a0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
89b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
89c0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
89d0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
89e0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
89f0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
8a00: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
8a10: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
8a20: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
8a30: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
8a40: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8a50: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e  tion_v2(db, zFun
8a60: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
8a70: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20   xFunc, xStep,. 
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d     xFinal, 0);.}
8ab0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  ..int sqlite3_cr
8ac0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
8ad0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
8ae0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8af0: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
8b00: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
8b10: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
8b20: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
8b30: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
8b40: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
8b50: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
8b60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
8b70: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
8b80: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
8b90: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
8ba0: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
8bb0: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
8bc0: 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  oid *).){.  int 
8bd0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
8be0: 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  R;.  FuncDestruc
8bf0: 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20  tor *pArg = 0;. 
8c00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8c10: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8c20: 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20  .  if( xDestroy 
8c30: 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46  ){.    pArg = (F
8c40: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29  uncDestructor *)
8c50: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
8c60: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46  ero(db, sizeof(F
8c70: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b  uncDestructor));
8c80: 0a 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29  .    if( !pArg )
8c90: 7b 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79  {.      xDestroy
8ca0: 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  (p);.      goto 
8cb0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
8cc0: 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20  Arg->xDestroy = 
8cd0: 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41  xDestroy;.    pA
8ce0: 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20  rg->pUserData = 
8cf0: 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  p;.  }.  rc = sq
8d00: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
8d10: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
8d20: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
8d30: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
8d40: 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67  Arg);.  if( pArg
8d50: 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d   && pArg->nRef==
8d60: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
8d70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8d80: 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70  ;.    xDestroy(p
8d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
8da0: 46 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a  Free(db, pArg);.
8db0: 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20    }.. out:.  rc 
8dc0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
8dd0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
8de0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
8df0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
8e00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
8e10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8e20: 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65  UTF16.int sqlite
8e30: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8e40: 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  n16(.  sqlite3 *
8e50: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db,.  const void
8e60: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
8e70: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
8e80: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76  nt eTextRep,.  v
8e90: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
8ea0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
8eb0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
8ec0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
8ed0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
8ee0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
8ef0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
8f00: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
8f10: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
8f20: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
8f30: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46  t rc;.  char *zF
8f40: 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f  unc8;.  sqlite3_
8f50: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8f60: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
8f70: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
8f80: 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20  led );.  zFunc8 
8f90: 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
8fa0: 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  8(db, zFunctionN
8fb0: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
8fc0: 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
8fd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
8fe0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
8ff0: 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65  8, nArg, eTextRe
9000: 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  p, p, xFunc, xSt
9010: 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20  ep, xFinal,0);. 
9020: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9030: 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63  b, zFunc8);.  rc
9040: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
9050: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
9060: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9070: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9080: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
9090: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  if.../*.** Decla
90a0: 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69  re that a functi
90b0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
90c0: 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74  loaded by a virt
90d0: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
90e0: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
90f0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
9100: 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f  as a regular glo
9110: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  bal function, th
9120: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
9130: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
9140: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
9150: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
9160: 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61  then create.** a
9170: 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c   new one that al
9180: 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75  ways throws a ru
9190: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a  n-time error.  .
91a0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75  **.** When virtu
91b0: 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64  al tables intend
91c0: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f   to provide an o
91d0: 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69  verloaded functi
91e0: 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75  on, they.** shou
91f0: 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ld call this rou
9200: 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  tine to make sur
9210: 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  e the global fun
9220: 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a  ction exists..**
9230: 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69   A global functi
9240: 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e  on must exist in
9250: 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20   order for name 
9260: 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f  resolution to wo
9270: 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a  rk.** properly..
9280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
9290: 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
92a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
92b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
92c0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
92d0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20  .){.  int nName 
92e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
92f0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20  0(zName);.  int 
9300: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9310: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9320: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
9330: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
9340: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
9350: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  zName, nName, nA
9360: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
9370: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   0)==0 ){.    rc
9380: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
9390: 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  Func(db, zName, 
93a0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
93b0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
93c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
93d0: 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46   sqlite3InvalidF
93e0: 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  unction, 0, 0, 0
93f0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
9400: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
9410: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
9420: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
9430: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
9440: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
9450: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
9460: 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  E./*.** Register
9470: 20 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f   a trace functio
9480: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
9490: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
94a0: 20 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63   registered trac
94b0: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
94c0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
94d0: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20   trace function 
94e0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72  means that no tr
94f0: 61 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  acing is execute
9500: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
9510: 2a 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69  * trace is a poi
9520: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
9530: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
9540: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
9550: 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73  of each.** SQL s
9560: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
9570: 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65  d *sqlite3_trace
9580: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
9590: 69 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69  id (*xTrace)(voi
95a0: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c  d*,const char*),
95b0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
95c0: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
95d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
95e0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
95f0: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63  pOld = db->pTrac
9600: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61  eArg;.  db->xTra
9610: 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64  ce = xTrace;.  d
9620: 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
9630: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
9640: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9650: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9660: 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  pOld;.}./*.** Re
9670: 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
9680: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
9690: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
96a0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
96b0: 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
96c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
96d0: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
96e0: 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
96f0: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
9700: 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
9710: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
9720: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
9730: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
9740: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
9750: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
9760: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
9770: 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
9780: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
9790: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
97a0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
97b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
97c0: 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
97d0: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
97e0: 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
97f0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
9800: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
9810: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9820: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9830: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
9840: 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64  pProfileArg;.  d
9850: 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50  b->xProfile = xP
9860: 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50  rofile;.  db->pP
9870: 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67  rofileArg = pArg
9880: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9890: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
98a0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
98b0: 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
98c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
98d0: 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58 50 45 52 49   */../*** EXPERI
98e0: 4d 45 4e 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  MENTAL ***.**.**
98f0: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
9900: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
9910: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
9920: 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a  ction comments..
9930: 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65  ** If the invoke
9940: 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  d function retur
9950: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
9960: 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63  n the commit bec
9970: 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61  omes a.** rollba
9980: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ck..*/.void *sql
9990: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
99a0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
99c0: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
99d0: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
99e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61  e */.  int (*xCa
99f0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
9a00: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
9a10: 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63  invoke on each c
9a20: 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20  ommit */.  void 
9a30: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
9a40: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
9a50: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
9a60: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
9a70: 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Old;.  sqlite3_m
9a80: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9a90: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
9aa0: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a  db->pCommitArg;.
9ab0: 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c    db->xCommitCal
9ac0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
9ad0: 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  k;.  db->pCommit
9ae0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
9af0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9b00: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9b10: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a  return pOld;.}..
9b20: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
9b30: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
9b40: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
9b50: 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74  e a row is updat
9b60: 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20  ed,.** inserted 
9b70: 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  or deleted using
9b80: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
9b90: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
9ba0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61  id *sqlite3_upda
9bb0: 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  te_hook(.  sqlit
9bc0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9bd0: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
9be0: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
9bf0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
9c00: 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
9c10: 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63  void*,int,char c
9c20: 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73  onst *,char cons
9c30: 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34  t *,sqlite_int64
9c40: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c60: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
9c70: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
9c80: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
9c90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
9ca0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
9cb0: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55  .  pRet = db->pU
9cc0: 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e  pdateArg;.  db->
9cd0: 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  xUpdateCallback 
9ce0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
9cf0: 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20  b->pUpdateArg = 
9d00: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
9d10: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
9d20: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
9d30: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
9d40: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
9d50: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
9d60: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
9d70: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
9d80: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74  led.** back by t
9d90: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
9da0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
9db0: 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61   *sqlite3_rollba
9dc0: 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  ck_hook(.  sqlit
9dd0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9de0: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
9df0: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
9e00: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
9e10: 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
9e20: 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62  void*), /* Callb
9e30: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
9e40: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9e60: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
9e70: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
9e80: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
9e90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9ea0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9eb0: 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c  pRet = db->pRoll
9ec0: 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78  backArg;.  db->x
9ed0: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
9ee0: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
9ef0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
9f00: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
9f10: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9f20: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
9f30: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
9f40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9f50: 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  _WAL./*.** The s
9f60: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
9f70: 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  ) callback regis
9f80: 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  tered by sqlite3
9f90: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
9fa0: 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  int()..** Invoke
9fb0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
9fc0: 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e  ckpoint if the n
9fd0: 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
9fe0: 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a  in the log file.
9ff0: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
a000: 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41  an sqlite3.pWalA
a010: 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e  rg cast to an in
a020: 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65  teger (the value
a030: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a   configured by.*
a040: 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  * wal_autocheckp
a050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74  oint())..*/ .int
a060: 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
a070: 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a  ltHook(.  void *
a080: 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20  pClientData,    
a090: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a   /* Argument */.
a0a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
a0b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
a0c0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
a0d0: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
a0e0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a     /* Database *
a0f0: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20  /.  int nFrame  
a100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a110: 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a  ze of WAL */.){.
a120: 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51    if( nFrame>=SQ
a130: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
a140: 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a  pClientData) ){.
a150: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
a160: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a170: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
a180: 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
a190: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
a1a0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
a1b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
a1c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
a1d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
a1e0: 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
a1f0: 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71   Configure an sq
a200: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
a210: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
a220: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
a230: 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62  point.** a datab
a240: 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74  ase after commit
a250: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
a260: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
a270: 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72  nFrame or.** mor
a280: 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  e frames in the 
a290: 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e  log file. Passin
a2a0: 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61  g zero or a nega
a2b0: 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68  tive value as th
a2c0: 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61  e.** nFrame para
a2d0: 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61  meter disables a
a2e0: 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
a2f0: 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  ints entirely..*
a300: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
a310: 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
a320: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
a330: 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74  places any exist
a340: 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ing callback.** 
a350: 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  registered using
a360: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
a370: 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72  k(). Likewise, r
a380: 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c  egistering a cal
a390: 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73  lback.** using s
a3a0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
a3b0: 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  ) disables the a
a3c0: 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
a3d0: 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  int mechanism.**
a3e0: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
a3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
a400: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
a410: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
a420: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
a430: 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66   nFrame){.#ifdef
a440: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
a450: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a460: 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
a470: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61  D_PARAMETER(nFra
a480: 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  me);.#else.  if(
a490: 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20   nFrame>0 ){.   
a4a0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
a4b0: 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c  k(db, sqlite3Wal
a4c0: 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c  DefaultHook, SQL
a4d0: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
a4e0: 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  Frame));.  }else
a4f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
a500: 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29  l_hook(db, 0, 0)
a510: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
a520: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
a540: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
a550: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
a560: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
a570: 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ion is written.*
a580: 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65  * into the write
a590: 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68  -ahead-log by th
a5a0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
a5b0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
a5c0: 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f  *sqlite3_wal_hoo
a5d0: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
a5e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a5f0: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
a600: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
a610: 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
a620: 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  nt(*xCallback)(v
a630: 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  oid *, sqlite3*,
a640: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
a650: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a670: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
a680: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
a690: 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
a6a0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
a6b0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f  TE_OMIT_WAL.  vo
a6c0: 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
a6d0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
a6e0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
a6f0: 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67  et = db->pWalArg
a700: 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c  ;.  db->xWalCall
a710: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
a720: 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20  ;.  db->pWalArg 
a730: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
a740: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
a750: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
a760: 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20  rn pRet;.#else. 
a770: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
a780: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  f.}../*.** Check
a790: 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
a7a0: 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  Db..*/.int sqlit
a7b0: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
a7c0: 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  t_v2(.  sqlite3 
a7d0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
a7e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a7f0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
a800: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63  /* Name of attac
a830: 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72  hed database (or
a840: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20   NULL) */.  int 
a850: 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  eMode,          
a860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a870: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
a880: 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  _* value */.  in
a890: 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20  t *pnLog,       
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a8b0: 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41   OUT: Size of WA
a8c0: 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20  L log in frames 
a8d0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74  */.  int *pnCkpt
a8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8f0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74       /* OUT: Tot
a900: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  al number of fra
a910: 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  mes checkpointed
a920: 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51   */.){.#ifdef SQ
a930: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
a940: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a950: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
a960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
a980: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
a990: 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d  t iDb = SQLITE_M
a9a0: 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a  AX_ATTACHED;  /*
a9b0: 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69   sqlite3.aDb[] i
a9c0: 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68  ndex of db to ch
a9d0: 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f  eckpoint */..  /
a9e0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
a9f0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
aa00: 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20  s to -1 in case 
aa10: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
aa20: 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20   */.  if( pnLog 
aa30: 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20  ) *pnLog = -1;. 
aa40: 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70   if( pnCkpt ) *p
aa50: 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61  nCkpt = -1;..  a
aa60: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
aa70: 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51  ECKPOINT_FULL>SQ
aa80: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
aa90: 50 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73  PASSIVE );.  ass
aaa0: 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
aab0: 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49  KPOINT_FULL<SQLI
aac0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
aad0: 53 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72  START );.  asser
aae0: 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
aaf0: 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d  OINT_PASSIVE+2==
ab00: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
ab10: 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69  T_RESTART );.  i
ab20: 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f  f( eMode<SQLITE_
ab30: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
ab40: 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49  VE || eMode>SQLI
ab50: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
ab60: 53 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74  START ){.    ret
ab70: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
ab80: 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  E;.  }..  sqlite
ab90: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
aba0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
abb0: 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b  zDb && zDb[0] ){
abc0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
abd0: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
abe0: 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28   zDb);.  }.  if(
abf0: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63   iDb<0 ){.    rc
ac00: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
ac10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
ac20: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52  r(db, SQLITE_ERR
ac30: 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  OR, "unknown dat
ac40: 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29  abase: %s", zDb)
ac50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
ac60: 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b  c = sqlite3Check
ac70: 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65  point(db, iDb, e
ac80: 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
ac90: 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  kpt);.    sqlite
aca0: 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
acb0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
acc0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
acd0: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
ace0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
acf0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
ad00: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
ad10: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
ad20: 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49   database zDb. I
ad30: 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f  f zDb is NULL, o
ad40: 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  r if the buffer 
ad50: 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zDb points.** to
ad60: 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f   contains a zero
ad70: 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20  -length string, 
ad80: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
ad90: 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63  abases are .** c
ada0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a  heckpointed..*/.
adb0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
adc0: 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
add0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
ade0: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75  ar *zDb){.  retu
adf0: 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
ae00: 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
ae10: 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45   zDb, SQLITE_CHE
ae20: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
ae30: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64   0, 0);.}..#ifnd
ae40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
ae50: 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63  AL./*.** Run a c
ae60: 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74  heckpoint on dat
ae70: 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20  abase iDb. This 
ae80: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61  is a no-op if da
ae90: 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a  tabase iDb is.**
aea0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f   not currently o
aeb0: 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  pen in WAL mode.
aec0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
aed0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
aee0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
aef0: 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
af00: 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ed, this .** fun
af10: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
af20: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  LITE_LOCKED and 
af30: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  a checkpoint is 
af40: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49  not attempted. I
af50: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  f .** an error o
af60: 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e  ccurs while runn
af70: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ing the checkpoi
af80: 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  nt, an SQLite er
af90: 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
afa0: 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53  returned (i.e. S
afb0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74  QLITE_IOERR). Ot
afc0: 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
afd0: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  OK..**.** The mu
afe0: 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
aff0: 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64  handle db should
b000: 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20   be held by the 
b010: 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65  caller. The mute
b020: 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  x.** associated 
b030: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
b040: 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63  c b-tree being c
b050: 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74  heckpointed is t
b060: 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20  aken by.** this 
b070: 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74  function while t
b080: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73  he checkpoint is
b090: 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   running..**.** 
b0a0: 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64  If iDb is passed
b0b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
b0c0: 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61  CHED, then all a
b0d0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
b0e0: 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f  s are.** checkpo
b0f0: 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72  inted. If an err
b100: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
b110: 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  d it is returned
b120: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a   immediately -.*
b130: 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20  * no attempt is 
b140: 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69  made to checkpoi
b150: 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67  nt any remaining
b160: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
b170: 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  * Parameter eMod
b180: 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49  e is one of SQLI
b190: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
b1a0: 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52  SSIVE, FULL or R
b1b0: 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73  ESTART..*/.int s
b1c0: 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
b1d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
b1e0: 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65  t iDb, int eMode
b1f0: 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e  , int *pnLog, in
b200: 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e  t *pnCkpt){.  in
b210: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b230: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
b240: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
b270: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74  rate through att
b280: 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69  ached dbs */.  i
b290: 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20  nt bBusy = 0;   
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b2b0: 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45  * True if SQLITE
b2c0: 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65  _BUSY has been e
b2d0: 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20  ncountered */.. 
b2e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b2f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
b300: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
b310: 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70  rt( !pnLog || *p
b320: 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73  nLog==-1 );.  as
b330: 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c  sert( !pnCkpt ||
b340: 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a   *pnCkpt==-1 );.
b350: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
b360: 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c  ->nDb && rc==SQL
b370: 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
b380: 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20    if( i==iDb || 
b390: 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  iDb==SQLITE_MAX_
b3a0: 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20  ATTACHED ){.    
b3b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
b3c0: 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  reeCheckpoint(db
b3d0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d  ->aDb[i].pBt, eM
b3e0: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
b3f0: 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67  pt);.      pnLog
b400: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b   = 0;.      pnCk
b410: 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  pt = 0;.      if
b420: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
b430: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75  Y ){.        bBu
b440: 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sy = 1;.        
b450: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b460: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b470: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
b480: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42  =SQLITE_OK && bB
b490: 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55  usy) ? SQLITE_BU
b4a0: 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  SY : rc;.}.#endi
b4b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
b4c0: 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  _WAL */../*.** T
b4d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
b4e0: 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69  urns true if mai
b4f0: 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20  n-memory should 
b500: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
b510: 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  of.** a temporar
b520: 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73  y file for trans
b530: 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73  ient pager files
b540: 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a   and statement j
b550: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20  ournals..** The 
b560: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64  value returned d
b570: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
b580: 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f  lue of db->temp_
b590: 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a  store (runtime.*
b5a0: 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64  * parameter) and
b5b0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d   the compile tim
b5c0: 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
b5d0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68  E_TEMP_STORE. Th
b5e0: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  e.** following t
b5f0: 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
b600: 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
b610: 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77  between these tw
b620: 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20  o values.** and 
b630: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72  this functions r
b640: 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  eturn value..**.
b650: 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50  **   SQLITE_TEMP
b660: 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74  _STORE     db->t
b670: 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f  emp_store     Lo
b680: 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72  cation of tempor
b690: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
b6a0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
b6b0: 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
b6c0: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
b6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
b710: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
b720: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
b730: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
b740: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
b750: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
b760: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
b770: 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
b780: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
b7a0: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
b7b0: 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  1).**   1       
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
b7f0: 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
b820: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
b830: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
b860: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
b870: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
b880: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
b890: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
b8a0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
b8b0: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
b8c0: 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20  *   3           
b8d0: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
b8f0: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
b900: 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
b910: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e  TempInMemory(con
b920: 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  st sqlite3 *db){
b930: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
b940: 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75  _STORE==1.  retu
b950: 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
b960: 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ore==2 );.#endif
b970: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
b980: 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75  _STORE==2.  retu
b990: 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
b9a0: 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66  ore!=1 );.#endif
b9b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
b9c0: 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75  _STORE==3.  retu
b9d0: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66  rn 1;.#endif.#if
b9e0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
b9f0: 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54  RE<1 || SQLITE_T
ba00: 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65  EMP_STORE>3.  re
ba10: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
ba20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  ../*.** Return U
ba30: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67  TF-8 encoded Eng
ba40: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
ba50: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
ba60: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
ba70: 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
ba80: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
ba90: 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62  rmsg(sqlite3 *db
baa0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
bab0: 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
bac0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
bad0: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
bae0: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69  _NOMEM);.  }.  i
baf0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
bb00: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
bb10: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
bb20: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
bb30: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
bb40: 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  T);.  }.  sqlite
bb50: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
bb60: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
bb70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bb80: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69   ){.    z = sqli
bb90: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
bba0: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65  _NOMEM);.  }else
bbb0: 7b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a  {.    z = (char*
bbc0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
bbd0: 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ext(db->pErr);. 
bbe0: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
bbf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
bc00: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
bc10: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
bc20: 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
bc30: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
bc40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bc50: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
bc60: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
bc70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bc80: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
bc90: 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65   Return UTF-16 e
bca0: 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
bcb0: 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
bcc0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
bcd0: 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
bce0: 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
bcf0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
bd00: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
bd10: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
bd20: 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b  6 outOfMem[] = {
bd30: 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27  .    'o', 'u', '
bd40: 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66  t', ' ', 'o', 'f
bd50: 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27  ', ' ', 'm', 'e'
bd60: 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c  , 'm', 'o', 'r',
bd70: 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73   'y', 0.  };.  s
bd80: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
bd90: 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20  misuse[] = {.   
bda0: 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20   'l', 'i', 'b', 
bdb0: 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27  'r', 'a', 'r', '
bdc0: 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72  y', ' ', .    'r
bdd0: 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27  ', 'o', 'u', 't'
bde0: 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c  , 'i', 'n', 'e',
bdf0: 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20   ' ', .    'c', 
be00: 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27  'a', 'l', 'l', '
be10: 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20  e', 'd', ' ', . 
be20: 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
be30: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
be40: 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'f', ' ', .    
be50: 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27  's', 'e', 'q', '
be60: 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63  u', 'e', 'n', 'c
be70: 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a  ', 'e', 0.  };..
be80: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b    const void *z;
be90: 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
bea0: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
beb0: 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20  )outOfMem;.  }. 
bec0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
bed0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
bee0: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
bef0: 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73  rn (void *)misus
bf00: 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
bf10: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
bf20: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
bf30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
bf40: 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64  ){.    z = (void
bf50: 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d   *)outOfMem;.  }
bf60: 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71  else{.    z = sq
bf70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
bf80: 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
bf90: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
bfa0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
bfb0: 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
bfc0: 20 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53   -1, sqlite3ErrS
bfd0: 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c  tr(db->errCode),
bfe0: 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  .           SQLI
bff0: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
c000: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a  STATIC);.      z
c010: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
c020: 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
c030: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
c040: 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68  A malloc() may h
c050: 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69  ave failed withi
c060: 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  n the call to sq
c070: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
c080: 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  16().    ** abov
c090: 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
c0a0: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
c0b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c0c0: 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a  d flag needs to.
c0d0: 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65      ** be cleare
c0e0: 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
c0f0: 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65  ng. Do this dire
c100: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
c110: 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69   via.    ** sqli
c120: 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f  te3ApiExit(), to
c130: 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74   avoid setting t
c140: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
c150: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
c160: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d  ..    */.    db-
c170: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
c180: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
c190: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
c1a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
c1b0: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
c1c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
c1d0: 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  16 */../*.** Ret
c1e0: 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
c1f0: 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67  ent error code g
c200: 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53  enerated by an S
c210: 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49  QLite routine. I
c220: 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73  f NULL is.** pas
c230: 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
c240: 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20  tion, we assume 
c250: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  a malloc() faile
c260: 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  d during sqlite3
c270: 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _open()..*/.int 
c280: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
c290: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
c2a0: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
c2b0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
c2c0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
c2d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
c2e0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
c2f0: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
c300: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c310: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c320: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c330: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
c340: 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  de & db->errMask
c350: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
c360: 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
c370: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
c380: 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
c390: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
c3a0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
c3b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c3c0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
c3d0: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
c3e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c3f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c400: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
c410: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
c420: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ode;.}../*.** Cr
c430: 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61  eate a new colla
c440: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
c450: 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e  r database "db".
c460: 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e    The name is zN
c470: 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65  ame.** and the e
c480: 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a  ncoding is enc..
c490: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
c4a0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eateCollation(. 
c4b0: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20   sqlite3* db,.  
c4c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
c4d0: 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  e, .  u8 enc,.  
c4e0: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
c4f0: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
c500: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
c510: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
c520: 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
c530: 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43  l)(void*).){.  C
c540: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
c550: 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74   int enc2;.  int
c560: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
c570: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
c580: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
c590: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
c5a0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
c5b0: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
c5c0: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
c5d0: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
c5e0: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
c5f0: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
c600: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
c610: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
c620: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
c630: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
c640: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
c650: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
c660: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
c670: 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32  lly..  */.  enc2
c680: 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61   = enc;.  testca
c690: 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
c6a0: 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74  _UTF16 );.  test
c6b0: 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
c6c0: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
c6d0: 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d   );.  if( enc2==
c6e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20  SQLITE_UTF16 || 
c6f0: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
c700: 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20  16_ALIGNED ){.  
c710: 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f    enc2 = SQLITE_
c720: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
c730: 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49  .  if( enc2<SQLI
c740: 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e  TE_UTF8 || enc2>
c750: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
c760: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c770: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
c780: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
c790: 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   if this call is
c7a0: 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70   removing or rep
c7b0: 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69  lacing an existi
c7c0: 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20  ng collation .  
c7d0: 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20  ** sequence. If 
c7e0: 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  so, and there ar
c7f0: 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65  e active VMs, re
c800: 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68  turn busy. If th
c810: 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20  ere.  ** are no 
c820: 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61  active VMs, inva
c830: 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63  lidate any pre-c
c840: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
c850: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c  ts..  */.  pColl
c860: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
c870: 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
c880: 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  c2, zName, 0);. 
c890: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
c8a0: 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
c8b0: 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56   if( db->activeV
c8c0: 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20  dbeCnt ){.      
c8d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
c8e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
c8f0: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
c900: 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
c910: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c920: 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  ce due to active
c930: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
c940: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c950: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
c960: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
c970: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
c980: 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  ts(db);..    /* 
c990: 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  If collation seq
c9a0: 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20  uence pColl was 
c9b0: 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79  created directly
c9c0: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20   by a call to.  
c9d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65    ** sqlite3_cre
c9e0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61  ate_collation, a
c9f0: 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64  nd not generated
ca00: 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
ca10: 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  (),.    ** then 
ca20: 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20  any copies made 
ca30: 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
ca40: 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76  ) need to be inv
ca50: 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a  alidated..    **
ca60: 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e   Also, collation
ca70: 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f   destructor - Co
ca80: 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66  llSeq.xDel() - f
ca90: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64  unction may need
caa0: 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61  .    ** to be ca
cab0: 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  lled..    */ .  
cac0: 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e    if( (pColl->en
cad0: 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31  c & ~SQLITE_UTF1
cae0: 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32  6_ALIGNED)==enc2
caf0: 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
cb00: 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *aColl = sqlit
cb10: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
cb20: 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c  aCollSeq, zName,
cb30: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69   nName);.      i
cb40: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
cb50: 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a  j=0; j<3; j++){.
cb60: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
cb70: 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a  *p = &aColl[j];.
cb80: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
cb90: 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
cba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
cbb0: 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20  p->xDel ){.     
cbc0: 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70         p->xDel(p
cbd0: 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20  ->pUser);.      
cbe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
cbf0: 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20  p->xCmp = 0;.   
cc00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
cc10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c     }.  }..  pCol
cc20: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
cc30: 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
cc40: 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a  nc2, zName, 1);.
cc50: 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
cc60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
cc70: 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  OMEM;.  pColl->x
cc80: 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a  Cmp = xCompare;.
cc90: 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d    pColl->pUser =
cca0: 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   pCtx;.  pColl->
ccb0: 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70  xDel = xDel;.  p
ccc0: 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29  Coll->enc = (u8)
ccd0: 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53  (enc2 | (enc & S
cce0: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
ccf0: 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  NED));.  sqlite3
cd00: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
cd10: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  _OK, 0);.  retur
cd20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cd30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61  ./*.** This arra
cd40: 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75  y defines hard u
cd50: 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c  pper bounds on l
cd60: 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68  imit values.  Th
cd70: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72  e.** initializer
cd80: 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e   must be kept in
cd90: 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53   sync with the S
cda0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a  QLITE_LIMIT_*.**
cdb0: 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c   #defines in sql
cdc0: 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69  ite3.h..*/.stati
cdd0: 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72  c const int aHar
cde0: 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53  dLimit[] = {.  S
cdf0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
ce00: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ,.  SQLITE_MAX_S
ce10: 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  QL_LENGTH,.  SQL
ce20: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a  ITE_MAX_COLUMN,.
ce30: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50    SQLITE_MAX_EXP
ce40: 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54  R_DEPTH,.  SQLIT
ce50: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
ce60: 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f  ELECT,.  SQLITE_
ce70: 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53  MAX_VDBE_OP,.  S
ce80: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
ce90: 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45  ON_ARG,.  SQLITE
cea0: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20  _MAX_ATTACHED,. 
ceb0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
cec0: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c  _PATTERN_LENGTH,
ced0: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  .  SQLITE_MAX_VA
cee0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20  RIABLE_NUMBER,. 
cef0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
cf00: 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f  GER_DEPTH,.};../
cf10: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
cf20: 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61  he hard limits a
cf30: 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e  re set to reason
cf40: 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23  able values.*/.#
cf50: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  if SQLITE_MAX_LE
cf60: 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
cf70: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
cf80: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
cf90: 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23  ast 100.#endif.#
cfa0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  if SQLITE_MAX_SQ
cfb0: 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  L_LENGTH<100.# e
cfc0: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
cfd0: 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
cfe0: 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a  be at least 100.
cff0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d000: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
d010: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  >SQLITE_MAX_LENG
d020: 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  TH.# error SQLIT
d030: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
d040: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65   must not be gre
d050: 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ater than SQLITE
d060: 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64  _MAX_LENGTH.#end
d070: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
d080: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
d090: 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  T<2.# error SQLI
d0a0: 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
d0b0: 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61  SELECT must be a
d0c0: 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66  t least 2.#endif
d0d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
d0e0: 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72  VDBE_OP<40.# err
d0f0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  or SQLITE_MAX_VD
d100: 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74  BE_OP must be at
d110: 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66   least 40.#endif
d120: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
d130: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c  FUNCTION_ARG<0 |
d140: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  | SQLITE_MAX_FUN
d150: 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23  CTION_ARG>1000.#
d160: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
d170: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d  X_FUNCTION_ARG m
d180: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
d190: 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66   and 1000.#endif
d1a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
d1b0: 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51  ATTACHED<0 || SQ
d1c0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
d1d0: 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  D>62.# error SQL
d1e0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
d1f0: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
d200: 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69 66   0 and 62.#endif
d210: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
d220: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
d230: 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  GTH<1.# error SQ
d240: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
d250: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73  TTERN_LENGTH mus
d260: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
d270: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
d280: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37  E_MAX_COLUMN>327
d290: 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  67.# error SQLIT
d2a0: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73  E_MAX_COLUMN mus
d2b0: 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37  t not exceed 327
d2c0: 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  67.#endif.#if SQ
d2d0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
d2e0: 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72  _DEPTH<1.# error
d2f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
d300: 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62  GER_DEPTH must b
d310: 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
d320: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
d330: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
d340: 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74  a limit.  Report
d350: 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a   the old value..
d360: 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64  ** If an invalid
d370: 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20   limit index is 
d380: 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74  supplied, report
d390: 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20   -1..** Make no 
d3a0: 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c  changes but stil
d3b0: 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64  l report the old
d3c0: 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a   value if the.**
d3d0: 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65   new limit is ne
d3e0: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  gative..**.** A 
d3f0: 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  new lower limit 
d400: 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20  does not shrink 
d410: 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75  existing constru
d420: 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c  cts..** It merel
d430: 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63  y prevents new c
d440: 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65  onstructs that e
d450: 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a  xceed the limit.
d460: 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e  ** from forming.
d470: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d480: 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  limit(sqlite3 *d
d490: 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20  b, int limitId, 
d4a0: 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20  int newLimit){. 
d4b0: 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a   int oldLimit;..
d4c0: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
d4d0: 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
d4e0: 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
d4f0: 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
d500: 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
d510: 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
d520: 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
d530: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
d540: 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
d550: 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
d560: 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
d570: 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
d580: 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
d590: 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
d5a0: 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
d5b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
d5c0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d5d0: 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
d5e0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
d5f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
d600: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d610: 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
d620: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
d630: 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
d640: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d650: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
d660: 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
d670: 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
d680: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d690: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
d6a0: 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
d6b0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
d6c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
d6d0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d6e0: 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
d6f0: 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
d700: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
d710: 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
d720: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d730: 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
d740: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
d750: 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
d760: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d770: 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
d780: 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
d790: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
d7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
d7b0: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d7c0: 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
d7d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
d7e0: 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
d7f0: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d800: 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
d810: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
d850: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
d860: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
d870: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
d880: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
d890: 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
d8a0: 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
d8b0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
d8c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d8d0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d8e0: 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
d8f0: 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
d900: 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
d910: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
d920: 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
d930: 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EPTH==(SQLITE_N_
d940: 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
d950: 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
d960: 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
d970: 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
d980: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
d990: 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
d9a0: 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
d9b0: 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
d9c0: 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
d9d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
d9e0: 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
d9f0: 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
da00: 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
da10: 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
da20: 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
da30: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
da40: 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
da50: 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
da60: 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
da70: 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
da80: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
da90: 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dab0: 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
dac0: 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
dad0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
dae0: 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
daf0: 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
db00: 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
db10: 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
db20: 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
db30: 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
db40: 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
db50: 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
db60: 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
db70: 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
db80: 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
db90: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
dba0: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
dbb0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
dbc0: 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
dbd0: 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
dbe0: 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
dbf0: 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
dc00: 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
dc10: 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
dc20: 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
dc30: 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
dc40: 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
dc50: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
dc60: 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
dc70: 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
dc80: 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
dc90: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
dca0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
dcb0: 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
dcc0: 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
dcd0: 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
dce0: 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
dcf0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
dd00: 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
dd10: 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
dd20: 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
dd30: 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
dd40: 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
dd50: 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
dd60: 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
dd70: 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
dd80: 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
dd90: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
dda0: 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
ddb0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
ddc0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
ddd0: 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
dde0: 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
ddf0: 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
de00: 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
de10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
de20: 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
de30: 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
de40: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
de50: 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
de60: 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
de70: 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
de80: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
de90: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
dea0: 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
deb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
dec0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
ded0: 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
dee0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
def0: 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
df00: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
df10: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
df20: 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
df30: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
df40: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
df50: 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
df60: 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
df70: 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
df80: 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
df90: 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
dfa0: 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
dfb0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
dfc0: 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
dfd0: 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
dfe0: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
dff0: 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
e000: 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
e010: 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
e020: 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
e030: 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
e040: 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
e050: 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e070: 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
e080: 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
e090: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
e0a0: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
e0b0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
e0c0: 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
e0d0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
e0e0: 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
e0f0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
e100: 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
e110: 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
e140: 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
e150: 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
e160: 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
e170: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
e180: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
e190: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
e1a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
e1b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
e1c0: 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
e1d0: 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
e1e0: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
e1f0: 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
e200: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
e210: 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
e220: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
e230: 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
e240: 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
e250: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
e260: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e270: 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74  EN_URI) || sqlit
e280: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
e290: 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20  OpenUri) .   && 
e2a0: 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d  nUri>=5 && memcm
e2b0: 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c  p(zUri, "file:",
e2c0: 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20   5)==0 .  ){.   
e2d0: 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
e2e0: 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e300: 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77  * Parser state w
e310: 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20  hen parsing URI 
e320: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20  */.    int iIn; 
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68       /* Input ch
e350: 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
e360: 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20  .    int iOut = 
e370: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e380: 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61     /* Output cha
e390: 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
e3a0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
e3b0: 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20  nUri+2;         
e3c0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
e3d0: 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
e3e0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
e3f0: 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f  sure the SQLITE_
e400: 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73  OPEN_URI flag is
e410: 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65   set to indicate
e420: 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65   to the VFS xOpe
e430: 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  n .    ** method
e440: 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20   that there may 
e450: 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  be extra paramet
e460: 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ers following th
e470: 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f  e file-name.  */
e480: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
e490: 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a  LITE_OPEN_URI;..
e4a0: 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69      for(iIn=0; i
e4b0: 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20  In<nUri; iIn++) 
e4c0: 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69  nByte += (zUri[i
e4d0: 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a  In]=='&');.    z
e4e0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
e4f0: 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
e500: 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
e510: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e520: 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 63  EM;..    /* Disc
e530: 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61  ard the scheme a
e540: 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67  nd authority seg
e550: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49  ments of the URI
e560: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72  . */.    if( zUr
e570: 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72  i[5]=='/' && zUr
e580: 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i[6]=='/' ){.   
e590: 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
e5a0: 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
e5b0: 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
e5c0: 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 0a 20  ='/' ) iIn++;.. 
e5d0: 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
e5e0: 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
e5f0: 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
e600: 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
e610: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
e620: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
e630: 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
e640: 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
e650: 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
e660: 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
e670: 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
e680: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e690: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
e6a0: 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
e6b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e6c0: 20 20 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 20        iIn = 5;. 
e6d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
e6e0: 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  y the filename a
e6f0: 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72  nd any query par
e700: 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ameters into the
e710: 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a   zFile buffer. .
e720: 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48      ** Decode %H
e730: 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61  H escape codes a
e740: 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20  long the way. . 
e750: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74     **.    ** Wit
e760: 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76  hin this loop, v
e770: 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d  ariable eState m
e780: 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20  ay be set to 0, 
e790: 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e  1 or 2, dependin
e7a0: 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  g.    ** on the 
e7b0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  parsing context.
e7c0: 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   As follows:.   
e7d0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20   **.    **   0: 
e7e0: 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  Parsing file-nam
e7f0: 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50  e..    **   1: P
e800: 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74  arsing name sect
e810: 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
e820: 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
e830: 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a  ter..    **   2:
e840: 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73   Parsing value s
e850: 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
e860: 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
e870: 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  ameter..    */. 
e880: 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20     eState = 0;. 
e890: 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
e8a0: 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
e8b0: 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c!='#' ){.      
e8c0: 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
e8d0: 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20   c=='%' .       
e8e0: 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
e8f0: 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20  it(zUri[iIn]) . 
e900: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
e910: 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
e920: 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a  n+1]) .      ){.
e930: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65          int octe
e940: 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54  t = (sqlite3HexT
e950: 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
e960: 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20  ) << 4);.       
e970: 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65   octet += sqlite
e980: 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
e990: 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20  In++]);..       
e9a0: 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d   assert( octet>=
e9b0: 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29  0 && octet<256 )
e9c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63  ;.        if( oc
e9d0: 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tet==0 ){.      
e9e0: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
e9f0: 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
ea00: 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
ea10: 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
ea20: 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
ea30: 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
ea40: 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
ea50: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
ea60: 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
ea70: 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
ea80: 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
ea90: 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
eaa0: 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
eab0: 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
eac0: 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
ead0: 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
eae0: 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
eaf0: 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
eb00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
eb10: 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
eb20: 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
eb30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
eb40: 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
eb50: 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
eb60: 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
eb70: 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
eb80: 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
eb90: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
eba0: 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
ebb0: 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
ebd0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
ebe0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
ebf0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
ec00: 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
ec10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ec20: 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
ec30: 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
ec40: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
ec50: 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
ec60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
ec70: 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
ec80: 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
ec90: 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
eca0: 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
ecb0: 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
ecc0: 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
ecd0: 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
ece0: 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
ecf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
ed00: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
ed10: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
ed20: 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
ed30: 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
ed40: 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
ed50: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
ed60: 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
ed70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
ed80: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
ed90: 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
eda0: 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
edb0: 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
edc0: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
edd0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
ede0: 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
edf0: 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
ee00: 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
ee10: 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
ee20: 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
ee30: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
ee40: 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
ee50: 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
ee60: 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
ee70: 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
ee80: 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
ee90: 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
eea0: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
eeb0: 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
eec0: 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
eed0: 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
eee0: 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
eef0: 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
ef00: 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
ef10: 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
ef20: 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
ef30: 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
ef40: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
ef50: 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
ef60: 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
ef70: 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
ef80: 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
ef90: 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
efa0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
efb0: 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
efc0: 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
efd0: 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
efe0: 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
eff0: 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
f000: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f010: 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
f020: 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
f030: 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
f040: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
f050: 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
f060: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f070: 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
f080: 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
f090: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
f0a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
f0b0: 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
f0c0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
f0d0: 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
f0e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
f0f0: 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
f100: 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
f110: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
f120: 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
f130: 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
f140: 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
f150: 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
f160: 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
f170: 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
f180: 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
f190: 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
f1a0: 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
f1b0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
f1c0: 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
f1d0: 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
f1e0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
f1f0: 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
f200: 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
f210: 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
f220: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
f230: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
f240: 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
f250: 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
f260: 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
f270: 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
f280: 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
f290: 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
f2a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f2b0: 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
f2c0: 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
f2d0: 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
f2e0: 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
f2f0: 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
f300: 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
f310: 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
f320: 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
f330: 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
f340: 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
f350: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
f360: 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
f370: 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
f380: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f390: 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
f3a0: 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
f3b0: 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
f3c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
f3d0: 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
f3e0: 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
f3f0: 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
f400: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
f410: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
f420: 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
f430: 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20   = aOpenMode;.  
f440: 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
f450: 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20  mask & flags;.  
f460: 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
f470: 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20  e = "access";.  
f480: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
f490: 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20   if( aMode ){.  
f4a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
f4b0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
f4c0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
f4d0: 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b   for(i=0; aMode[
f4e0: 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i].z; i++){.    
f4f0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
f500: 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d  ar *z = aMode[i]
f510: 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .z;.            
f520: 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65  if( nVal==sqlite
f530: 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20  3Strlen30(z) && 
f540: 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20  0==memcmp(zVal, 
f550: 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20  z, nVal) ){.    
f560: 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d            mode =
f570: 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a   aMode[i].mode;.
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
f590: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
f5a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
f5b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64           if( mod
f5c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f5d0: 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
f5e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
f5f0: 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65  "no such %s mode
f600: 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65  : %s", zModeType
f610: 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
f620: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f630: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
f640: 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
f650: 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
f660: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
f670: 28 20 6d 6f 64 65 3e 6c 69 6d 69 74 20 29 7b 0a  ( mode>limit ){.
f680: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
f690: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
f6a0: 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
f6b0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
f6c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
f6f0: 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
f700: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
f710: 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
f720: 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
f730: 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
f740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f750: 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
f760: 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
f770: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f780: 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
f790: 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
f7a0: 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
f7b0: 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
f7c0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b  te3_malloc(nUri+
f7d0: 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  2);.    if( !zFi
f7e0: 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
f7f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
f800: 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69  mcpy(zFile, zUri
f810: 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69  , nUri);.    zFi
f820: 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b  le[nUri] = '\0';
f830: 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b  .    zFile[nUri+
f840: 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a  1] = '\0';.  }..
f850: 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74    *ppVfs = sqlit
f860: 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73  e3_vfs_find(zVfs
f870: 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d  );.  if( *ppVfs=
f880: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  =0 ){.    *pzErr
f890: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
f8a0: 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76  rintf("no such v
f8b0: 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a  fs: %s", zVfs);.
f8c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f8d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73  ERROR;.  }. pars
f8e0: 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28  e_uri_out:.  if(
f8f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f900: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
f910: 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a  ee(zFile);.    z
f920: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
f930: 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  *pFlags = flags;
f940: 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69  .  *pzFile = zFi
f950: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  le;.  return rc;
f960: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
f970: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
f980: 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67   work of opening
f990: 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62   a database on b
f9a0: 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69  ehalf of.** sqli
f9b0: 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73  te3_open() and s
f9c0: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e  qlite3_open16().
f9d0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
f9e0: 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d  lename "zFilenam
f9f0: 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38  e"  .** is UTF-8
fa00: 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61   encoded..*/.sta
fa10: 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61  tic int openData
fa20: 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  base(.  const ch
fa30: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f  ar *zFilename, /
fa40: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
fa50: 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ame UTF-8 encode
fa60: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
fa70: 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a  *ppDb,        /*
fa80: 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64   OUT: Returned d
fa90: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
faa0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
fab0: 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70   flags,    /* Op
fac0: 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20  erational flags 
fad0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
fae0: 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e  *zVfs       /* N
faf0: 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
fb00: 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  o use */.){.  sq
fb10: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb30: 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64   Store allocated
fb40: 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
fb50: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
fb80: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65   */.  int isThre
fb90: 61 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20  adsafe;         
fba0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
fbb0: 72 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e  r threadsafe con
fbc0: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  nections */.  ch
fbd0: 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20  ar *zOpen = 0;  
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fbf0: 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65   Filename argume
fc00: 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74  nt to pass to Bt
fc10: 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63  reeOpen() */.  c
fc20: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
fc30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
fc40: 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
fc50: 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73  from sqlite3Pars
fc60: 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70  eUri() */..  *pp
fc70: 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
fc80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
fc90: 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
fca0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
fcb0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
fcc0: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a  urn rc;.#endif..
fcd0: 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    /* Only allow 
fce0: 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  sensible combina
fcf0: 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e  tions of bits in
fd00: 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   the flags argum
fd10: 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f  ent.  .  ** Thro
fd20: 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  w an error if an
fd30: 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62  y non-sense comb
fd40: 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  ination is used.
fd50: 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20    If we.  ** do 
fd60: 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61  not block illega
fd70: 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68  l combinations h
fd80: 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72  ere, it could tr
fd90: 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72  igger.  ** asser
fda0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
fdb0: 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e  n deeper layers.
fdc0: 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69    Sensible combi
fdd0: 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65  nations.  ** are
fde0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20  :.  **.  **  1: 
fdf0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
fe00: 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20  DONLY.  **  2:  
fe10: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
fe20: 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20  WRITE.  **  6:  
fe30: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
fe40: 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
fe50: 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a  PEN_CREATE.  */.
fe60: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
fe70: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
fe80: 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73  == 0x01 );.  ass
fe90: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
fea0: 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78  _READWRITE == 0x
feb0: 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  02 );.  assert( 
fec0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
fed0: 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b  TE    == 0x04 );
fee0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
fef0: 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
ff00: 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59  2 ); /* READONLY
ff10: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
ff20: 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
ff30: 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x04 ); /* READW
ff40: 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61  RITE */.  testca
ff50: 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
ff60: 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52  ))==0x40 ); /* R
ff70: 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
ff80: 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c  E */.  if( ((1<<
ff90: 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34  (flags&7)) & 0x4
ffa0: 36 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  6)==0 ) return S
ffb0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
ffc0: 54 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  T;..  if( sqlite
ffd0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
ffe0: 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  oreMutex==0 ){. 
fff0: 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
10000 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
10010 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
10020 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a  OPEN_NOMUTEX ){.
10030 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
10040 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
10050 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
10060 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
10070 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
10080 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  afe = 1;.  }else
10090 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
100a0 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  fe = sqlite3Glob
100b0 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
100c0 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  tex;.  }.  if( f
100d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
100e0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
100f0 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ){.    flags &= 
10100 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41  ~SQLITE_OPEN_SHA
10110 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73  REDCACHE;.  }els
10120 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
10130 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
10140 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
10150 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
10160 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
10170 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ACHE;.  }..  /* 
10180 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62  Remove harmful b
10190 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61  its from the fla
101a0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  gs parameter.  *
101b0 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54  *.  ** The SQLIT
101c0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61  E_OPEN_NOMUTEX a
101d0 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  nd SQLITE_OPEN_F
101e0 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77  ULLMUTEX flags w
101f0 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77  ere.  ** dealt w
10200 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69  ith in the previ
10210 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20  ous code block. 
10220 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20   Besides these, 
10230 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61  the only.  ** va
10240 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20  lid input flags 
10250 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  for sqlite3_open
10260 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45  _v2() are SQLITE
10270 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a  _OPEN_READONLY,.
10280 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
10290 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49  _READWRITE, SQLI
102a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
102b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
102c0 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51  EDCACHE,.  ** SQ
102d0 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
102e0 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65  ECACHE, and some
102f0 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20   reserved bits. 
10300 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20   Silently mask. 
10310 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65   ** off all othe
10320 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20  r flags..  */.  
10330 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c  flags &=  ~( SQL
10340 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
10350 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
10360 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
10370 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10390 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
103a0 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
103b0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
103c0 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
103d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
103e0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
103f0 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
10400 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10410 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
10420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10430 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
10440 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
10450 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10460 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
10470 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
10480 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10490 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
104a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
104b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
104c0 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
104d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
104e0 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20  _FULLMUTEX |.   
104f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
10500 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20  TE_OPEN_WAL.    
10510 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f           );..  /
10520 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
10530 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63  qlite data struc
10540 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73  ture */.  db = s
10550 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
10560 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ( sizeof(sqlite3
10570 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  ) );.  if( db==0
10580 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f   ) goto opendb_o
10590 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65  ut;.  if( isThre
105a0 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62  adsafe ){.    db
105b0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
105c0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
105d0 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
105e0 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
105f0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
10600 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10610 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20  db);.      db = 
10620 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  0;.      goto op
10630 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
10640 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
10650 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10660 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
10670 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62  ask = 0xff;.  db
10680 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d  ->nDb = 2;.  db-
10690 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
106a0 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62  MAGIC_BUSY;.  db
106b0 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
106c0 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74  tatic;..  assert
106d0 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  ( sizeof(db->aLi
106e0 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61  mit)==sizeof(aHa
106f0 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65  rdLimit) );.  me
10700 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c  mcpy(db->aLimit,
10710 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a   aHardLimit, siz
10720 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29  eof(db->aLimit))
10730 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
10740 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65  it = 1;.  db->ne
10750 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a  xtAutovac = -1;.
10760 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69    db->nextPagesi
10770 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c  ze = 0;.  db->fl
10780 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
10790 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51  ortColNames | SQ
107a0 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 20 7c  LITE_AutoIndex |
107b0 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72   SQLITE_EnableTr
107c0 69 67 67 65 72 0a 23 69 66 20 53 51 4c 49 54 45  igger.#if SQLITE
107d0 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f  _DEFAULT_FILE_FO
107e0 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20  RMAT<4.         
107f0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
10800 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23  _LegacyFileFmt.#
10810 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
10820 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f  ITE_ENABLE_LOAD_
10830 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20  EXTENSION.      
10840 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
10850 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  ITE_LoadExtensio
10860 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  n.#endif.#if SQL
10870 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55  ITE_DEFAULT_RECU
10880 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20  RSIVE_TRIGGERS. 
10890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108a0 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67  | SQLITE_RecTrig
108b0 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20  gers.#endif.#if 
108c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
108d0 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b  EFAULT_FOREIGN_K
108e0 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44  EYS) && SQLITE_D
108f0 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b  EFAULT_FOREIGN_K
10900 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  EYS.            
10910 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f       | SQLITE_Fo
10920 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66  reignKeys.#endif
10930 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
10940 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
10950 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
10960 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10970 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
10980 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
10990 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
109a0 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
109b0 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
109c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
109d0 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b  ARY. BINARY work
109e0 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38  s for both UTF-8
109f0 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36  .  ** and UTF-16
10a00 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69  , so add a versi
10a10 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61  on for each to a
10a20 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73  void any unneces
10a30 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72  sary.  ** conver
10a40 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  sions. The only 
10a50 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f  error that can o
10a60 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d  ccur here is a m
10a70 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
10a80 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
10a90 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
10aa0 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
10ab0 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  8, 0, binCollFun
10ac0 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
10ad0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
10ae0 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
10af0 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
10b00 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
10b10 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
10b20 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
10b30 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69  E_UTF16LE, 0, bi
10b40 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
10b50 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
10b60 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51  (db, "RTRIM", SQ
10b70 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64  LITE_UTF8, (void
10b80 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  *)1, binCollFunc
10b90 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  , 0);.  if( db->
10ba0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
10bb0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
10bc0 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70  out;.  }.  db->p
10bd0 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  DfltColl = sqlit
10be0 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
10bf0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22  , SQLITE_UTF8, "
10c00 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61  BINARY", 0);.  a
10c10 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74  ssert( db->pDflt
10c20 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Coll!=0 );..  /*
10c30 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d   Also add a UTF-
10c40 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  8 case-insensiti
10c50 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ve collation seq
10c60 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61  uence. */.  crea
10c70 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
10c80 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45  "NOCASE", SQLITE
10c90 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65  _UTF8, 0, nocase
10ca0 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30  CollatingFunc, 0
10cb0 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  );..  /* Parse t
10cc0 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20  he filename/URI 
10cd0 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64  argument. */.  d
10ce0 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  b->openFlags = f
10cf0 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c  lags;.  rc = sql
10d00 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66  ite3ParseUri(zVf
10d10 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  s, zFilename, &f
10d20 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c  lags, &db->pVfs,
10d30 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73   &zOpen, &zErrMs
10d40 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
10d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
10d60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
10d70 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63  MEM ) db->malloc
10d80 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
10d90 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
10da0 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22   rc, zErrMsg ? "
10db0 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67  %s" : 0, zErrMsg
10dc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10dd0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
10de0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
10df0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  t;.  }..  /* Ope
10e00 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
10e10 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
10e20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
10e30 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
10e40 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64  s, zOpen, db, &d
10e50 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
10e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10e70 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
10e80 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
10e90 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
10ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10eb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10ec0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
10ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10ee0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
10ef0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10f00 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  (db, rc, 0);.   
10f10 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
10f20 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b  ;.  }.  db->aDb[
10f30 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  0].pSchema = sql
10f40 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
10f50 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  , db->aDb[0].pBt
10f60 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
10f70 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
10f80 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
10f90 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  );...  /* The de
10fa0 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76  fault safety_lev
10fb0 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  el for the main 
10fc0 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c  database is 'ful
10fd0 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70  l'; for the temp
10fe0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69  .  ** database i
10ff0 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69  t is 'NONE'. Thi
11000 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  s matches the pa
11010 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c  ger layer defaul
11020 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ts.  .  */.  db-
11030 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[0].zName = 
11040 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44  "main";.  db->aD
11050 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[0].safety_leve
11060 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62  l = 3;.  db->aDb
11070 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
11080 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
11090 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
110a0 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  1;..  db->magic 
110b0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
110c0 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
110d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
110e0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
110f0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
11100 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
11110 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
11120 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
11130 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
11140 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
11150 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
11160 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
11170 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
11180 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
11190 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
111a0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
111b0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
111c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
111d0 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74  sterBuiltinFunct
111e0 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ions(db);..  /* 
111f0 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65  Load automatic e
11200 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65  xtensions - exte
11210 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  nsions that have
11220 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
11230 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
11240 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69  sqlite3_automati
11250 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50  c_extension() AP
11260 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  I..  */.  rc = s
11270 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
11280 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  b);.  if( rc==SQ
11290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
112a0 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78  qlite3AutoLoadEx
112b0 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20  tensions(db);.  
112c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
112d0 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20  rrcode(db);.    
112e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
112f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
11300 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
11310 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
11320 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31  LITE_ENABLE_FTS1
11330 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
11340 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11350 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
11360 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74  e3Fts1Init(sqlit
11370 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
11380 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64  qlite3Fts1Init(d
11390 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
113a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
113b0 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20  ABLE_FTS2.  if( 
113c0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
113d0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
113e0 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  OK ){.    extern
113f0 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32   int sqlite3Fts2
11400 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
11410 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11420 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts2Init(db);.  
11430 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
11440 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
11450 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS3.  if( !db->m
11460 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
11470 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11490 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts3Init(db);.  
114a0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
114b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
114c0 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  CU.  if( !db->ma
114d0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
114e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
114f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
11500 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  cuInit(db);.  }.
11510 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
11520 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52  QLITE_ENABLE_RTR
11530 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  EE.  if( !db->ma
11540 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
11550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
11560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74    rc = sqlite3Rt
11570 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  reeInit(db);.  }
11580 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
11590 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
115a0 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49  0);..  /* -DSQLI
115b0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
115c0 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20  NG_MODE=1 makes 
115d0 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65  EXCLUSIVE the de
115e0 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
115f0 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49  ** mode.  -DSQLI
11600 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
11610 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e  NG_MODE=0 make N
11620 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
11630 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
11640 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68  ode.  Doing noth
11650 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20  ing at all also 
11660 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65  makes NORMAL the
11670 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23   default..  */.#
11680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
11690 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
116a0 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b  E.  db->dfltLock
116b0 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
116c0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
116d0 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  DE;.  sqlite3Pag
116e0 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71  erLockingMode(sq
116f0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
11700 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c  db->aDb[0].pBt),
11710 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11720 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
11730 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
11740 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a  G_MODE);.#endif.
11750 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65  .  /* Enable the
11760 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f   lookaside-mallo
11770 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20  c subsystem */. 
11780 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
11790 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c  db, 0, sqlite3Gl
117a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f  obalConfig.szLoo
117b0 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20  kaside,.        
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
117e0 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b  fig.nLookaside);
117f0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ..  sqlite3_wal_
11800 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64  autocheckpoint(d
11810 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  b, SQLITE_DEFAUL
11820 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50  T_WAL_AUTOCHECKP
11830 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f  OINT);..opendb_o
11840 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
11850 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28  ee(zOpen);.  if(
11860 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72   db ){.    asser
11870 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20  t( db->mutex!=0 
11880 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d  || isThreadsafe=
11890 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  =0 || sqlite3Glo
118a0 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
118b0 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
118c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
118d0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
118e0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
118f0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
11900 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c   assert( db!=0 |
11910 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
11920 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  EM );.  if( rc==
11930 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
11940 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
11950 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
11960 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
11970 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11980 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
11990 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
119a0 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d  K;.  }.  *ppDb =
119b0 20 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   db;.  return sq
119c0 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
119d0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  rc);.}../*.** Op
119e0 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
119f0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
11a00 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20   sqlite3_open(. 
11a10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
11a20 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
11a30 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20  e3 **ppDb .){.  
11a40 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
11a50 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ase(zFilename, p
11a60 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
11a70 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
11a80 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
11a90 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
11aa0 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74  REATE, 0);.}.int
11ab0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
11ac0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
11ad0 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44  filename,   /* D
11ae0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
11af0 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
11b00 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
11b10 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51        /* OUT: SQ
11b20 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a  Lite db handle *
11b30 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
11b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
11b50 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
11b60 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
11b70 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
11b80 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a   module to use *
11b90 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  /.){.  return op
11ba0 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e  enDatabase(filen
11bb0 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69  ame, ppDb, (unsi
11bc0 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20  gned int)flags, 
11bd0 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zVfs);.}..#ifnde
11be0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
11bf0 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
11c00 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
11c10 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
11c20 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
11c30 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
11c40 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
11c50 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
11c60 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
11c70 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
11c80 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
11c90 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
11ca0 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69  UTF-16 */.  sqli
11cb0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
11cc0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
11cd0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20  sert( zFilename 
11ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44  );.  assert( ppD
11cf0 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30  b );.  *ppDb = 0
11d00 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
11d10 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
11d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
11d30 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
11d40 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
11d50 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20  ;.#endif.  pVal 
11d60 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
11d70 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
11d80 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
11d90 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
11da0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
11db0 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
11dc0 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
11dd0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
11de0 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
11df0 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
11e00 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
11e10 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
11e20 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
11e30 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
11e40 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11e50 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
11e60 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
11e70 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73  EATE, 0);.    as
11e80 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72  sert( *ppDb || r
11e90 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11ea0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11eb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48  QLITE_OK && !DbH
11ec0 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62  asProperty(*ppDb
11ed0 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
11ee0 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45  aded) ){.      E
11ef0 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
11f00 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
11f10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
11f20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11f30 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OMEM;.  }.  sqli
11f40 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
11f50 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71  l);..  return sq
11f60 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
11f70 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  rc);.}.#endif /*
11f80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
11f90 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
11fa0 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
11fb0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
11fc0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
11fd0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
11fe0 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
11ff0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  e_collation(.  s
12000 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
12010 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
12020 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
12030 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
12040 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
12050 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
12060 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
12070 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
12080 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
12090 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
120a0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
120b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
120c0 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
120d0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
120e0 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
120f0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
12100 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12110 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
12120 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12130 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
12140 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12150 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
12160 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
12170 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
12180 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
12190 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
121a0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
121b0 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  llation_v2(.  sq
121c0 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
121d0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
121e0 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
121f0 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
12200 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
12210 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
12220 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
12230 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
12240 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  l)(void*).){.  i
12250 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
12260 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
12270 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
12280 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
12290 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63  iled );.  rc = c
122a0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
122b0 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e  b, zName, (u8)en
122c0 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
122d0 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d  e, xDel);.  rc =
122e0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
122f0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
12300 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
12310 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
12320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
12330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
12340 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
12350 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
12360 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
12370 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
12380 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
12390 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
123a0 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73  collation16(.  s
123b0 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
123c0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
123d0 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20  ,.  int enc, .  
123e0 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
123f0 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
12400 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
12410 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
12420 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  d*).){.  int rc 
12430 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
12440 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73  har *zName8;.  s
12450 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12460 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
12470 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
12480 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
12490 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  zName8 = sqlite3
124a0 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61  Utf16to8(db, zNa
124b0 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
124c0 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69  TF16NATIVE);.  i
124d0 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20  f( zName8 ){.   
124e0 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
124f0 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38  ation(db, zName8
12500 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
12510 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
12520 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12530 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20  (db, zName8);.  
12540 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
12550 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
12560 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12570 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
12580 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12590 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
125a0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
125b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
125c0 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
125d0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61  uence factory ca
125e0 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
125f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
12600 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61  ** db. Replace a
12610 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ny previously in
12620 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f  stalled collatio
12630 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
12640 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
12650 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
12660 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ded(.  sqlite3 *
12670 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
12680 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
12690 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
126a0 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  d)(void*,sqlite3
126b0 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
126c0 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
126d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
126e0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
126f0 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
12700 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  ed = xCollNeeded
12710 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
12720 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d  ded16 = 0;.  db-
12730 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
12740 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
12750 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
12760 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
12770 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
12780 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
12790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
127a0 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
127b0 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
127c0 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
127d0 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
127e0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
127f0 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
12800 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
12810 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
12820 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
12830 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
12840 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
12850 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69  needed16(.  sqli
12860 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
12870 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
12880 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
12890 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c  Needed16)(void*,
128a0 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
128b0 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64  xtRep,const void
128c0 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
128d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
128e0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
128f0 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  ollNeeded = 0;. 
12900 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
12910 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  16 = xCollNeeded
12920 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e  16;.  db->pCollN
12930 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
12940 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
12950 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12960 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
12970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12980 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12990 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
129a0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
129b0 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
129c0 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  D./*.** This fun
129d0 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20  ction is now an 
129e0 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20  anachronism. It 
129f0 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  used to be used 
12a00 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
12a10 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61  a.** malloc() fa
12a20 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74  ilure, but SQLit
12a30 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20  e now does this 
12a40 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
12a50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c  /.int sqlite3_gl
12a60 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69  obal_recover(voi
12a70 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
12a80 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
12a90 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
12aa0 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
12ab0 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
12ac0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
12ad0 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d   autocommit.** m
12ae0 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ode.  Return TRU
12af0 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46  E if it is and F
12b00 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75  ALSE if not.  Au
12b10 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73  tocommit mode is
12b20 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c   on.** by defaul
12b30 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69  t.  Autocommit i
12b40 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20  s disabled by a 
12b50 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20  BEGIN statement 
12b60 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a  and reenabled.**
12b70 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d   by the next COM
12b80 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e  MIT or ROLLBACK.
12b90 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53  .**.******* THIS
12ba0 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45 4e   IS AN EXPERIMEN
12bb0 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20 53  TAL API AND IS S
12bc0 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47 45  UBJECT TO CHANGE
12bd0 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73   ******.*/.int s
12be0 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
12bf0 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
12c00 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
12c10 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a  >autoCommit;.}..
12c20 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
12c30 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
12c40 20 73 75 62 74 69 74 75 74 65 73 20 66 6f 72 20   subtitutes for 
12c50 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45  constants SQLITE
12c60 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c  _CORRUPT,.** SQL
12c70 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49  ITE_MISUSE, SQLI
12c80 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c  TE_CANTOPEN, SQL
12c90 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f  ITE_IOERR and po
12ca0 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72  ssibly other err
12cb0 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  or.** constants.
12cc0 20 20 54 68 65 79 20 73 65 72 76 65 72 20 74 77    They server tw
12cd0 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a  o purposes:.**.*
12ce0 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73  *   1.  Serve as
12cf0 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
12d00 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
12d10 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62  akpoint in a deb
12d20 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74  ugger.**       t
12d30 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65  o detect when ve
12d40 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64  rsion error cond
12d50 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a  itions occurs..*
12d60 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b  *.**   2.  Invok
12d70 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
12d80 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73  to provide the s
12d90 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74  ource code locat
12da0 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20  ion where.**    
12db0 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65     a low-level e
12dc0 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65  rror is first de
12dd0 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  tected..*/.int s
12de0 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72  qlite3CorruptErr
12df0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
12e00 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
12e10 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
12e20 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
12e30 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
12e40 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20  CORRUPT,.       
12e50 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65         "database
12e60 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c   corruption at l
12e70 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
12e80 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
12e90 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
12ea0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
12eb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12ec0 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74  E_CORRUPT;.}.int
12ed0 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
12ee0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
12ef0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
12f00 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12f10 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
12f20 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
12f30 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20  _MISUSE, .      
12f40 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65 20          "misuse 
12f50 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
12f60 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
12f70 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
12f80 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
12f90 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
12fa0 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a  QLITE_MISUSE;.}.
12fb0 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f  int sqlite3Canto
12fc0 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  penError(int lin
12fd0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
12fe0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
12ff0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
13000 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
13010 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
13020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
13030 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
13040 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
13050 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
13060 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
13070 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
13080 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
13090 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
130a0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
130b0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
130c0 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  TED./*.** This i
130d0 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  s a convenience 
130e0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b  routine that mak
130f0 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  es sure that all
13100 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
13110 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69  .** data for thi
13120 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65  s thread has bee
13130 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  n deallocated..*
13140 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c  *.** SQLite no l
13150 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61  onger uses threa
13160 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d-specific data 
13170 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
13180 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f  is now a.** no-o
13190 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e  p.  It is retain
131a0 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  ed for historica
131b0 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  l compatibility.
131c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
131d0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
131e0 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a  void){.}.#endif.
131f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65  ./*.** Return me
13200 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ta information a
13210 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20  bout a specific 
13220 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61  column of a data
13230 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53  base table..** S
13240 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71  ee comment in sq
13250 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e  lite3.h (sqlite.
13260 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c  h.in) for detail
13270 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
13280 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
13290 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73  N_METADATA.int s
132a0 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
132b0 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
132c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
132d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
132e0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
132f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13300 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20   *zDbName,      
13310 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
13320 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  me or NULL */.  
13330 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
13340 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54  leName,     /* T
13350 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  able name */.  c
13360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
13370 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f  mnName,    /* Co
13380 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  lumn name */.  c
13390 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61  har const **pzDa
133a0 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55  taType,    /* OU
133b0 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64  TPUT: Declared d
133c0 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  ata type */.  ch
133d0 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c  ar const **pzCol
133e0 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54  lSeq,     /* OUT
133f0 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73  PUT: Collation s
13400 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
13410 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c    int *pNotNull,
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13430 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
13440 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
13450 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  aint exists */. 
13460 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65   int *pPrimaryKe
13470 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
13480 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
13490 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50  column part of P
134a0 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74  K */.  int *pAut
134b0 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  oinc            
134c0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
134d0 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20  ue if column is 
134e0 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a  auto-increment *
134f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
13500 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
13510 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   0;.  Table *pTa
13520 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  b = 0;.  Column 
13530 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
13540 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63   iCol;..  char c
13550 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20  onst *zDataType 
13560 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
13570 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b  t *zCollSeq = 0;
13580 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d  .  int notnull =
13590 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72   0;.  int primar
135a0 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ykey = 0;.  int 
135b0 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20  autoinc = 0;..  
135c0 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61  /* Ensure the da
135d0 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
135e0 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f  s been loaded */
135f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13600 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
13610 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
13620 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
13630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69   rc = sqlite3Ini
13640 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b  t(db, &zErrMsg);
13650 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
13660 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !=rc ){.    goto
13670 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
13680 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
13690 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
136a0 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73  on */.  pTab = s
136b0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
136c0 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  db, zTableName, 
136d0 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
136e0 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70  !pTab || pTab->p
136f0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54  Select ){.    pT
13700 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  ab = 0;.    goto
13710 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
13720 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63  .  /* Find the c
13730 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20  olumn for which 
13740 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65  info is requeste
13750 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  d */.  if( sqlit
13760 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d  e3IsRowid(zColum
13770 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43  nName) ){.    iC
13780 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
13790 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d  ;.    if( iCol>=
137a0 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  0 ){.      pCol 
137b0 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
137c0 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ol];.    }.  }el
137d0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  se{.    for(iCol
137e0 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
137f0 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
13800 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
13810 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
13820 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
13830 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
13840 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
13850 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
13860 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13870 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
13880 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  ==pTab->nCol ){.
13890 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
138a0 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
138b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
138c0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
138d0 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73  ing block stores
138e0 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d   the meta inform
138f0 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
13900 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
13910 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
13920 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
13930 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f  s zDataType, zCo
13940 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20  llSeq, notnull, 
13950 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20  primarykey.  ** 
13960 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20  and autoinc. At 
13970 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
13980 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69   are two possibi
13990 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20  lities:.  ** .  
139a0 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70  **     1. The sp
139b0 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e  ecified column n
139c0 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20  ame was rowid", 
139d0 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64  "oid" or "_rowid
139e0 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  _" .  **        
139f0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
13a00 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
13a10 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  red IPK column. 
13a20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32  .  **.  **     2
13a30 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e  . The table is n
13a40 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  ot a view and th
13a50 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64  e column name id
13a60 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a  entified an .  *
13a70 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69  *        explici
13a80 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
13a90 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69  umn. Copy meta i
13aa0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
13ab0 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69  *pCol..  */ .  i
13ac0 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  f( pCol ){.    z
13ad0 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d  DataType = pCol-
13ae0 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c  >zType;.    zCol
13af0 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f  lSeq = pCol->zCo
13b00 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20  ll;.    notnull 
13b10 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21  = pCol->notNull!
13b20 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  =0;.    primaryk
13b30 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50 72  ey  = pCol->isPr
13b40 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61 75  imKey!=0;.    au
13b50 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50  toinc = pTab->iP
13b60 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54  Key==iCol && (pT
13b70 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
13b80 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
13b90 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
13ba0 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
13bb0 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
13bc0 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
13bd0 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
13be0 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
13bf0 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d   = "BINARY";.  }
13c00 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
13c10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13c20 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57  All(db);..  /* W
13c30 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
13c40 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64  ion call succeed
13c50 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65  ed or failed, se
13c60 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  t the output par
13c70 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20  ameters.  ** to 
13c80 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c  whatever their l
13c90 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74  ocal counterpart
13ca0 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e  s contain. If an
13cb0 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72   error did occur
13cc0 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20  ,.  ** this has 
13cd0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65  the effect of ze
13ce0 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74  roing all output
13cf0 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
13d00 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79  /.  if( pzDataTy
13d10 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65  pe ) *pzDataType
13d20 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20   = zDataType;.  
13d30 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20  if( pzCollSeq ) 
13d40 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f  *pzCollSeq = zCo
13d50 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f  llSeq;.  if( pNo
13d60 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c  tNull ) *pNotNul
13d70 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  l = notnull;.  i
13d80 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29  f( pPrimaryKey )
13d90 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20   *pPrimaryKey = 
13da0 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66  primarykey;.  if
13db0 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41  ( pAutoinc ) *pA
13dc0 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63  utoinc = autoinc
13dd0 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
13de0 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20  OK==rc && !pTab 
13df0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
13e00 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
13e10 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  );.    zErrMsg =
13e20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
13e30 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  db, "no such tab
13e40 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73  le column: %s.%s
13e50 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20  ", zTableName,. 
13e60 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61         zColumnNa
13e70 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
13e80 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
13e90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
13ea0 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f  b, rc, (zErrMsg?
13eb0 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67  "%s":0), zErrMsg
13ec0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
13ed0 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
13ee0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
13ef0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
13f00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13f10 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
13f20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13f30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
13f40 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
13f50 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
13f60 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
13f70 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
13f80 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
13f90 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
13fa0 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
13fb0 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
13fc0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
13fd0 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73  d(0);.  if( pVfs
13fe0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
13ff0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
14000 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c  ion works in mil
14010 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74  liseconds, but t
14020 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73  he underlying Os
14030 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50  Sleep() .  ** AP
14040 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f  I uses microseco
14050 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31  nds. Hence the 1
14060 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  000's..  */.  rc
14070 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65   = (sqlite3OsSle
14080 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73  ep(pVfs, 1000*ms
14090 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
140a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
140b0 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
140c0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
140d0 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69  sult codes..*/.i
140e0 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
140f0 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
14100 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
14110 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69  t onoff){.  sqli
14120 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14130 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
14140 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66  ->errMask = onof
14150 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  f ? 0xffffffff :
14160 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33   0xff;.  sqlite3
14170 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
14180 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
14190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
141a0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
141b0 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65   xFileControl me
141c0 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63  thod on a partic
141d0 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a  ular database..*
141e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69  /.int sqlite3_fi
141f0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  le_control(sqlit
14200 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
14210 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74  ar *zDbName, int
14220 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
14230 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14240 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74  ITE_ERROR;.  int
14250 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   iDb;.  sqlite3_
14260 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
14270 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44  mutex);.  if( zD
14280 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
14290 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  iDb = 0;.  }else
142a0 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b  {.    for(iDb=0;
142b0 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
142c0 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  b++){.      if( 
142d0 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b 69  strcmp(db->aDb[i
142e0 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61  Db].zName, zDbNa
142f0 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
14300 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
14310 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a 20  iDb<db->nDb ){. 
14320 20 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65     Btree *pBtree
14330 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
14340 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
14350 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61 67  ree ){.      Pag
14360 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
14370 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
14380 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fd;.      sqlite
14390 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
143a0 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ee);.      pPage
143b0 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
143c0 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Pager(pBtree);. 
143d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
143e0 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ger!=0 );.      
143f0 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
14400 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
14410 20 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21       assert( fd!
14420 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
14430 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
14440 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b  _FILE_POINTER ){
14450 0a 20 20 20 20 20 20 20 20 2a 28 73 71 6c 69 74  .        *(sqlit
14460 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
14470 20 66 64 3b 0a 20 20 20 20 20 20 20 20 72 63 20   fd;.        rc 
14480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14490 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d     }else if( fd-
144a0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
144b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
144c0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66  3OsFileControl(f
144d0 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20  d, op, pArg);.  
144e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
144f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14500 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 20 20 7d  OTFOUND;.      }
14510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
14520 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
14530 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
14540 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14550 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
14560 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a  return rc;   .}.
14570 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
14580 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
14590 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
145a0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
145b0 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
145c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
145d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
145e0 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
145f0 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
14600 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
14610 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
14620 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  {..    /*.    **
14630 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
14640 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  t state of the P
14650 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RNG..    */.    
14660 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
14670 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20  CTRL_PRNG_SAVE: 
14680 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14690 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a  rngSaveState();.
146a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
146b0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
146c0 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74  * Restore the st
146d0 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20  ate of the PRNG 
146e0 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74  to the last stat
146f0 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20  e saved using.  
14700 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20    ** PRNG_SAVE. 
14710 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61   If PRNG_SAVE ha
14720 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
14730 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  een called, then
14740 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72  .    ** this ver
14750 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47  b acts like PRNG
14760 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20  _RESET..    */. 
14770 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
14780 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
14790 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TORE: {.      sq
147a0 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65  lite3PrngRestore
147b0 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
147c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
147d0 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74   /*.    ** Reset
147e0 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74   the PRNG back t
147f0 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69  o its uninitiali
14800 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20  zed state.  The 
14810 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  next call.    **
14820 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   to sqlite3_rand
14830 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65  omness() will re
14840 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73  seed the PRNG us
14850 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ing a single cal
14860 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  l.    ** to the 
14870 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68  xRandomness meth
14880 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  od of the defaul
14890 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20  t VFS..    */.  
148a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
148b0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
148c0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
148d0 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65  e3PrngResetState
148e0 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
148f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
14900 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
14910 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56  est_control(BITV
14920 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70  EC_TEST, size, p
14930 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20  rogram).    **. 
14940 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74     ** Run a test
14950 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65   against a Bitve
14960 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65  c object of size
14970 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61  .  The program a
14980 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69  rgument.    ** i
14990 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
149a0 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69  tegers that defi
149b0 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52  nes the test.  R
149c0 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20  eturn -1 on a.  
149d0 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
149e0 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20  cation error, 0 
149f0 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e  on success, or n
14a00 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65  on-zero for an e
14a10 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65  rror..    ** See
14a20 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76   the sqlite3Bitv
14a30 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20  ecBuiltinTest() 
14a40 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
14a50 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
14a60 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
14a70 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56  TE_TESTCTRL_BITV
14a80 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20  EC_TEST: {.     
14a90 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
14aa0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
14ab0 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61   int *aProg = va
14ac0 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
14ad0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14ae0 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
14af0 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a  est(sz, aProg);.
14b00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14b10 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
14b20 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
14b30 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
14b40 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
14b50 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
14b60 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
14b70 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
14b80 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
14b90 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
14ba0 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
14bb0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
14bc0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
14bd0 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
14be0 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
14bf0 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
14c00 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
14c10 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
14c20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
14c30 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
14c40 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
14c50 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
14c60 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
14c70 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
14c80 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
14c90 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
14ca0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
14cb0 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
14cc0 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
14cd0 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
14ce0 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
14cf0 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
14d00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
14d10 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
14d20 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
14d30 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
14d40 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
14d50 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
14d60 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
14d70 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
14d80 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
14d90 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
14da0 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
14db0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
14dc0 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
14dd0 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
14de0 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
14df0 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
14e00 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
14e10 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
14e20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
14e30 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
14e40 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
14e50 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
14e60 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
14e70 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
14e80 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
14e90 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
14ea0 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
14eb0 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
14ec0 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
14ed0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
14ee0 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
14ef0 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
14f00 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62  ** dileterious b
14f10 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
14f20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14f30 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
14f40 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
14f50 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
14f60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14f70 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
14f80 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
14f90 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
14fa0 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
14fb0 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
14fc0 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
14fd0 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
14fe0 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
14ff0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
15000 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15010 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
15020 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
15030 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
15040 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
15050 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
15060 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
15070 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
15080 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
15090 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
150a0 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
150b0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
150c0 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
150d0 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
150e0 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
150f0 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
15100 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
15110 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
15120 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
15130 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
15140 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
15150 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
15160 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
15170 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
15180 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
15190 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
151a0 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
151b0 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
151c0 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
151d0 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
151e0 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
151f0 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
15200 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
15210 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
15220 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
15230 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
15240 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
15250 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
15260 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
15270 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
15280 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
15290 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
152a0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
152b0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
152c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
152d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
152e0 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
152f0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
15300 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
15310 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
15320 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
15330 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
15340 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
15350 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
15360 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
15370 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
15380 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
15390 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
153a0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
153b0 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
153c0 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
153d0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
153e0 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
153f0 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
15400 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
15410 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
15420 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
15430 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
15440 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
15450 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
15460 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
15470 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
15480 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
15490 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
154a0 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
154b0 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
154c0 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
154d0 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
154e0 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
154f0 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
15500 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
15510 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15520 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
15530 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
15540 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
15550 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
15560 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
15570 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
15580 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
15590 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
155a0 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
155b0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
155c0 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
155d0 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
155e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
155f0 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
15600 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
15610 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
15620 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
15630 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
15640 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
15650 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
15660 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
15670 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
15680 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
15690 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
156a0 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
156b0 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
156c0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
156d0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
156e0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
156f0 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
15700 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
15710 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
15720 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
15730 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
15740 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
15750 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
15760 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
15770 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
15780 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
15790 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
157a0 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
157b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
157c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
157d0 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
157e0 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
157f0 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
15800 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
15810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
15820 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
15830 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
15840 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
15850 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
15860 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
15870 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
15880 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
15890 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
158a0 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
158b0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
158c0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
158d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
158e0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
158f0 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
15900 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15910 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
15920 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
15930 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
15940 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
15950 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
15960 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
15970 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
15980 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
15990 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
159a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
159b0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
159c0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
159d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
159e0 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
159f0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
15a00 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
15a10 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
15a20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
15a30 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
15a40 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
15a50 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
15a60 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
15a70 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
15a80 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
15a90 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
15aa0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
15ab0 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
15ac0 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
15ad0 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
15ae0 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
15af0 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
15b00 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
15b10 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
15b20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
15b30 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
15b40 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
15b50 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
15b60 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
15b70 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
15b80 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
15b90 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
15ba0 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
15bb0 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
15bc0 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
15bd0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15be0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
15bf0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
15c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
15c10 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
15c20 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
15c30 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
15c40 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64 62  p,int);.      db
15c50 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26 20 53  ->flags = (x & S
15c60 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 20 7c  QLITE_OptMask) |
15c70 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 7e 53   (db->flags & ~S
15c80 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 3b 0a  QLITE_OptMask);.
15c90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15ca0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
15cb0 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20  E_N_KEYWORD.    
15cc0 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
15cd0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
15ce0 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
15cf0 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  D, const char *z
15d00 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  Word).    **.   
15d10 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20   ** If zWord is 
15d20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e  a keyword recogn
15d30 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ized by the pars
15d40 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  er, then return 
15d50 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
15d60 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20  r of keywords.  
15d70 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e  Or if zWord is n
15d80 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65  ot a keyword, re
15d90 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a  turn 0..    ** .
15da0 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74      ** This test
15db0 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79   feature is only
15dc0 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
15dd0 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73  e amalgamation s
15de0 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ince.    ** the 
15df0 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
15e00 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65   macro is not de
15e10 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69  fined in this fi
15e20 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20  le if SQLite.   
15e30 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69   ** is built usi
15e40 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72  ng separate sour
15e50 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f  ce files..    */
15e60 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15e70 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
15e80 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ORD: {.      con
15e90 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d  st char *zWord =
15ea0 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73   va_arg(ap, cons
15eb0 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
15ec0 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
15ed0 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a  trlen30(zWord);.
15ee0 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69        rc = (sqli
15ef0 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28  te3KeywordCode((
15f00 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54  u8*)zWord, n)!=T
15f10 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e  K_ID) ? SQLITE_N
15f20 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20  _KEYWORD : 0;.  
15f30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15f40 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a  .#endif ..    /*
15f50 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
15f60 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
15f70 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
15f80 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20  LOC, sz, &pNew, 
15f90 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20  pFree);.    **. 
15fa0 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65     ** Pass pFree
15fb0 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72   into sqlite3Scr
15fc0 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20  atchFree(). .   
15fd0 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e   ** If sz>0 then
15fe0 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61   allocate a scra
15ff0 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20  tch buffer into 
16000 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  pNew.  .    */. 
16010 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
16020 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
16030 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76  ALLOC: {.      v
16040 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70  oid *pFree, **pp
16050 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  New;.      int s
16060 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61  z;.      sz = va
16070 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
16080 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f       ppNew = va_
16090 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b  arg(ap, void**);
160a0 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76  .      pFree = v
160b0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
160c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29  ;.      if( sz )
160d0 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65   *ppNew = sqlite
160e0 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73  3ScratchMalloc(s
160f0 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
16100 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72  3ScratchFree(pFr
16110 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ee);.      break
16120 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16130 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
16140 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
16150 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
16160 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66  _FAULT, int onof
16170 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  f);.    **.    *
16180 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f  * If parameter o
16190 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  noff is non-zero
161a0 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  , configure the 
161b0 77 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74  wrappers so that
161c0 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73   all.    ** subs
161d0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
161e0 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20  localtime() and 
161f0 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49  variants fail. I
16200 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c  f onoff is zero,
16210 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69  .    ** undo thi
16220 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a  s setting..    *
16230 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
16240 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
16250 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20  TIME_FAULT: {.  
16260 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
16270 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69  lConfig.bLocalti
16280 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67  meFault = va_arg
16290 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
162a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
162b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
162c0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
162d0 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20  PLAIN).    /*   
162e0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
162f0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
16300 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d  CTRL_EXPLAIN_STM
16310 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  T,.    **       
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63   sqlite3_stmt*,c
16340 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20  onst char**);.  
16350 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63    **.    ** If c
16360 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
16370 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
16380 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71  EXPLAIN, each sq
16390 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73  lite3_stmt holds
163a0 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67  .    ** a string
163b0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
163c0 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61  the optimized pa
163d0 72 73 65 20 74 72 65 65 2e 20 20 54 68 69 73 20  rse tree.  This 
163e0 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20  test-control.   
163f0 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
16400 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74  inter to that st
16410 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ring..    */.   
16420 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
16430 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54  TCTRL_EXPLAIN_ST
16440 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  MT: {.      sqli
16450 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
16460 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
16470 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20  ite3_stmt*);.   
16480 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a     const char **
16490 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61  pzRet = va_arg(a
164a0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  p, const char**)
164b0 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d  ;.      *pzRet =
164c0 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c   sqlite3VdbeExpl
164d0 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70  anation((Vdbe*)p
164e0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Stmt);.      bre
164f0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
16500 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ..  }.  va_end(a
16510 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  p);.#endif /* SQ
16520 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
16530 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75  N_TEST */.  retu
16540 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16550 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
16560 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75  y routine, usefu
16570 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65  l to VFS impleme
16580 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63  ntations, that c
16590 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20  hecks.** to see 
165a0 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
165b0 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61  le was a URI tha
165c0 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70  t contained a sp
165d0 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a  ecific query .**
165e0 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20   parameter, and 
165f0 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68  if so obtains th
16600 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71  e value of the q
16610 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
16620 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
16630 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
16640 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69  the filename poi
16650 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f  nter passed into
16660 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20   the xOpen().** 
16670 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20  method of a VFS 
16680 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
16690 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75   The zParam argu
166a0 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
166b0 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79   of the.** query
166c0 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65   parameter we se
166d0 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ek.  This routin
166e0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  e returns the va
166f0 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61  lue of the zPara
16700 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  m.** parameter i
16710 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66  f it exists.  If
16720 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64   the parameter d
16730 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
16740 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
16750 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f  eturns a NULL po
16760 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  inter..*/.const 
16770 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72  char *sqlite3_ur
16780 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73  i_parameter(cons
16790 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
167a0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
167b0 50 61 72 61 6d 29 7b 0a 20 20 7a 46 69 6c 65 6e  Param){.  zFilen
167c0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
167d0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
167e0 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  ) + 1;.  while( 
167f0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
16800 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63      int x = strc
16810 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  mp(zFilename, zP
16820 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65  aram);.    zFile
16830 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
16840 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
16850 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  e) + 1;.    if( 
16860 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46  x==0 ) return zF
16870 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69  ilename;.    zFi
16880 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
16890 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
168a0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  ame) + 1;.  }.  
168b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
168c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
168d0 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  lename of the da
168e0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
168f0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
16900 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
16910 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
16920 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
16930 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
16940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
16950 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
16960 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
16970 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
16980 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
16990 42 74 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Bt && sqlite3Str
169a0 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62  ICmp(zDbName, db
169b0 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ->aDb[i].zName)=
169c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
169d0 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  rn sqlite3BtreeG
169e0 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
169f0 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
16a00 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
16a10 3b 0a 7d 0a                                      ;.}.