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

Artifact b92c6c9a302999975897730b2808708fbf531a56:


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 73 71  lize(void){.  sq
0f50: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
0f60: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
0f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* 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 70 4d 61 73 74  em..  */.  pMast
1460: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
1470: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
1480: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
1490: 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  R);.  sqlite3_mu
14a0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
14b0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
14c0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
14d0: 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  xInit = 1;.  if(
14e0: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
14f0: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
1500: 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  it ){.    rc = s
1510: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74  qlite3MallocInit
1520: 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ();.  }.  if( rc
1530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1540: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1550: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
1560: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nit = 1;.    if(
1570: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1580: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1590: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
15b0: 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20  nitMutex =.     
15c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74        sqlite3Mut
15d0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
15e0: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
15f0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1600: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1610: 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73 71  CoreMutex && !sq
1620: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1630: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1640: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1650: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1660: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
1670: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47   ){.    sqlite3G
1690: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
16a0: 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d  InitMutex++;.  }
16b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16c0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
16d0: 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20  ..  /* If rc is 
16e0: 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74  not SQLITE_OK at
16f0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
1700: 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c  n either the mal
1710: 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74  loc.  ** subsyst
1720: 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  em could not be 
1730: 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74  initialized or t
1740: 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64  he system failed
1750: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a   to allocate.  *
1760: 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78  * the pInitMutex
1770: 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61   mutex. Return a
1780: 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65  n error in eithe
1790: 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66  r case.  */.  if
17a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74  ;.  }..  /* Do t
17d0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
17e0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e  nitialization un
17f0: 64 65 72 20 74 68 65 20 72 65 63 75 72 73 69 76  der the recursiv
1800: 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20  e mutex so.  ** 
1810: 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
1820: 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72  able to handle r
1830: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69  ecursive calls i
1840: 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1850: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
1860: 54 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  The recursive ca
1870: 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d  lls normally com
1880: 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73  e through.  ** s
1890: 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29  qlite3_os_init()
18a0: 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73   when it invokes
18b0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
18c0: 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68  ister(), but oth
18d0: 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76  er.  ** recursiv
18e0: 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c  e calls might al
18f0: 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a  so be possible..
1900: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
1910: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
1920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1930: 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66  InitMutex);.  if
1940: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1950: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20  onfig.isInit==0 
1960: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
1970: 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73  Config.inProgres
1980: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 46 75 6e 63  s==0 ){.    Func
1990: 44 65 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d  DefHash *pHash =
19a0: 20 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66   &GLOBAL(FuncDef
19b0: 48 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f  Hash, sqlite3Glo
19c0: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20  balFunctions);. 
19d0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
19e0: 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73  Config.inProgres
19f0: 73 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  s = 1;.    memse
1a00: 74 28 70 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  t(pHash, 0, size
1a10: 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  of(sqlite3Global
1a20: 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20  Functions));.   
1a30: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
1a40: 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28  GlobalFunctions(
1a50: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1a60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1a70: 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29  sPCacheInit==0 )
1a80: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1a90: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
1aa0: 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20  lize();.    }.  
1ab0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ac0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1ad0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ae0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
1af0: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
1b00: 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20  lite3OsInit();. 
1b10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1b20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b30: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
1b40: 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71  eBufferSetup( sq
1b50: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b60: 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20  g.pPage, .      
1b70: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1b80: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20  lConfig.szPage, 
1b90: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ba0: 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20  fig.nPage);.    
1bb0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1bc0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31  onfig.isInit = 1
1bd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1be0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1bf0: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  inProgress = 0;.
1c00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1c10: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1c20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1c30: 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  nitMutex);..  /*
1c40: 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74   Go back under t
1c50: 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  he static mutex 
1c60: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
1c70: 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20   recursive.  ** 
1c80: 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74  mutex to prevent
1c90: 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b   a resource leak
1ca0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1cb0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
1cc0: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
1cd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
1ce0: 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20  fInitMutex--;.  
1cf0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1d00: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1d10: 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20  Mutex<=0 ){.    
1d20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
1d30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
1d40: 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  InitMutex==0 );.
1d50: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1d60: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c  x_free(sqlite3Gl
1d70: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1d80: 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Mutex);.    sqli
1d90: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1da0: 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a  pInitMutex = 0;.
1db0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1dc0: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
1dd0: 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  r);..  /* The fo
1de0: 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20  llowing is just 
1df0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74  a sanity check t
1e00: 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  o make sure SQLi
1e10: 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  te has.  ** been
1e20: 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63   compiled correc
1e30: 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f  tly.  It is impo
1e40: 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69  rtant to run thi
1e50: 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a  s code, but.  **
1e60: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
1e70: 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74  o run it too oft
1e80: 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43  en and soak up C
1e90: 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f  PU cycles for no
1ea0: 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53  .  ** reason.  S
1eb0: 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65  o we run it once
1ec0: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
1ed0: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  zation..  */.#if
1ee0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e  ndef NDEBUG.#ifn
1ef0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f00: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
1f10: 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   /* This section
1f20: 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20   of code's only 
1f30: 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20  "output" is via 
1f40: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1f50: 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72  nts. */.  if ( r
1f60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f70: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75      u64 x = (((u
1f80: 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20  64)1)<<63)-1;.  
1f90: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
1fa0: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
1fb0: 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ==8);.    assert
1fc0: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65  (sizeof(x)==size
1fd0: 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63  of(y));.    memc
1fe0: 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20  py(&y, &x, 8);. 
1ff0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2000: 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20  e3IsNaN(y) );.  
2010: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
2020: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2030: 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20  ./*.** Undo the 
2040: 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74  effects of sqlit
2050: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e  e3_initialize().
2060: 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61    Must not be ca
2070: 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68  lled while.** th
2080: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
2090: 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ing database con
20a0: 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f  nections or memo
20b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f  ry allocations o
20c0: 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70  r.** while any p
20d0: 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73  art of SQLite is
20e0: 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
20f0: 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e  e in any thread.
2100: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
2110: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
2120: 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73 20  afe.  But it is 
2130: 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74  safe to invoke t
2140: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f  his routine.** o
2150: 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73  n when SQLite is
2160: 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f   already shut do
2170: 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69  wn.  If SQLite i
2180: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
2190: 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  own.** when this
21a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
21b0: 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ked, then this r
21c0: 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d  outine is a harm
21d0: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  less no-op..*/.i
21e0: 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  nt sqlite3_shutd
21f0: 6f 77 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  own(void){.  if(
2200: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2210: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20  nfig.isInit ){. 
2220: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e     sqlite3_os_en
2230: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2240: 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65  _reset_auto_exte
2250: 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c  nsion();.    sql
2260: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2270: 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  .isInit = 0;.  }
2280: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2290: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
22a0: 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  cheInit ){.    s
22b0: 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74  qlite3PcacheShut
22c0: 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  down();.    sqli
22d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
22e0: 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30  isPCacheInit = 0
22f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2300: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2310: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a  isMallocInit ){.
2320: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f      sqlite3Mallo
2330: 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  cEnd();.    sqli
2340: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2350: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30  isMallocInit = 0
2360: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2380: 69 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20  isMutexInit ){. 
2390: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45     sqlite3MutexE
23a0: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
23b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
23c0: 4d 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20  MutexInit = 0;. 
23d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
23e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23f0: 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73   This API allows
2400: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f   applications to
2410: 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62   modify the glob
2420: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
2430: 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74   of.** the SQLit
2440: 65 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e  e library at run
2450: 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -time..**.** Thi
2460: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2470: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2480: 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
2490: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a  o outstanding.**
24a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
24b0: 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20  tions or memory 
24c0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  allocations.  Th
24d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
24e0: 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e  t.** threadsafe.
24f0: 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65    Failure to hee
2500: 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73  d these warnings
2510: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70   can lead to unp
2520: 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65  redictable.** be
2530: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
2540: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e  qlite3_config(in
2550: 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  t op, ...){.  va
2560: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
2570: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2580: 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  /* sqlite3_co
2590: 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74  nfig() shall ret
25a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
25b0: 45 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b  E if it is invok
25c0: 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68  ed while.  ** th
25d0: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
25e0: 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20   is in use. */. 
25f0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2600: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2610: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2620: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20  MISUSE_BKPT;..  
2630: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
2640: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
2650: 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  {..    /* Mutex 
2660: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70  configuration op
2670: 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61  tions are only a
2680: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68  vailable in a th
2690: 72 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20  readsafe.    ** 
26a0: 63 6f 6d 70 69 6c 65 2e 20 0a 20 20 20 20 2a 2f  compile. .    */
26b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
26c0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20  ITE_THREADSAFE) 
26d0: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
26e0: 53 41 46 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SAFE>0.    case 
26f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49  SQLITE_CONFIG_SI
2700: 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20 20  NGLETHREAD: {.  
2710: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 61      /* Disable a
2720: 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20  ll mutexing */. 
2730: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2740: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
2750: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  tex = 0;.      s
2760: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2770: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
2780: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
2790: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
27a0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c  QLITE_CONFIG_MUL
27b0: 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20  TITHREAD: {.    
27c0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74    /* Disable mut
27d0: 65 78 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73  exing of databas
27e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
27f0: 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  .      /* Enable
2800: 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 63 6f 72   mutexing of cor
2810: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
2820: 73 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  s */.      sqlit
2830: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2840: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20  CoreMutex = 1;. 
2850: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2860: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
2870: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
2880: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2890: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
28a0: 49 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b  IG_SERIALIZED: {
28b0: 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  .      /* Enable
28c0: 20 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f   all mutexing */
28d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
28e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
28f0: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
2900: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2910: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2920: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
2930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2940: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
2950: 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  UTEX: {.      /*
2960: 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65   Specify an alte
2970: 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d  rnative mutex im
2980: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
2990: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
29a0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20  balConfig.mutex 
29b0: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
29c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
29d0: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
29e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
29f0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2a00: 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20  _GETMUTEX: {.   
2a10: 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20 74     /* Retrieve t
2a20: 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65 78  he current mutex
2a30: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2a40: 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67  */.      *va_arg
2a50: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
2a60: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73  ex_methods*) = s
2a70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2a80: 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20 20  ig.mutex;.      
2a90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
2aa0: 64 69 66 0a 0a 0a 20 20 20 20 63 61 73 65 20 53  dif...    case S
2ab0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
2ac0: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
2ad0: 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72  Specify an alter
2ae0: 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63 20 69 6d  native malloc im
2af0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
2b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2b10: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76  balConfig.m = *v
2b20: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
2b30: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b  3_mem_methods*);
2b40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2b50: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2b60: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41  ITE_CONFIG_GETMA
2b70: 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LLOC: {.      /*
2b80: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
2b90: 72 72 65 6e 74 20 6d 61 6c 6c 6f 63 28 29 20 69  rrent malloc() i
2ba0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
2bb0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
2bc0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2bd0: 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71  .xMalloc==0 ) sq
2be0: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
2bf0: 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f  lt();.      *va_
2c00: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
2c10: 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  mem_methods*) = 
2c20: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2c30: 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65  fig.m;.      bre
2c40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2c50: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2c60: 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20  _MEMSTATUS: {.  
2c70: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6f 72      /* Enable or
2c80: 20 64 69 73 61 62 6c 65 20 74 68 65 20 6d 61 6c   disable the mal
2c90: 6c 6f 63 20 73 74 61 74 75 73 20 63 6f 6c 6c 65  loc status colle
2ca0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ction */.      s
2cb0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2cc0: 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76 61  ig.bMemstat = va
2cd0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
2ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2cf0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2d00: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
2d10: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
2d20: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
2d30: 66 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d 6f  for scratch memo
2d40: 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ry space */.    
2d50: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2d60: 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20 3d  onfig.pScratch =
2d70: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
2d80: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
2d90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
2da0: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
2db0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
2dc0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2dd0: 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d 20  nfig.nScratch = 
2de0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2df0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2e00: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2e10: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43  ITE_CONFIG_PAGEC
2e20: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
2e30: 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66   Designate a buf
2e40: 66 65 72 20 66 6f 72 20 70 61 67 65 20 63 61 63  fer for page cac
2e50: 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
2e60: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2e70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
2e80: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
2e90: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
2ea0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2eb0: 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72  g.szPage = va_ar
2ec0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
2ed0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2ee0: 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61  onfig.nPage = va
2ef0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
2f00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f10: 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  }..    case SQLI
2f20: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
2f30: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
2f40: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
2f50: 69 76 65 20 70 61 67 65 20 63 61 63 68 65 20 69  ive page cache i
2f60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  mplementation */
2f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2f80: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
2f90: 65 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  e = *va_arg(ap, 
2fa0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
2fb0: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
2fc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
2fd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2fe0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20  NFIG_GETPCACHE: 
2ff0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
3000: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3010: 70 63 61 63 68 65 2e 78 49 6e 69 74 3d 3d 30 20  pcache.xInit==0 
3020: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3030: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
3040: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
3050: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
3060: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
3070: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
3080: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3090: 63 61 63 68 65 3b 0a 20 20 20 20 20 20 62 72 65  cache;.      bre
30a0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  ak;.    }..#if d
30b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
30c0: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
30d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
30e0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
30f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3100: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
3110: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
3120: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 68  e a buffer for h
3130: 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  eap memory space
3140: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3150: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
3160: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
3170: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3180: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3190: 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72  ig.nHeap = va_ar
31a0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
31b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
31c0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61  onfig.mnReq = va
31d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a  _arg(ap, int);..
31e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
31f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
3200: 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eap==0 ){.      
3210: 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61 70    /* If the heap
3220: 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c   pointer is NULL
3230: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
3240: 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d  he malloc implem
3250: 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20 20 20  entation.       
3260: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c   ** back to NULL
3270: 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20   pointers too.  
3280: 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20  This will cause 
3290: 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f  the malloc to go
32a0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
32b0: 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20   to its default 
32c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
32d0: 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  hen sqlite3_init
32e0: 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20 20 20  ialize() is.    
32f0: 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20      ** run..    
3300: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d      */.        m
3310: 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c  emset(&sqlite3Gl
3320: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c  obalConfig.m, 0,
3330: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47   sizeof(sqlite3G
3340: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b  lobalConfig.m));
3350: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3360: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61        /* The hea
3370: 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74  p pointer is not
3380: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74   NULL, then inst
3390: 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20  all one of the. 
33a0: 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63         ** mem5.c
33b0: 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e  /mem3.c methods.
33c0: 20 49 66 20 6e 65 69 74 68 65 72 20 45 4e 41 42   If neither ENAB
33d0: 4c 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20  LE_MEMSYS3 nor. 
33e0: 20 20 20 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45         ** ENABLE
33f0: 5f 4d 45 4d 53 59 53 35 20 69 73 20 64 65 66 69  _MEMSYS5 is defi
3400: 6e 65 64 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ned, return an e
3410: 72 72 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  rror..        */
3420: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3430: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20  NABLE_MEMSYS3.  
3440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3450: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73  balConfig.m = *s
3460: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
3470: 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ys3();.#endif.#i
3480: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3490: 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20  LE_MEMSYS5.     
34a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
34b0: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
34c0: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35  te3MemGetMemsys5
34d0: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ();.#endif.     
34e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
34f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
3500: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3510: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20  NFIG_LOOKASIDE: 
3520: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
3530: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
3540: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
3550: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3560: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3570: 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20  nfig.nLookaside 
3580: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3590: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
35a0: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f      }.    .    /
35b0: 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  * Record a point
35c0: 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72  er to the logger
35d0: 20 66 75 6e 63 63 74 69 6f 6e 20 61 6e 64 20 69   funcction and i
35e0: 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ts first argumen
35f0: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65  t..    ** The de
3600: 66 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20  fault is NULL.  
3610: 4c 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61 62  Logging is disab
3620: 6c 65 64 20 69 66 20 74 68 65 20 66 75 6e 63 74  led if the funct
3630: 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20  ion pointer is. 
3640: 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20     ** NULL..    
3650: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3660: 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b  TE_CONFIG_LOG: {
3670: 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69  .      /* MSVC i
3680: 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75  s picky about pu
3690: 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20  lling func ptrs 
36a0: 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20  from va lists.. 
36b0: 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73       ** http://s
36c0: 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74  upport.microsoft
36d0: 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20  .com/kb/47961.  
36e0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c      ** sqlite3Gl
36f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20  obalConfig.xLog 
3700: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3710: 64 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  d(*)(void*,int,c
3720: 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20  onst char*));.  
3730: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70      */.      typ
3740: 65 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55  edef void(*LOGFU
3750: 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  NC_t)(void*,int,
3760: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
3770: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3780: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
3790: 61 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e  a_arg(ap, LOGFUN
37a0: 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  C_t);.      sqli
37b0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
37c0: 70 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67  pLogArg = va_arg
37d0: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
37e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
37f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
3800: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
3810: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3820: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3830: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
3840: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
3850: 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c  .** Set up the l
3860: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73  ookaside buffers
3870: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
3880: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52  connection..** R
3890: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
38a0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a  on success.  .**
38b0: 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73   If lookaside is
38c0: 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c   already active,
38d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
38e0: 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  USY..**.** The s
38f0: 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  z parameter is t
3900: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
3910: 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61  es in each looka
3920: 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68  side slot..** Th
3930: 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20  e cnt parameter 
3940: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
3950: 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61   slots.  If pSta
3960: 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a  rt is NULL the.*
3970: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
3980: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
3990: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
39a0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
39b0: 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74  ()..** If pStart
39c0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
39d0: 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62  n it is sz*cnt b
39e0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74  ytes of memory t
39f0: 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65  o use for.** the
3a00: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
3a10: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
3a20: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
3a30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
3a40: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c  d *pBuf, int sz,
3a50: 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69   int cnt){.  voi
3a60: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
3a70: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
3a80: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
3a90: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
3aa0: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
3ab0: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
3ac0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
3ad0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
3ae0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
3af0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
3b00: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
3b10: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
3b20: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
3b30: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
3b40: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
3b50: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
3b60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
3b70: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
3b80: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
3b90: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
3ba0: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
3bb0: 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67  needs to be larg
3bc0: 65 72 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65  er than a pointe
3bd0: 72 0a 20 20 2a 2a 20 74 6f 20 62 65 20 75 73 65  r.  ** to be use
3be0: 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ful..  */.  if( 
3bf0: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
3c00: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
3c10: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
3c20: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
3c30: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
3c40: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
3c50: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
3c60: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
3c70: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
3c80: 20 73 7a 20 3d 20 52 4f 55 4e 44 38 28 73 7a 29   sz = ROUND8(sz)
3c90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
3ca0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
3cb0: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73  ;.    pStart = s
3cc0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a  qlite3Malloc( sz
3cd0: 2a 63 6e 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  *cnt );.    sqli
3ce0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
3cf0: 6f 63 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oc();.  }else{. 
3d00: 20 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57     sz = ROUNDDOW
3d10: 4e 38 28 73 7a 29 3b 0a 20 20 20 20 70 53 74 61  N8(sz);.    pSta
3d20: 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20  rt = pBuf;.  }. 
3d30: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3d40: 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a  Start = pStart;.
3d50: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
3d60: 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d  pFree = 0;.  db-
3d70: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20  >lookaside.sz = 
3d80: 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70  (u16)sz;.  if( p
3d90: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74  Start ){.    int
3da0: 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64   i;.    Lookasid
3db0: 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73  eSlot *p;.    as
3dc0: 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29  sert( sz > (int)
3dd0: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
3de0: 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20  Slot*) );.    p 
3df0: 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  = (LookasideSlot
3e00: 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f  *)pStart;.    fo
3e10: 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b  r(i=cnt-1; i>=0;
3e20: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
3e30: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  pNext = db->look
3e40: 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20  aside.pFree;.   
3e50: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
3e60: 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20  .pFree = p;.    
3e70: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
3e80: 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b  Slot*)&((u8*)p)[
3e90: 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  sz];.    }.    d
3ea0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
3eb0: 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = p;.    db->l
3ec0: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
3ed0: 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 1;.    db->l
3ee0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
3ef0: 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a  ed = pBuf==0 ?1:
3f00: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
3f10: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
3f20: 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  nd = 0;.    db->
3f30: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
3f40: 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ed = 0;.    db->
3f50: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
3f60: 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ced = 0;.  }.  r
3f70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3f80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3f90: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
3fa0: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
3fb0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3fc0: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74  ..*/.sqlite3_mut
3fd0: 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ex *sqlite3_db_m
3fe0: 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  utex(sqlite3 *db
3ff0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
4000: 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mutex;.}../*.** 
4010: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4020: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4030: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4040: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4050: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4060: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
4070: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
4080: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
4090: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
40a0: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
40b0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
40c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
40d0: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
40e0: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
40f0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
4100: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69   void*);.      i
4110: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
4120: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
4130: 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28  nt cnt = va_arg(
4140: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4150: 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73  rc = setupLookas
4160: 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a  ide(db, pBuf, sz
4170: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , cnt);.      br
4180: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
4190: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
41a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
41b0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
41c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
41d0: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
41e0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
41f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
4200: 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d  e buffer z[0..n-
4210: 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  1] contains all 
4220: 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
4230: 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28  c int allSpaces(
4240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
4250: 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt n){.  while( 
4260: 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>0 && z[n-1]=='
4270: 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72   ' ){ n--; }.  r
4280: 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f  eturn n==0;.}../
4290: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
42a0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
42b0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ng function name
42c0: 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68  d "BINARY" which
42d0: 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76   is always.** av
42e0: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  ailable..**.** I
42f0: 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72  f the padFlag ar
4300: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
4310: 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61  LL then space pa
4320: 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  dding at the end
4330: 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69  .** of strings i
4340: 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  s ignored.  This
4350: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
4360: 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e  RTRIM collation.
4370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4380: 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  inCollFunc(.  vo
4390: 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69  id *padFlag,.  i
43a0: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
43b0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
43c0: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
43d0: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
43e0: 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
43f0: 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
4400: 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
4410: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
4420: 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
4430: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
4440: 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20    if( padFlag.  
4450: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
4460: 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e  ((char*)pKey1)+n
4470: 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20  , nKey1-n).     
4480: 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63  && allSpaces(((c
4490: 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e  har*)pKey2)+n, n
44a0: 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20  Key2-n).    ){. 
44b0: 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63       /* Leave rc
44c0: 20 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20   unchanged at 0 
44d0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
44e0: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
44f0: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
4500: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4510: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
4520: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
4530: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
4540: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
4550: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
4560: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
4570: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
4580: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74  case independant
4590: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
45a0: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
45b0: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
45c0: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
45d0: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
45e0: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
45f0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
4600: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
4610: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
4620: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
4630: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
4640: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
4650: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
4660: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
4670: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
4680: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
4690: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
46a0: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
46b0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
46c0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
46d0: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
46e0: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
46f0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
4700: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
4710: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
4720: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
4730: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
4740: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
4750: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
4760: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
4770: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4780: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4790: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
47a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
47b0: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
47c0: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
47d0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
47e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
47f0: 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52  return db->lastR
4800: 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  owid;.}../*.** R
4810: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
4820: 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74   of changes in t
4830: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
4840: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
4850: 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xec()..*/.int sq
4860: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71  lite3_changes(sq
4870: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
4880: 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65  turn db->nChange
4890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
48a0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
48b0: 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68  changes since th
48c0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
48d0: 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f  e was opened..*/
48e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74  .int sqlite3_tot
48f0: 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74  al_changes(sqlit
4900: 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
4910: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
4920: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
4930: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
4940: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
4950: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
4960: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
4970: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
4980: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
4990: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
49a0: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
49b0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
49c0: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
49d0: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
49e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
49f0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
4a00: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
4a10: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
4a20: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
4a30: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
4a40: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
4a50: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
4a60: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
4a70: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4a80: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
4a90: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
4aa0: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
4ab0: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
4ac0: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
4ad0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
4ae0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
4af0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
4b00: 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  nction associate
4b10: 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70  d with FuncDef p
4b20: 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74  , if any. Except
4b30: 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  ,.** if this is 
4b40: 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70  not the last cop
4b50: 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  y of the functio
4b60: 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  n, do not invoke
4b70: 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a   it. Multiple.**
4b80: 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e   copies of a sin
4b90: 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  gle function are
4ba0: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72   created when cr
4bb0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  eate_function() 
4bc0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74  is called.** wit
4bd0: 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20  h SQLITE_ANY as 
4be0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  the encoding..*/
4bf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e  .static void fun
4c00: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c  ctionDestroy(sql
4c10: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
4c20: 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73  f *p){.  FuncDes
4c30: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
4c40: 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72  ctor = p->pDestr
4c50: 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65  uctor;.  if( pDe
4c60: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
4c70: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
4c80: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  f--;.    if( pDe
4c90: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d  structor->nRef==
4ca0: 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74  0 ){.      pDest
4cb0: 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79  ructor->xDestroy
4cc0: 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55  (pDestructor->pU
4cd0: 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
4ce0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4cf0: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
4d00: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4d10: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73  ** Close an exis
4d20: 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61  ting SQLite data
4d30: 62 61 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  base.*/.int sqli
4d40: 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65  te3_close(sqlite
4d50: 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c  3 *db){.  HashEl
4d60: 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20  em *i;          
4d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
4d80: 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72  h table iterator
4d90: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20   */.  int j;..  
4da0: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
4db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
4dc0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
4dd0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
4de0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
4df0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4e00: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
4e10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4e20: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4e30: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52 65 73  );..  sqlite3Res
4e40: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
4e50: 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 49  (db, 0);..  /* I
4e60: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
4e70: 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 52 65 73  is open, the Res
4e80: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
4e90: 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20  () call above.  
4ea0: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65  ** will not have
4eb0: 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73   called the xDis
4ec0: 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64  connect() method
4ed0: 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a   on any virtual.
4ee0: 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74    ** tables in t
4ef0: 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d  he db->aVTrans[]
4f00: 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c   array. The foll
4f10: 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61  owing sqlite3Vta
4f20: 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a  bRollback().  **
4f30: 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f   call will do so
4f40: 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20  . We need to do 
4f50: 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65 20  this before the 
4f60: 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65  check for active
4f70: 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
4f80: 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74  ents below, as t
4f90: 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65  he v-table imple
4fa0: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65  mentation may be
4fb0: 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f   storing.  ** so
4fc0: 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  me prepared stat
4fd0: 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c  ements internall
4fe0: 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
4ff0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
5000: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
5010: 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61  e are any outsta
5020: 6e 64 69 6e 67 20 56 4d 73 2c 20 72 65 74 75 72  nding VMs, retur
5030: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a  n SQLITE_BUSY. *
5040: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  /.  if( db->pVdb
5050: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
5060: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
5070: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
5080: 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65  "unable to close
5090: 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69   due to unfinali
50a0: 73 65 64 20 73 74 61 74 65 6d 65 6e 74 73 22 29  sed statements")
50b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
50c0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
50d0: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
50e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
50f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
5100: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
5110: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 3b 0a 0a 20  ckOrOk(db) );.. 
5120: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
5130: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42  nDb; j++){.    B
5140: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
5150: 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[j].pBt;.    
5160: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74  if( pBt && sqlit
5170: 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75  e3BtreeIsInBacku
5180: 70 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  p(pBt) ){.      
5190: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
51a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
51b0: 20 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65           "unable
51c0: 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f   to close due to
51d0: 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b   unfinished back
51e0: 75 70 20 6f 70 65 72 61 74 69 6f 6e 22 29 3b 0a  up operation");.
51f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5200: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
5210: 74 65 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tex);.      retu
5220: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5230: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5240: 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e  Free any outstan
5250: 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73  ding Savepoint s
5260: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20  tructures. */.  
5270: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
5280: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 66  points(db);..  f
5290: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
52a0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; j++){.    str
52b0: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
52c0: 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69  b->aDb[j];.    i
52d0: 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20  f( pDb->pBt ){. 
52e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
52f0: 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29  eClose(pDb->pBt)
5300: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74  ;.      pDb->pBt
5310: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
5320: 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j!=1 ){.        
5330: 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30  pDb->pSchema = 0
5340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5350: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 73    }.  sqlite3Res
5360: 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61  etInternalSchema
5370: 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54  (db, 0);..  /* T
5380: 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ell the code in 
5390: 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68  notify.c that th
53a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20  e connection no 
53b0: 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79  longer holds any
53c0: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20  .  ** locks and 
53d0: 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
53e0: 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c   any further unl
53f0: 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
5400: 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  acks..  */.  sql
5410: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c  ite3ConnectionCl
5420: 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 61 73 73  osed(db);..  ass
5430: 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20  ert( db->nDb<=2 
5440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
5450: 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb==db->aDbSta
5460: 74 69 63 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  tic );.  for(j=0
5470: 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64 62  ; j<ArraySize(db
5480: 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29  ->aFunc.a); j++)
5490: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
54a0: 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70  Next, *pHash, *p
54b0: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e  ;.    for(p=db->
54c0: 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70  aFunc.a[j]; p; p
54d0: 3d 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 70  =pHash){.      p
54e0: 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b  Hash = p->pHash;
54f0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
5500: 29 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74  ){.        funct
5510: 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70  ionDestroy(db, p
5520: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  );.        pNext
5530: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
5540: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5550: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
5560: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
5570: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5580: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
5590: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
55a0: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
55b0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
55c0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
55d0: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
55e0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
55f0: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
5600: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
5610: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
5620: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
5630: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
5640: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
5650: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
5660: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
5670: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
5680: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
5690: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
56a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
56b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
56c0: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
56d0: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
56e0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
56f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5700: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
5710: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
5720: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
5730: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
5740: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
5750: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
5760: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
5770: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
5780: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
5790: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
57a0: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
57b0: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
57c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
57d0: 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ree(db, pMod);. 
57e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
57f0: 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75  Clear(&db->aModu
5800: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  le);.#endif..  s
5810: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
5820: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f  SQLITE_OK, 0); /
5830: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
5840: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
5850: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 69 66 28  trings. */.  if(
5860: 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20   db->pErr ){.   
5870: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
5880: 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d  e(db->pErr);.  }
5890: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
58a0: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a  xtensions(db);..
58b0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
58c0: 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
58d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70  ;..  /* The temp
58e0: 2d 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  -database schema
58f0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69   is allocated di
5900: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
5910: 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a  he other schema.
5920: 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73    ** objects (us
5930: 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ing sqliteMalloc
5940: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  () directly, ins
5950: 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42  tead of sqlite3B
5960: 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20  treeSchema()).. 
5970: 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20   ** So it needs 
5980: 74 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65  to be freed here
5990: 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20  . Todo: Why not 
59a0: 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63  roll the temp sc
59b0: 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  hema into.  ** t
59c0: 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61  he same sqliteMa
59d0: 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e  lloc() as the on
59e0: 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73  e that allocates
59f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
5a00: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20   ** structure?. 
5a10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
5a20: 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  ree(db, db->aDb[
5a30: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  1].pSchema);.  s
5a40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5a50: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
5a60: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
5a70: 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
5a80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
5a90: 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78  x_free(db->mutex
5aa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
5ab0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d  >lookaside.nOut=
5ac0: 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20  =0 );  /* Fails 
5ad0: 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  on a lookaside m
5ae0: 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20  emory leak */.  
5af0: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
5b00: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20  e.bMalloced ){. 
5b10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5b20: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
5b30: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tart);.  }.  sql
5b40: 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20  ite3_free(db);. 
5b50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5b60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
5b70: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
5b80: 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e files..*/.void
5b90: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
5ba0: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 29  All(sqlite3 *db)
5bb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
5bc0: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
5bd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5be0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
5bf0: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
5c00: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
5c10: 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30  loc();.  for(i=0
5c20: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
5c30: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
5c40: 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20 20 20  Db[i].pBt ){.   
5c50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
5c60: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 64 62 2d  reeIsInTrans(db-
5c70: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
5c80: 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20          inTrans 
5c90: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
5ca0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
5cb0: 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44 62 5b  ollback(db->aDb[
5cc0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 64  i].pBt);.      d
5cd0: 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e  b->aDb[i].inTran
5ce0: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
5cf0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
5d00: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
5d10: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
5d20: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 64  lloc();..  if( d
5d30: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
5d40: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
5d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
5d60: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
5d70: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
5d80: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
5d90: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
5da0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 79 20 64  .  }..  /* Any d
5db0: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
5dc0: 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61  nt violations ha
5dd0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f  ve now been reso
5de0: 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e  lved. */.  db->n
5df0: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
5e00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68  ;..  /* If one h
5e10: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
5e20: 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72  ed, invoke the r
5e30: 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c  ollback-hook cal
5e40: 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64  lback */.  if( d
5e50: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
5e60: 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73  back && (inTrans
5e70: 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d   || !db->autoCom
5e80: 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e  mit) ){.    db->
5e90: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
5ea0: 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  k(db->pRollbackA
5eb0: 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
5ec0: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
5ed0: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
5ee0: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
5ef0: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
5f00: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
5f10: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
5f20: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
5f30: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
5f40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5f50: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
5f60: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
5f70: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
5f80: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
5f90: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
5fa0: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
5fb0: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
5fc0: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
5fd0: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
5fe0: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
5ff0: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
6000: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
6010: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
6020: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
6030: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
6040: 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c  T       */ "call
6050: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
6060: 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20  uery abort",.   
6070: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
6080: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
6090: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
60a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
60b0: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
60c0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
60d0: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
60e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
60f0: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
6100: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
6110: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
6120: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
6130: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
6140: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
6150: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
6160: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
6170: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
6180: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
6190: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
61a0: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
61b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
61c0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
61d0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
61e0: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
61f0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
6200: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
6210: 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20  QLITE_FULL      
6220: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f    */ "database o
6230: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c  r disk is full",
6240: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
6250: 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75  ANTOPEN    */ "u
6260: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
6270: 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20  tabase file",.  
6280: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54    /* SQLITE_PROT
6290: 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b  OCOL    */ "lock
62a0: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20  ing protocol",. 
62b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50     /* SQLITE_EMP
62c0: 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62  TY       */ "tab
62d0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  le contains no d
62e0: 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ata",.    /* SQL
62f0: 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20  ITE_SCHEMA      
6300: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68  */ "database sch
6310: 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
6320: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6330: 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22  TOOBIG      */ "
6340: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74  string or blob t
6350: 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20  oo big",.    /* 
6360: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
6370: 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e  T  */ "constrain
6380: 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f  t failed",.    /
6390: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  * SQLITE_MISMATC
63a0: 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70  H    */ "datatyp
63b0: 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20  e mismatch",.   
63c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53   /* SQLITE_MISUS
63d0: 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61  E      */ "libra
63e0: 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65  ry routine calle
63f0: 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63  d out of sequenc
6400: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
6410: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
6420: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
6430: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
6440: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6450: 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20  _AUTH        */ 
6460: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64  "authorization d
6470: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
6480: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20  QLITE_FORMAT    
6490: 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20    */ "auxiliary 
64a0: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
64b0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
64c0: 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20  QLITE_RANGE     
64d0: 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f    */ "bind or co
64e0: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
64f0: 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a  f range",.    /*
6500: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20   SQLITE_NOTADB  
6510: 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20      */ "file is 
6520: 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20  encrypted or is 
6530: 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c  not a database",
6540: 0a 20 20 7d 3b 0a 20 20 72 63 20 26 3d 20 30 78  .  };.  rc &= 0x
6550: 66 66 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  ff;.  if( ALWAYS
6560: 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 28 69  (rc>=0) && rc<(i
6570: 6e 74 29 28 73 69 7a 65 6f 66 28 61 4d 73 67 29  nt)(sizeof(aMsg)
6580: 2f 73 69 7a 65 6f 66 28 61 4d 73 67 5b 30 5d 29  /sizeof(aMsg[0])
6590: 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30  ) && aMsg[rc]!=0
65a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
65b0: 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d 65 6c 73 65  Msg[rc];.  }else
65c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e  {.    return "un
65d0: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20  known error";.  
65e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
65f0: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
6600: 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61  ts a busy callba
6610: 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61  ck that sleeps a
6620: 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69  nd tries.** agai
6630: 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75  n until a timeou
6640: 74 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68  t value is reach
6650: 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74  ed.  The timeout
6660: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20   value is.** an 
6670: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
6680: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70  f milliseconds p
6690: 61 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20  assed in as the 
66a0: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
66b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
66c0: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
66d0: 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69  syCallback(. voi
66e0: 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20  d *ptr,         
66f0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
6700: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
6710: 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20   int count      
6720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6730: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62  ber of times tab
6740: 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79  le has been busy
6750: 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54   */.){.#if SQLIT
6760: 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66  E_OS_WIN || (def
6770: 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
6780: 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
6790: 29 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ).  static const
67a0: 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20   u8 delays[] =. 
67b0: 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31      { 1, 2, 5, 1
67c0: 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32  0, 15, 20, 25, 2
67d0: 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30  5,  25,  50,  50
67e0: 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69  , 100 };.  stati
67f0: 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c  c const u8 total
6800: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20  s[] =.     { 0, 
6810: 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33  1, 3,  8, 18, 33
6820: 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31  , 53, 78, 103, 1
6830: 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a  28, 178, 228 };.
6840: 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20  # define NDELAY 
6850: 28 73 69 7a 65 6f 66 28 64 65 6c 61 79 73 29 2f  (sizeof(delays)/
6860: 73 69 7a 65 6f 66 28 64 65 6c 61 79 73 5b 30 5d  sizeof(delays[0]
6870: 29 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  )).  sqlite3 *db
6880: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
6890: 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  r;.  int timeout
68a0: 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f   = db->busyTimeo
68b0: 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c  ut;.  int delay,
68c0: 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72   prior;..  asser
68d0: 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20  t( count>=0 );. 
68e0: 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45   if( count < NDE
68f0: 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  LAY ){.    delay
6900: 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d   = delays[count]
6910: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
6920: 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d  tals[count];.  }
6930: 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20  else{.    delay 
6940: 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d  = delays[NDELAY-
6950: 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  1];.    prior = 
6960: 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d  totals[NDELAY-1]
6970: 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d   + delay*(count-
6980: 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d  (NDELAY-1));.  }
6990: 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64  .  if( prior + d
69a0: 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29  elay > timeout )
69b0: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69  {.    delay = ti
69c0: 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20  meout - prior;. 
69d0: 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20     if( delay<=0 
69e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
69f0: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
6a00: 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79  (db->pVfs, delay
6a10: 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  *1000);.  return
6a20: 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69   1;.#else.  sqli
6a30: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
6a40: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
6a50: 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69  timeout = ((sqli
6a60: 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79  te3 *)ptr)->busy
6a70: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28  Timeout;.  if( (
6a80: 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20  count+1)*1000 > 
6a90: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72  timeout ){.    r
6aa0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
6ab0: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
6ac0: 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30 29  ->pVfs, 1000000)
6ad0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
6ae0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ndif.}../*.** In
6af0: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62  voke the given b
6b00: 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a  usy handler..**.
6b10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6b20: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
6b30: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  n operation fail
6b40: 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a  ed with a lock..
6b50: 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
6b60: 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ne returns non-z
6b70: 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
6b80: 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69 74   retried.  If it
6b90: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74  .** returns 0, t
6ba0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f  he operation abo
6bb0: 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49  rts with an SQLI
6bc0: 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a  TE_BUSY error..*
6bd0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76  /.int sqlite3Inv
6be0: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42  okeBusyHandler(B
6bf0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a  usyHandler *p){.
6c00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
6c10: 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70  NEVER(p==0) || p
6c20: 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d  ->xFunc==0 || p-
6c30: 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72  >nBusy<0 ) retur
6c40: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78  n 0;.  rc = p->x
6c50: 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d  Func(p->pArg, p-
6c60: 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72  >nBusy);.  if( r
6c70: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  c==0 ){.    p->n
6c80: 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  Busy = -1;.  }el
6c90: 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79  se{.    p->nBusy
6ca0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
6cb0: 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   rc; .}../*.** T
6cc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
6cd0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
6ce0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
6cf0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
6d00: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
6d10: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
6d20: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
6d30: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
6d40: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
6d50: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6d60: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28  .  int (*xBusy)(
6d70: 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f  void*,int),.  vo
6d80: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71  id *pArg.){.  sq
6d90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6da0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6db0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
6dc0: 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20  xFunc = xBusy;. 
6dd0: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
6de0: 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  .pArg = pArg;.  
6df0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
6e00: 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c  nBusy = 0;.  sql
6e10: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6e20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6e30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6e40: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6e50: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
6e60: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
6e70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
6e80: 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  s the progress c
6e90: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
6ea0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
6eb0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
6ec0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
6ed0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
6ee0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72  argument. The pr
6ef0: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
6f00: 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  will.** be invok
6f10: 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70  ed every nOps op
6f20: 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  codes..*/.void s
6f30: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
6f40: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
6f50: 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e  e3 *db, .  int n
6f60: 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72  Ops,.  int (*xPr
6f70: 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20  ogress)(void*), 
6f80: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
6f90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6fa0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
6fb0: 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20  );.  if( nOps>0 
6fc0: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  ){.    db->xProg
6fd0: 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73  ress = xProgress
6fe0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
6ff0: 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a 20  essOps = nOps;. 
7000: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
7010: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65  Arg = pArg;.  }e
7020: 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  lse{.    db->xPr
7030: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
7040: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
7050: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50   = 0;.    db->pP
7060: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a  rogressArg = 0;.
7070: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
7080: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7090: 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  tex);.}.#endif..
70a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
70b0: 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64  ine installs a d
70c0: 65 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64  efault busy hand
70d0: 6c 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66  ler that waits f
70e0: 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  or the.** specif
70f0: 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ied number of mi
7100: 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72  lliseconds befor
7110: 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a  e returning 0..*
7120: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
7130: 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74  sy_timeout(sqlit
7140: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b  e3 *db, int ms){
7150: 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20  .  if( ms>0 ){. 
7160: 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f     db->busyTimeo
7170: 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20 73 71 6c  ut = ms;.    sql
7180: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
7190: 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61  r(db, sqliteDefa
71a0: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c  ultBusyCallback,
71b0: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 7d   (void*)db);.  }
71c0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
71d0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
71e0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  b, 0, 0);.  }.  
71f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7200: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65  ;.}../*.** Cause
7210: 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65   any pending ope
7220: 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61  ration to stop a
7230: 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f  t its earliest o
7240: 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76  pportunity..*/.v
7250: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  oid sqlite3_inte
7260: 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64  rrupt(sqlite3 *d
7270: 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49  b){.  db->u1.isI
7280: 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a  nterrupted = 1;.
7290: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
72a0: 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74  unction is exact
72b0: 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  ly the same as s
72c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
72d0: 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74  nction(), except
72e0: 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 64  .** that it is d
72f0: 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61  esigned to be ca
7300: 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c  lled by internal
7310: 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65   code. The diffe
7320: 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74  rence is.** that
7330: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
7340: 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f  ails in sqlite3_
7350: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
7360: 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ), an error code
7370: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
7380: 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61  and the mallocFa
7390: 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65  iled flag cleare
73a0: 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  d. .*/.int sqlit
73b0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20  e3CreateFunc(.  
73c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
73d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
73e0: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
73f0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
7400: 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61  .  void *pUserDa
7410: 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  ta,.  void (*xFu
7420: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
7430: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
7440: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
7450: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
7460: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
7470: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
7480: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
7490: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
74a0: 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65  text*),.  FuncDe
74b0: 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72  structor *pDestr
74c0: 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44  uctor.){.  FuncD
74d0: 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61  ef *p;.  int nNa
74e0: 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  me;..  assert( s
74f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7500: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
7510: 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e    if( zFunctionN
7520: 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20  ame==0 ||.      
7530: 28 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  (xFunc && (xFina
7540: 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20  l || xStep)) || 
7550: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
7560: 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53  & (xFinal && !xS
7570: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
7580: 21 78 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e  !xFunc && (!xFin
7590: 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c  al && xStep)) ||
75a0: 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20  .      (nArg<-1 
75b0: 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d  || nArg>SQLITE_M
75c0: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29  AX_FUNCTION_ARG)
75d0: 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28   ||.      (255<(
75e0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
75f0: 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69  trlen30( zFuncti
7600: 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20  onName))) ){.   
7610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
7620: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
7630: 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54    .#ifndef SQLIT
7640: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f  E_OMIT_UTF16.  /
7650: 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
7660: 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
7670: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
7680: 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
7690: 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
76a0: 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
76b0: 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
76c0: 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
76d0: 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
76e0: 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
76f0: 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
7700: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
7710: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53  ..  **.  ** If S
7720: 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65  QLITE_ANY is spe
7730: 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65  cified, add thre
7740: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  e versions of th
7750: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  e function.  ** 
7760: 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
7770: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e  e..  */.  if( en
7780: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  c==SQLITE_UTF16 
7790: 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c  ){.    enc = SQL
77a0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
77b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63  .  }else if( enc
77c0: 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a  ==SQLITE_ANY ){.
77d0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
77e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
77f0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
7800: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
7810: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
7820: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
7830: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
7840: 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74  Final, pDestruct
7850: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  or);.    if( rc=
7860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7870: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7880: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
7890: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
78a0: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  rg, SQLITE_UTF16
78b0: 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55  LE,.          pU
78c0: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
78d0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
78e0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
78f0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
7900: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7910: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
7920: 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c   }.    enc = SQL
7930: 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d  ITE_UTF16BE;.  }
7940: 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53  .#else.  enc = S
7950: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64  QLITE_UTF8;.#end
7960: 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  if.  .  /* Check
7970: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
7980: 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
7990: 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20  g overridden or 
79a0: 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a  deleted. If so,.
79b0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
79c0: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74  re active VMs, t
79d0: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
79e0: 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e  E_BUSY. If a fun
79f0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65  ction.  ** is be
7a00: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64  ing overridden/d
7a10: 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65  eleted but there
7a20: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
7a30: 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20  Ms, allow the.  
7a40: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
7a50: 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76  continue but inv
7a60: 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63  alidate all prec
7a70: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
7a80: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  ts..  */.  p = s
7a90: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
7aa0: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
7ab0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
7ac0: 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a  g, (u8)enc, 0);.
7ad0: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 50    if( p && p->iP
7ae0: 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70  refEnc==enc && p
7af0: 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a  ->nArg==nArg ){.
7b00: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69      if( db->acti
7b10: 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20  veVdbeCnt ){.   
7b20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
7b30: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
7b40: 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
7b50: 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
7b60: 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  fy user-function
7b70: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
7b80: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
7b90: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
7ba0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7bb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7bc0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
7bd0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
7be0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
7bf0: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
7c00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d      }.  }..  p =
7c10: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
7c20: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
7c30: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
7c40: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29  Arg, (u8)enc, 1)
7c50: 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20  ;.  assert(p || 
7c60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7c70: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
7c80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7c90: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
7ca0: 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65  * If an older ve
7cb0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e  rsion of the fun
7cc0: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e  ction with a con
7cd0: 66 69 67 75 72 65 64 20 64 65 73 74 72 75 63 74  figured destruct
7ce0: 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67  or is.  ** being
7cf0: 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65   replaced invoke
7d00: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
7d10: 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a  function here. *
7d20: 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  /.  functionDest
7d30: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69  roy(db, p);..  i
7d40: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
7d50: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
7d60: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
7d70: 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20   p->pDestructor 
7d80: 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20  = pDestructor;. 
7d90: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20   p->flags = 0;. 
7da0: 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e   p->xFunc = xFun
7db0: 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20  c;.  p->xStep = 
7dc0: 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e  xStep;.  p->xFin
7dd0: 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a  alize = xFinal;.
7de0: 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d    p->pUserData =
7df0: 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d   pUserData;.  p-
7e00: 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72  >nArg = (u16)nAr
7e10: 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
7e20: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7e30: 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20  Create new user 
7e40: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  functions..*/.in
7e50: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
7e60: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
7e70: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
7e80: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
7e90: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
7ea0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
7eb0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
7ec0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7ed0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
7ee0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
7ef0: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
7f00: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
7f10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
7f20: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
7f30: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
7f40: 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  t*).){.  return 
7f50: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7f60: 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  unction_v2(db, z
7f70: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
7f80: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
7f90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29        xFinal, 0)
7fc0: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
7fd0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7fe0: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
7ff0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
8000: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
8010: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
8020: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
8030: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
8040: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
8050: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8060: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
8070: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
8080: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8090: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
80a0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
80b0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
80c0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79   void (*xDestroy
80d0: 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69  )(void *).){.  i
80e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
80f0: 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74  RROR;.  FuncDest
8100: 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30  ructor *pArg = 0
8110: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8120: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
8130: 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72  x);.  if( xDestr
8140: 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d  oy ){.    pArg =
8150: 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72   (FuncDestructor
8160: 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
8170: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
8180: 66 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72  f(FuncDestructor
8190: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72  ));.    if( !pAr
81a0: 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73 74  g ){.      xDest
81b0: 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f  roy(p);.      go
81c0: 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  to out;.    }.  
81d0: 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f 79    pArg->xDestroy
81e0: 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20   = xDestroy;.   
81f0: 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74 61   pArg->pUserData
8200: 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = p;.  }.  rc =
8210: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
8220: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  nc(db, zFunc, nA
8230: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
8240: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
8250: 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70  , pArg);.  if( p
8260: 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65  Arg && pArg->nRe
8270: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
8280: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
8290: 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f  K );.    xDestro
82a0: 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  y(p);.    sqlite
82b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 72 67  3DbFree(db, pArg
82c0: 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20  );.  }.. out:.  
82d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
82e0: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
82f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8300: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
8310: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
8320: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8330: 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c  IT_UTF16.int sql
8340: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8350: 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
8360: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76  3 *db,.  const v
8370: 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  oid *zFunctionNa
8380: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
8390: 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
83a0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
83b0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
83c0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
83d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
83e0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
83f0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
8400: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
8410: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
8420: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
8430: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
8440: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
8450: 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74  *zFunc8;.  sqlit
8460: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
8470: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
8480: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
8490: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e  Failed );.  zFun
84a0: 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  c8 = sqlite3Utf1
84b0: 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69  6to8(db, zFuncti
84c0: 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49  onName, -1, SQLI
84d0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
84e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
84f0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
8500: 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78  unc8, nArg, eTex
8510: 74 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20  tRep, p, xFunc, 
8520: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29  xStep, xFinal,0)
8530: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
8540: 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20  e(db, zFunc8);. 
8550: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
8560: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
8570: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8580: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8590: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
85a0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
85b0: 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e  clare that a fun
85c0: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f  ction has been o
85d0: 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76  verloaded by a v
85e0: 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a  irtual table..**
85f0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74  .** If the funct
8600: 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73  ion already exis
8610: 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20  ts as a regular 
8620: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c  global function,
8630: 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
8640: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
8650: 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  .  If the functi
8660: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
8670: 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a  t, then create.*
8680: 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74  * a new one that
8690: 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61   always throws a
86a0: 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e   run-time error.
86b0: 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69    .**.** When vi
86c0: 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74  rtual tables int
86d0: 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61  end to provide a
86e0: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e  n overloaded fun
86f0: 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73  ction, they.** s
8700: 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20  hould call this 
8710: 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20  routine to make 
8720: 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20  sure the global 
8730: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e  function exists.
8740: 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e  .** A global fun
8750: 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74  ction must exist
8760: 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61   in order for na
8770: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f  me resolution to
8780: 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c   work.** properl
8790: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
87a0: 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74  3_overload_funct
87b0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
87c0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
87d0: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e   *zName,.  int n
87e0: 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61  Arg.){.  int nNa
87f0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
8800: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  en30(zName);.  i
8810: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
8820: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
8830: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  >mutex);.  if( s
8840: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
8850: 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  on(db, zName, nN
8860: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
8870: 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b  E_UTF8, 0)==0 ){
8880: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
8890: 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65  teFunc(db, zName
88a0: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
88b0: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TF8,.           
88c0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
88d0: 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
88e0: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tion, 0, 0, 0);.
88f0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
8900: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 53 51  e3ApiExit(db, SQ
8910: 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
8920: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
8930: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
8940: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
8950: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8960: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69  TRACE./*.** Regi
8970: 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e  ster a trace fun
8980: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
8990: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
89a0: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
89b0: 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75  trace.** is retu
89c0: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
89d0: 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74  NULL trace funct
89e0: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
89f0: 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65  o tracing is exe
8a00: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
8a10: 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61  LL.** trace is a
8a20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
8a30: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
8a40: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74  nvoked at the st
8a50: 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53  art of each.** S
8a60: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  QL statement..*/
8a70: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74  .void *sqlite3_t
8a80: 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62  race(sqlite3 *db
8a90: 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29  , void (*xTrace)
8aa0: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
8ab0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
8ac0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
8ad0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8ae0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
8af0: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
8b00: 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e  TraceArg;.  db->
8b10: 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b  xTrace = xTrace;
8b20: 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
8b30: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
8b40: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8b50: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
8b60: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a  urn pOld;.}./*.*
8b70: 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f  * Register a pro
8b80: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  file function.  
8b90: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
8ba0: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
8bb0: 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66  istered .** prof
8bc0: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ile function is 
8bd0: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
8be0: 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65  * A NULL profile
8bf0: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
8c00: 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e  that no profilin
8c10: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
8c20: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72  A non-NULL.** pr
8c30: 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74  ofile is a point
8c40: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
8c50: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
8c60: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
8c70: 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51  on of.** each SQ
8c80: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
8c90: 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64   is run..*/.void
8ca0: 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c   *sqlite3_profil
8cb0: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
8cc0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66  ,.  void (*xProf
8cd0: 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ile)(void*,const
8ce0: 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69   char*,sqlite_ui
8cf0: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
8d00: 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Arg.){.  void *p
8d10: 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Old;.  sqlite3_m
8d20: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
8d30: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
8d40: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b  db->pProfileArg;
8d50: 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20  .  db->xProfile 
8d60: 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62  = xProfile;.  db
8d70: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20  ->pProfileArg = 
8d80: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
8d90: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8da0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
8db0: 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
8dc0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
8dd0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58  RACE */../*** EX
8de0: 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a 2a  PERIMENTAL ***.*
8df0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
8e00: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
8e10: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
8e20: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e  ansaction commen
8e30: 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
8e40: 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
8e50: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
8e60: 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
8e70: 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
8e80: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
8e90: 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
8ea0: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
8eb0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
8ec0: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
8ed0: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
8ee0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
8ef0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
8f00: 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
8f10: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
8f20: 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
8f30: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
8f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
8f50: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
8f60: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
8f70: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
8f80: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
8f90: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
8fa0: 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  d = db->pCommitA
8fb0: 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69  rg;.  db->xCommi
8fc0: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  tCallback = xCal
8fd0: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f  lback;.  db->pCo
8fe0: 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a  mmitArg = pArg;.
8ff0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9000: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9010: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
9020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
9030: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
9040: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
9050: 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
9060: 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
9070: 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
9080: 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
9090: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
90a0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
90b0: 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73  update_hook(.  s
90c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
90d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
90e0: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
90f0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
9100: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
9110: 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
9120: 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20  ar const *,char 
9130: 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69  const *,sqlite_i
9140: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
9150: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
9160: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
9170: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
9180: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
9190: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
91a0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
91b0: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
91c0: 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20  ->pUpdateArg;.  
91d0: 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62  db->xUpdateCallb
91e0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
91f0: 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72  .  db->pUpdateAr
9200: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
9210: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9220: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
9230: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
9240: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
9250: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
9260: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
9270: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
9280: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
9290: 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65  by this database
92a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
92b0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f  void *sqlite3_ro
92c0: 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73  llback_hook(.  s
92d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
92e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
92f0: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
9300: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
9310: 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61    void (*xCallba
9320: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43  ck)(void*), /* C
9330: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
9340: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
9370: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
9380: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
9390: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
93a0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
93b0: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
93c0: 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64  RollbackArg;.  d
93d0: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
93e0: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
93f0: 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ;.  db->pRollbac
9400: 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  kArg = pArg;.  s
9410: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9420: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
9430: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
9440: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9450: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
9460: 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  he sqlite3_wal_h
9470: 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72  ook() callback r
9480: 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c  egistered by sql
9490: 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
94a0: 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e  ckpoint()..** In
94b0: 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c  voke sqlite3_wal
94c0: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74  _checkpoint if t
94d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
94e0: 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
94f0: 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
9500: 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70  r than sqlite3.p
9510: 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61  WalArg cast to a
9520: 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76  n integer (the v
9530: 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
9540: 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68  by.** wal_autoch
9550: 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20  eckpoint())..*/ 
9560: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44  .int sqlite3WalD
9570: 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f  efaultHook(.  vo
9580: 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c  id *pClientData,
9590: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
95a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
95b0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b,           /* 
95c0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  Connection */.  
95d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
95e0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
95f0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61  se */.  int nFra
9600: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  me             /
9610: 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f  * Size of WAL */
9620: 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  .){.  if( nFrame
9630: 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  >=SQLITE_PTR_TO_
9640: 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29  INT(pClientData)
9650: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
9660: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
9670: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
9680: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64  wal_checkpoint(d
9690: 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c  b, zDb);.    sql
96a0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
96b0: 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  loc();.  }.  ret
96c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
96d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
96e0: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
96f0: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61  *.** Configure a
9700: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  n sqlite3_wal_ho
9710: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ok() callback to
9720: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
9730: 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64  heckpoint.** a d
9740: 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f  atabase after co
9750: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
9760: 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
9770: 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a  are nFrame or.**
9780: 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20   more frames in 
9790: 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61  the log file. Pa
97a0: 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20  ssing zero or a 
97b0: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61  negative value a
97c0: 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20  s the.** nFrame 
97d0: 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c  parameter disabl
97e0: 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  es automatic che
97f0: 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c  ckpoints entirel
9800: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
9810: 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
9820: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
9830: 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65  n replaces any e
9840: 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b  xisting callback
9850: 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75  .** registered u
9860: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
9870: 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73  _hook(). Likewis
9880: 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61  e, registering a
9890: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69   callback.** usi
98a0: 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
98b0: 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74  ook() disables t
98c0: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  he automatic che
98d0: 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73  ckpoint mechanis
98e0: 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  m.** configured 
98f0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
9900: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9910: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
9920: 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
9930: 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69   int nFrame){.#i
9940: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
9950: 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41  _WAL.  UNUSED_PA
9960: 52 41 4d 45 54 45 52 28 64 62 29 3b 0d 0a 20 20  RAMETER(db);..  
9970: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9980: 28 6e 46 72 61 6d 65 29 3b 0d 0a 23 65 6c 73 65  (nFrame);..#else
9990: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20  .  if( nFrame>0 
99a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
99b0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69  al_hook(db, sqli
99c0: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
99d0: 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  k, SQLITE_INT_TO
99e0: 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20  _PTR(nFrame));. 
99f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
9a00: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
9a10: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
9a20: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
9a30: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9a40: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
9a50: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
9a60: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
9a70: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69  ansaction is wri
9a80: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  tten.** into the
9a90: 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
9aa0: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
9ab0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
9ac0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77  .void *sqlite3_w
9ad0: 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  al_hook(.  sqlit
9ae0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
9b00: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
9b10: 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20   this db handle 
9b20: 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62  */.  int(*xCallb
9b30: 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c  ack)(void *, sql
9b40: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
9b50: 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64  r*, int),.  void
9b60: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9b80: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
9b90: 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63  ssed to xCallbac
9ba0: 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  k() */.){.#ifnde
9bb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
9bc0: 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  L.  void *pRet;.
9bd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9be0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
9bf0: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
9c00: 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
9c10: 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
9c20: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
9c30: 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
9c40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9c50: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9c60: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
9c70: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
9c80: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
9c90: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
9ca0: 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44  abase zDb. If zD
9cb0: 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66  b is NULL, or if
9cc0: 20 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20   the buffer zDb 
9cd0: 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e  points.** to con
9ce0: 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e  tains a zero-len
9cf0: 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20  gth string, all 
9d00: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
9d10: 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b  es are .** check
9d20: 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  pointed..*/.int 
9d30: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
9d40: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
9d50: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
9d60: 7a 44 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  zDb){.#ifdef SQL
9d70: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
9d80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9d90: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9dc0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
9dd0: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
9de0: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
9df0: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
9e00: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
9e10: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 73 71  ckpoint */..  sq
9e20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9e30: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9e40: 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30  if( zDb && zDb[0
9e50: 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73  ] ){.    iDb = s
9e60: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
9e70: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  (db, zDb);.  }. 
9e80: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
9e90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
9ea0: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
9eb0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
9ec0: 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e  _ERROR, "unknown
9ed0: 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20   database: %s", 
9ee0: 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  zDb);.  }else{. 
9ef0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
9f00: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44  heckpoint(db, iD
9f10: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
9f20: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
9f30: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
9f40: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
9f50: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
9f60: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9f70: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
9f80: 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  c;.#endif.}..#if
9f90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9fa0: 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  _WAL./*.** Run a
9fb0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64   checkpoint on d
9fc0: 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69  atabase iDb. Thi
9fd0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
9fe0: 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a  database iDb is.
9ff0: 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ** not currently
a000: 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64   open in WAL mod
a010: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  e..**.** If a tr
a020: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
a030: 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
a040: 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
a050: 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66  nted, this .** f
a060: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
a070: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e  SQLITE_LOCKED an
a080: 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  d a checkpoint i
a090: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e  s not attempted.
a0a0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
a0b0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75   occurs while ru
a0c0: 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70  nning the checkp
a0d0: 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20  oint, an SQLite 
a0e0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
a0f0: 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e  * returned (i.e.
a100: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20   SQLITE_IOERR). 
a110: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
a120: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
a130: 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73  mutex on databas
a140: 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75  e handle db shou
a150: 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68  ld be held by th
a160: 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75  e caller. The mu
a170: 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  tex.** associate
a180: 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
a190: 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67  fic b-tree being
a1a0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73   checkpointed is
a1b0: 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69   taken by.** thi
a1c0: 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  s function while
a1d0: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
a1e0: 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a  is running..**.*
a1f0: 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73  * If iDb is pass
a200: 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ed SQLITE_MAX_AT
a210: 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c  TACHED, then all
a220: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
a230: 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b  ses are.** check
a240: 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65  pointed. If an e
a250: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
a260: 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e  red it is return
a270: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d  ed immediately -
a280: 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69  .** no attempt i
a290: 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70  s made to checkp
a2a0: 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69  oint any remaini
a2b0: 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2f  ng databases..*/
a2c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
a2d0: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
a2e0: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
a2f0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a300: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
a310: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
a320: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
a350: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
a360: 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 0a  ttached dbs */..
a370: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a380: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
a390: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 66 6f  >mutex) );..  fo
a3a0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a3b0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
a3c0: 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  K; i++){.    if(
a3d0: 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d   i==iDb || iDb==
a3e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
a3f0: 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  HED ){.      rc 
a400: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68  = sqlite3BtreeCh
a410: 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62  eckpoint(db->aDb
a420: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
a430: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
a440: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
a450: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
a460: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
a470: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
a480: 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72  ue if main-memor
a490: 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
a4a0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61   instead of.** a
a4b0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
a4c0: 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61  for transient pa
a4d0: 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74  ger files and st
a4e0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
a4f0: 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
a500: 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20  eturned depends 
a510: 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
a520: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28  db->temp_store (
a530: 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d  runtime.** param
a540: 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f  eter) and the co
a550: 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
a560: 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   of SQLITE_TEMP_
a570: 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f  STORE. The.** fo
a580: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
a590: 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61  scribes the rela
a5a0: 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
a5b0: 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65   these two value
a5c0: 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75  s.** and this fu
a5d0: 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76  nctions return v
a5e0: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51  alue..**.**   SQ
a5f0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
a600: 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
a610: 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
a620: 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
a630: 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
a640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
a650: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
a660: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
a670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a680: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
a6a0: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
a6b0: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
a6c0: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6e0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
a6f0: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
a700: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
a730: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
a740: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
a750: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
a760: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
a770: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
a780: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
a790: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
a7a0: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
a7c0: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
a7d0: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
a810: 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 1).**   2     
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a830: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
a840: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
a850: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20  turn 1).**   3  
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a870: 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
a880: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
a890: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e  (return 1).*/.in
a8a0: 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  t sqlite3TempInM
a8b0: 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69  emory(const sqli
a8c0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51  te3 *db){.#if SQ
a8d0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
a8e0: 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =1.  return ( db
a8f0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
a900: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
a910: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
a920: 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =2.  return ( db
a930: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
a940: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
a950: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
a960: 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  =3.  return 1;.#
a970: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
a980: 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c  _TEMP_STORE<1 ||
a990: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
a9a0: 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b  RE>3.  return 0;
a9b0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
a9c0: 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e   Return UTF-8 en
a9d0: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
a9e0: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
a9f0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
aa00: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
aa10: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
aa20: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71  qlite3_errmsg(sq
aa30: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
aa40: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
aa50: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
aa60: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
aa70: 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
aa80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
aa90: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
aaa0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
aab0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
aac0: 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d  3ErrStr(SQLITE_M
aad0: 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d  ISUSE_BKPT);.  }
aae0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
aaf0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
ab00: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
ab10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
ab20: 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
ab30: 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
ab40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
ab50: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
ab60: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d  3_value_text(db-
ab70: 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65  >pErr);.    asse
ab80: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
ab90: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
aba0: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   z==0 ){.      z
abb0: 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
abc0: 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20  (db->errCode);. 
abd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
abe0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
abf0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
ac00: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
ac10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
ac20: 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  F16./*.** Return
ac30: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
ac40: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
ac50: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
ac60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
ac70: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
ac80: 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
ac90: 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65  _errmsg16(sqlite
aca0: 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
acb0: 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66   const u16 outOf
acc0: 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f  Mem[] = {.    'o
acd0: 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
ace0: 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c  , 'o', 'f', ' ',
acf0: 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20   'm', 'e', 'm', 
ad00: 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30  'o', 'r', 'y', 0
ad10: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
ad20: 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b  onst u16 misuse[
ad30: 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27  ] = {.    'l', '
ad40: 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61  i', 'b', 'r', 'a
ad50: 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27  ', 'r', 'y', ' '
ad60: 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c  , .    'r', 'o',
ad70: 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20   'u', 't', 'i', 
ad80: 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a  'n', 'e', ' ', .
ad90: 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c      'c', 'a', 'l
ada0: 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27  ', 'l', 'e', 'd'
adb0: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
adc0: 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
add0: 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27  .    'o', 'f', '
ade0: 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65   ', .    's', 'e
adf0: 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27  ', 'q', 'u', 'e'
ae00: 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c  , 'n', 'c', 'e',
ae10: 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
ae20: 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
ae30: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
ae40: 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
ae50: 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
ae60: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
ae70: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
ae80: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
ae90: 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
aea0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
aeb0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
aec0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
aed0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
aee0: 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
aef0: 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
af00: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
af10: 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
af20: 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
af30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
af40: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
af50: 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71  db->pErr, -1, sq
af60: 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
af70: 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20  errCode),.      
af80: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
af90: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
afa0: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
afb0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
afc0: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
afd0: 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  }.    /* A mallo
afe0: 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69  c() may have fai
aff0: 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  led within the c
b000: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  all to sqlite3_v
b010: 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20  alue_text16().  
b020: 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
b030: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
b040: 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
b050: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
b060: 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
b070: 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
b080: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20  e returning. Do 
b090: 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69  this directly, i
b0a0: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20  nstead of via.  
b0b0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45    ** sqlite3ApiE
b0c0: 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20  xit(), to avoid 
b0d0: 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61  setting the data
b0e0: 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f  base handle erro
b0f0: 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a  r message..    *
b100: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
b110: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  Failed = 0;.  }.
b120: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b130: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
b140: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
b150: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b160: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
b170: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
b180: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
b190: 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
b1a0: 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
b1b0: 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
b1c0: 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
b1d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
b1e0: 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
b1f0: 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
b200: 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
b210: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b220: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
b230: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
b240: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
b250: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
b260: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
b270: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
b280: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
b290: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
b2a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
b2b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b2c0: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
b2d0: 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
b2e0: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
b2f0: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
b300: 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
b310: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
b320: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
b330: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
b340: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
b350: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
b360: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
b370: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
b380: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
b390: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
b3a0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
b3b0: 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a   db->errCode;.}.
b3c0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
b3d0: 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  new collating fu
b3e0: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62  nction for datab
b3f0: 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e  ase "db".  The n
b400: 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20  ame is zName.** 
b410: 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  and the encoding
b420: 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74   is enc..*/.stat
b430: 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c  ic int createCol
b440: 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
b450: 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3* db,.  const c
b460: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75  har *zName, .  u
b470: 38 20 65 6e 63 2c 0a 20 20 75 38 20 63 6f 6c 6c  8 enc,.  u8 coll
b480: 54 79 70 65 2c 0a 20 20 76 6f 69 64 2a 20 70 43  Type,.  void* pC
b490: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
b4a0: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
b4b0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
b4c0: 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
b4d0: 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
b4e0: 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
b4f0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
b500: 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  2;.  int nName =
b510: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b520: 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73  (zName);.  .  as
b530: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b540: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
b550: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
b560: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
b570: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
b580: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
b590: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
b5a0: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
b5b0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
b5c0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
b5d0: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
b5e0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
b5f0: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
b600: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
b610: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
b620: 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a  /.  enc2 = enc;.
b630: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
b640: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
b650: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
b660: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
b670: 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66  _ALIGNED );.  if
b680: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
b690: 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51  TF16 || enc2==SQ
b6a0: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
b6b0: 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d  ED ){.    enc2 =
b6c0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
b6d0: 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  IVE;.  }.  if( e
b6e0: 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20  nc2<SQLITE_UTF8 
b6f0: 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55  || enc2>SQLITE_U
b700: 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65  TF16BE ){.    re
b710: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
b720: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
b730: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
b740: 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
b750: 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
b760: 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
b770: 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
b780: 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
b790: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
b7a0: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
b7b0: 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
b7c0: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
b7d0: 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
b7e0: 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
b7f0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
b800: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
b810: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
b820: 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
b830: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 0);.  if( pCo
b840: 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
b850: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  p ){.    if( db-
b860: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
b870: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
b880: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
b890: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
b8a0: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
b8b0: 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f  /modify collatio
b8c0: 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74  n sequence due t
b8d0: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
b8e0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  nts");.      ret
b8f0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
b900: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b910: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
b920: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
b930: 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
b940: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
b950: 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
b960: 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
b970: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
b980: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
b990: 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
b9a0: 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
b9b0: 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
b9c0: 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
b9d0: 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
b9e0: 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
b9f0: 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
ba00: 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
ba10: 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
ba20: 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
ba30: 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
ba40: 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
ba50: 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
ba60: 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
ba70: 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
ba80: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
ba90: 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
baa0: 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
bab0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
bac0: 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
bad0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
bae0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
baf0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
bb00: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
bb10: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
bb20: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
bb30: 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
bb40: 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
bb50: 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
bb60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
bb70: 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
bb80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
bb90: 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
bba0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
bbb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
bbc0: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
bbd0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
bbe0: 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
bbf0: 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
bc00: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  oll ){.    pColl
bc10: 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72  ->xCmp = xCompar
bc20: 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 70 55  e;.    pColl->pU
bc30: 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 20 20  ser = pCtx;.    
bc40: 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44  pColl->xDel = xD
bc50: 65 6c 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 65  el;.    pColl->e
bc60: 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c  nc = (u8)(enc2 |
bc70: 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55   (enc & SQLITE_U
bc80: 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a  TF16_ALIGNED));.
bc90: 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20      pColl->type 
bca0: 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 20 20 7d 0a  = collType;.  }.
bcb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
bcc0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
bcd0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
bce0: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
bcf0: 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
bd00: 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
bd10: 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
bd20: 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
bd30: 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
bd40: 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
bd50: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
bd60: 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
bd70: 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
bd80: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
bd90: 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
bda0: 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
bdb0: 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
bdc0: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
bdd0: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
bde0: 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
bdf0: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
be00: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
be10: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
be20: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
be30: 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
be40: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
be50: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
be60: 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
be70: 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
be80: 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
be90: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
bea0: 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54 45  NUMBER,.  SQLITE
beb0: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
bec0: 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  TH,.};../*.** Ma
bed0: 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64  ke sure the hard
bee0: 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20   limits are set 
bef0: 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61  to reasonable va
bf00: 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lues.*/.#if SQLI
bf10: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30  TE_MAX_LENGTH<10
bf20: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
bf30: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _MAX_LENGTH must
bf40: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
bf50: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
bf60: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
bf70: 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
bf80: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
bf90: 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
bfa0: 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
bfb0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
bfc0: 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45  QL_LENGTH>SQLITE
bfd0: 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72  _MAX_LENGTH.# er
bfe0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
bff0: 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e  QL_LENGTH must n
c000: 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ot be greater th
c010: 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  an SQLITE_MAX_LE
c020: 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20  NGTH.#endif.#if 
c030: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
c040: 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65  UND_SELECT<2.# e
c050: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
c060: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
c070: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
c080: 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   2.#endif.#if SQ
c090: 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
c0a0: 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  <40.# error SQLI
c0b0: 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d  TE_MAX_VDBE_OP m
c0c0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
c0d0: 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  40.#endif.#if SQ
c0e0: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
c0f0: 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54  N_ARG<0 || SQLIT
c100: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
c110: 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20  RG>1000.# error 
c120: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
c130: 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20  ION_ARG must be 
c140: 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30  between 0 and 10
c150: 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
c160: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
c170: 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  D<0 || SQLITE_MA
c180: 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 23 20  X_ATTACHED>30.# 
c190: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
c1a0: 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62  _ATTACHED must b
c1b0: 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
c1c0: 33 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  30.#endif.#if SQ
c1d0: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
c1e0: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
c1f0: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
c200: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
c210: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
c220: 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
c230: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
c240: 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72  OLUMN>32767.# er
c250: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
c260: 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65  OLUMN must not e
c270: 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64  xceed 32767.#end
c280: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
c290: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c  X_TRIGGER_DEPTH<
c2a0: 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
c2b0: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
c2c0: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
c2d0: 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ast 1.#endif.../
c2e0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
c2f0: 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74  value of a limit
c300: 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c  .  Report the ol
c310: 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61  d value..** If a
c320: 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20  n invalid limit 
c330: 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65  index is supplie
c340: 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a  d, report -1..**
c350: 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
c360: 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72   but still repor
c370: 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  t the old value 
c380: 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69  if the.** new li
c390: 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
c3a0: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77  .**.** A new low
c3b0: 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f  er limit does no
c3c0: 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e  t shrink existin
c3d0: 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a  g constructs..**
c3e0: 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65   It merely preve
c3f0: 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63  nts new construc
c400: 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74  ts that exceed t
c410: 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d  he limit.** from
c420: 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   forming..*/.int
c430: 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73   sqlite3_limit(s
c440: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
c450: 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77  limitId, int new
c460: 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c  Limit){.  int ol
c470: 64 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20 6c 69  dLimit;.  if( li
c480: 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74  mitId<0 || limit
c490: 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d  Id>=SQLITE_N_LIM
c4a0: 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
c4b0: 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69   -1;.  }.  oldLi
c4c0: 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  mit = db->aLimit
c4d0: 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28  [limitId];.  if(
c4e0: 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a   newLimit>=0 ){.
c4f0: 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
c500: 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
c510: 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
c520: 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
c530: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20  mit[limitId];.  
c540: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d    }.    db->aLim
c550: 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65  it[limitId] = ne
c560: 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  wLimit;.  }.  re
c570: 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 0a 7d  turn oldLimit;.}
c580: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
c590: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f  tine does the wo
c5a0: 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20  rk of opening a 
c5b0: 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61  database on beha
c5c0: 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lf of.** sqlite3
c5d0: 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69  _open() and sqli
c5e0: 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68  te3_open16(). Th
c5f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  e database filen
c600: 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20  ame "zFilename" 
c610: 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e   .** is UTF-8 en
c620: 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
c630: 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73   int openDatabas
c640: 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
c650: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44  *zFilename, /* D
c660: 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
c670: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a   UTF-8 encoded *
c680: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
c690: 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  Db,        /* OU
c6a0: 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61  T: Returned data
c6b0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
c6c0: 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67 73 2c   unsigned flags,
c6d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
c6e0: 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a  tional flags */.
c6f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
c700: 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  fs       /* Name
c710: 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
c720: 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  se */.){.  sqlit
c730: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
c740: 3b 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  ;.  int isThread
c750: 73 61 66 65 3b 0a 0a 20 20 2a 70 70 44 62 20 3d  safe;..  *ppDb =
c760: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
c770: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
c780: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
c790: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
c7a0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
c7b0: 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  rc;.#endif..  /*
c7c0: 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73   Only allow sens
c7d0: 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
c7e0: 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  s of bits in the
c7f0: 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e   flags argument.
c800: 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e    .  ** Throw an
c810: 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f   error if any no
c820: 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74  n-sense combinat
c830: 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66  ion is used.  If
c840: 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20   we.  ** do not 
c850: 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f  block illegal co
c860: 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c  mbinations here,
c870: 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65   it could trigge
c880: 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20  r.  ** assert() 
c890: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65  statements in de
c8a0: 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65  eper layers.  Se
c8b0: 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
c8c0: 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20  ons.  ** are:.  
c8d0: 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c  **.  **  1:  SQL
c8e0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
c8f0: 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49  Y.  **  2:  SQLI
c900: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
c910: 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49  E.  **  6:  SQLI
c920: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
c930: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
c940: 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73  CREATE.  */.  as
c950: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
c960: 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30  N_READONLY  == 0
c970: 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x01 );.  assert(
c980: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
c990: 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29  DWRITE == 0x02 )
c9a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
c9b0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20  TE_OPEN_CREATE  
c9c0: 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74    == 0x04 );.  t
c9d0: 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
c9e0: 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b  ags&7))==0x02 );
c9f0: 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a   /* READONLY */.
ca00: 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
ca10: 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34  (flags&7))==0x04
ca20: 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
ca30: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
ca40: 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
ca50: 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x40 ); /* READW
ca60: 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f  RITE | CREATE */
ca70: 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61  .  if( ((1<<(fla
ca80: 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d  gs&7)) & 0x46)==
ca90: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
caa0: 45 5f 4d 49 53 55 53 45 3b 0a 0a 20 20 69 66 28  E_MISUSE;..  if(
cab0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
cac0: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d  nfig.bCoreMutex=
cad0: 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  =0 ){.    isThre
cae0: 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
caf0: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
cb00: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
cb10: 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72  TEX ){.    isThr
cb20: 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
cb30: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
cb40: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
cb50: 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73  LMUTEX ){.    is
cb60: 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a  Threadsafe = 1;.
cb70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54    }else{.    isT
cb80: 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69  hreadsafe = sqli
cb90: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
cba0: 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a  bFullMutex;.  }.
cbb0: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
cbc0: 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
cbd0: 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c  ECACHE ){.    fl
cbe0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
cbf0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
cc00: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
cc10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
cc20: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
cc30: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  led ){.    flags
cc40: 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
cc50: 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
cc60: 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61  ..  /* Remove ha
cc70: 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20  rmful bits from 
cc80: 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
cc90: 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ter.  **.  ** Th
cca0: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  e SQLITE_OPEN_NO
ccb0: 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45  MUTEX and SQLITE
ccc0: 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
ccd0: 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20  flags were.  ** 
cce0: 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68  dealt with in th
ccf0: 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20  e previous code 
cd00: 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20  block.  Besides 
cd10: 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a  these, the only.
cd20: 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74    ** valid input
cd30: 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   flags for sqlit
cd40: 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65  e3_open_v2() are
cd50: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
cd60: 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49  DONLY,.  ** SQLI
cd70: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
cd80: 45 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50  E, and SQLITE_OP
cd90: 45 4e 5f 43 52 45 41 54 45 2e 20 20 53 69 6c 65  EN_CREATE.  Sile
cda0: 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
cdb0: 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
cdc0: 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
cdd0: 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
cde0: 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
cdf0: 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
ce00: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
ce10: 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
ce20: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ce30: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
ce50: 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
ce60: 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
ce70: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
ce80: 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
ce90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cea0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
ceb0: 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
cec0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
ced0: 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
cee0: 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
cef0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
cf00: 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
cf20: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
cf30: 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
cf40: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
cf50: 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
cf60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf70: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
cf80: 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
cf90: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
cfa0: 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
cfb0: 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
cfc0: 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
cfd0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
cfe0: 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
cff0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
d000: 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
d010: 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
d020: 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
d030: 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
d040: 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74  e ){.    db->mut
d050: 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
d060: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
d070: 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
d080: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65      if( db->mute
d090: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x==0 ){.      sq
d0a0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
d0b0: 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20        db = 0;.  
d0c0: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
d0d0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
d0e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
d0f0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
d100: 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
d110: 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62   0xff;.  db->nDb
d120: 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69   = 2;.  db->magi
d130: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
d140: 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62  _BUSY;.  db->aDb
d150: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
d160: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ;..  assert( siz
d170: 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d  eof(db->aLimit)=
d180: 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d  =sizeof(aHardLim
d190: 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  it) );.  memcpy(
d1a0: 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72  db->aLimit, aHar
d1b0: 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64  dLimit, sizeof(d
d1c0: 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64  b->aLimit));.  d
d1d0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
d1e0: 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74  1;.  db->nextAut
d1f0: 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d  ovac = -1;.  db-
d200: 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
d210: 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  0;.  db->flags |
d220: 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
d230: 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
d240: 41 75 74 6f 49 6e 64 65 78 0a 23 69 66 20 53 51  AutoIndex.#if SQ
d250: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
d260: 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
d270: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
d280: 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
d290: 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
d2a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
d2b0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
d2d0: 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
d2e0: 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
d2f0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
d300: 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
d310: 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
d320: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
d330: 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
d340: 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65        ;.  sqlite
d350: 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
d360: 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
d370: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d380: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c  RTUALTABLE.  sql
d390: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
d3a0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
d3b0: 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20 3d  if..  db->pVfs =
d3c0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
d3d0: 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 21  d(zVfs);.  if( !
d3e0: 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20 20  db->pVfs ){.    
d3f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
d400: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  R;.    sqlite3Er
d410: 72 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e 6f 20  ror(db, rc, "no 
d420: 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a  such vfs: %s", z
d430: 56 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  Vfs);.    goto o
d440: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
d450: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66    /* Add the def
d460: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
d470: 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20  equence BINARY. 
d480: 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72  BINARY works for
d490: 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a   both UTF-8.  **
d4a0: 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20   and UTF-16, so 
d4b0: 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f  add a version fo
d4c0: 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20  r each to avoid 
d4d0: 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a  any unnecessary.
d4e0: 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
d4f0: 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72  . The only error
d500: 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20   that can occur 
d510: 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63  here is a malloc
d520: 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f  () failure..  */
d530: 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
d540: 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
d550: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
d560: 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
d570: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
d580: 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75         binCollFu
d590: 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
d5a0: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
d5b0: 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
d5c0: 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 43  TF16BE, SQLITE_C
d5d0: 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20  OLL_BINARY, 0,. 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
d600: 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
d610: 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
d620: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
d630: 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49  , SQLITE_COLL_BI
d640: 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20  NARY, 0,.       
d650: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f             binCo
d660: 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
d670: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
d680: 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54  , "RTRIM", SQLIT
d690: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 43  E_UTF8, SQLITE_C
d6a0: 4f 4c 4c 5f 55 53 45 52 2c 20 28 76 6f 69 64 2a  OLL_USER, (void*
d6b0: 29 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )1,.            
d6c0: 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e        binCollFun
d6d0: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
d6e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
d6f0: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
d700: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
d710: 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
d720: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
d730: 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
d740: 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20  "BINARY", 0);.  
d750: 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
d760: 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
d770: 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46  * Also add a UTF
d780: 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74  -8 case-insensit
d790: 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ive collation se
d7a0: 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65  quence. */.  cre
d7b0: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
d7c0: 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54   "NOCASE", SQLIT
d7d0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 43  E_UTF8, SQLITE_C
d7e0: 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30 2c 0a 20  OLL_NOCASE, 0,. 
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
d810: 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  Func, 0);..  /* 
d820: 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64  Open the backend
d830: 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72   database driver
d840: 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
d850: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
d860: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d870: 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Open(zFilename, 
d880: 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e  db, &db->aDb[0].
d890: 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBt, 0,.        
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
d8c0: 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20  PEN_MAIN_DB);.  
d8d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d8e0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
d8f0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
d900: 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  MEM ){.      rc 
d910: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
d920: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d930: 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
d940: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
d950: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62  db_out;.  }.  db
d960: 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61  ->aDb[0].pSchema
d970: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
d980: 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  Get(db, db->aDb[
d990: 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
d9a0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[1].pSchema = 
d9b0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
d9c0: 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20  (db, 0);...  /* 
d9d0: 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
d9e0: 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
d9f0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
da00: 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68  s 'full'; for th
da10: 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61  e temp.  ** data
da20: 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45  base it is 'NONE
da30: 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  '. This matches 
da40: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
da50: 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
da60: 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e  .  db->aDb[0].zN
da70: 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
da80: 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
da90: 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64  y_level = 3;.  d
daa0: 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20  b->aDb[1].zName 
dab0: 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e  = "temp";.  db->
dac0: 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[1].safety_le
dad0: 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e  vel = 1;..  db->
dae0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
daf0: 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
db00: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
db10: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
db20: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
db30: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
db40: 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
db50: 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
db60: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
db70: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
db80: 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
db90: 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
dba0: 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
dbb0: 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
dbc0: 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
dbd0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
dbe0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
dbf0: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  _OK, 0);.  sqlit
dc00: 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
dc10: 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  nFunctions(db);.
dc20: 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
dc30: 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
dc40: 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
dc50: 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
dc60: 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
dc70: 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
dc80: 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
dc90: 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
dca0: 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45  sqlite3AutoLoadE
dcb0: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20  xtensions(db);. 
dcc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
dcd0: 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28  rcode(db);.  if(
dce0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
dcf0: 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
dd00: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66 64  b_out;.  }..#ifd
dd10: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
dd20: 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d  _FTS1.  if( !db-
dd30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
dd40: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
dd50: 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
dd60: 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
dd70: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49  c = sqlite3Fts1I
dd80: 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
dd90: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
dda0: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20  TE_ENABLE_FTS2. 
ddb0: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
ddc0: 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
ddd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65  LITE_OK ){.    e
dde0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
ddf0: 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65  3Fts2Init(sqlite
de00: 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
de10: 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62  lite3Fts2Init(db
de20: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
de30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
de40: 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21  BLE_FTS3.  if( !
de50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
de60: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
de70: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
de80: 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62  lite3Fts3Init(db
de90: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
dea0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
deb0: 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64  BLE_ICU.  if( !d
dec0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ded0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
dee0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
def0: 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b  ite3IcuInit(db);
df00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
df10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
df20: 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64  E_RTREE.  if( !d
df30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
df40: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
df50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
df60: 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29  te3RtreeInit(db)
df70: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
df80: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
df90: 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d   rc, 0);..  /* -
dfa0: 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  DSQLITE_DEFAULT_
dfb0: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d  LOCKING_MODE=1 m
dfc0: 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74  akes EXCLUSIVE t
dfd0: 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
dfe0: 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d  ng.  ** mode.  -
dff0: 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  DSQLITE_DEFAULT_
e000: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d  LOCKING_MODE=0 m
e010: 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  ake NORMAL the d
e020: 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
e030: 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67   ** mode.  Doing
e040: 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20   nothing at all 
e050: 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41  also makes NORMA
e060: 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20  L the default.. 
e070: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
e080: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
e090: 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c  G_MODE.  db->dfl
e0a0: 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49  tLockMode = SQLI
e0b0: 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
e0c0: 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74  NG_MODE;.  sqlit
e0d0: 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
e0e0: 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  de(sqlite3BtreeP
e0f0: 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  ager(db->aDb[0].
e100: 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  pBt),.          
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
e130: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65  OCKING_MODE);.#e
e140: 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c  ndif..  /* Enabl
e150: 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
e160: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
e170: 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61   */.  setupLooka
e180: 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69  side(db, 0, sqli
e190: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
e1a0: 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20  szLookaside,.   
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
e1d0: 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
e1e0: 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ide);..  sqlite3
e1f0: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
e200: 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  int(db, SQLITE_D
e210: 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
e220: 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65  HECKPOINT);..ope
e230: 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ndb_out:.  if( d
e240: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
e250: 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
e260: 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
e270: 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
e280: 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
e290: 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
e2a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e2b0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
e2c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
e2d0: 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69  errcode(db);.  i
e2e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
e2f0: 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MEM ){.    sqlit
e300: 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20  e3_close(db);.  
e310: 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73    db = 0;.  }els
e320: 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
e330: 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  _OK ){.    db->m
e340: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
e350: 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20  GIC_SICK;.  }.  
e360: 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20 20 72 65  *ppDb = db;.  re
e370: 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45  turn sqlite3ApiE
e380: 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  xit(0, rc);.}../
e390: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
e3a0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
e3b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e3c0: 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  open(.  const ch
e3d0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  ar *zFilename, .
e3e0: 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
e3f0: 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70   .){.  return op
e400: 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
e410: 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20  name, ppDb,.    
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
e440: 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
e450: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
e460: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
e470: 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74  open_v2(.  const
e480: 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c   char *filename,
e490: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
e4a0: 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20  ilename (UTF-8) 
e4b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
e4c0: 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pDb,         /* 
e4d0: 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68  OUT: SQLite db h
e4e0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66  andle */.  int f
e4f0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
e500: 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20     /* Flags */. 
e510: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
e520: 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  s        /* Name
e530: 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74   of VFS module t
e540: 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65  o use */.){.  re
e550: 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
e560: 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  e(filename, ppDb
e570: 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  , flags, zVfs);.
e580: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e590: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
e5a0: 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61  ** Open a new da
e5b0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
e5c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  /.int sqlite3_op
e5d0: 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f  en16(.  const vo
e5e0: 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a  id *zFilename, .
e5f0: 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
e600: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
e610: 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20   *zFilename8;   
e620: 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63  /* zFilename enc
e630: 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e  oded in UTF-8 in
e640: 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20  stead of UTF-16 
e650: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
e660: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
e670: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 7a  rc;..  assert( z
e680: 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73  Filename );.  as
e690: 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20 20  sert( ppDb );.  
e6a0: 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
e6b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e6c0: 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
e6d0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
e6e0: 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
e6f0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
e700: 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  f.  pVal = sqlit
e710: 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
e720: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
e730: 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
e740: 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
e750: 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
e760: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
e770: 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
e780: 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
e790: 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
e7a0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
e7b0: 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
e7c0: 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
e7d0: 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
e800: 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
e810: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
e820: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
e830: 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
e840: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
e850: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e860: 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
e870: 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
e880: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
e890: 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70 44  {.      ENC(*ppD
e8a0: 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  b) = SQLITE_UTF1
e8b0: 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20  6NATIVE;.    }. 
e8c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
e8d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e8e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75   }.  sqlite3Valu
e8f0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
e900: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
e910: 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a  iExit(0, rc);.}.
e920: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
e930: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
e940: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
e950: 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
e960: 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
e970: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e980: 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
e990: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
e9a0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
e9b0: 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
e9c0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
e9d0: 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
e9e0: 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
e9f0: 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
ea00: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
ea10: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
ea20: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
ea30: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ea40: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
ea50: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
ea60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
ea70: 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
ea80: 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
ea90: 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f  8)enc, SQLITE_CO
eaa0: 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c 20 78  LL_USER, pCtx, x
eab0: 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72  Compare, 0);.  r
eac0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
ead0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
eae0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
eaf0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
eb00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
eb10: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
eb20: 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
eb30: 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
eb40: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
eb50: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
eb60: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
eb70: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
eb80: 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
eb90: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
eba0: 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
ebb0: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
ebc0: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
ebd0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
ebe0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
ebf0: 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
ec00: 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
ec10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ec20: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
ec30: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
ec40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ec50: 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
ec60: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
ec70: 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 53 51  ame, (u8)enc, SQ
ec80: 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20  LITE_COLL_USER, 
ec90: 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
eca0: 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71  xDel);.  rc = sq
ecb0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
ecc0: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
ecd0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
ece0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
ecf0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
ed00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
ed10: 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  6./*.** Register
ed20: 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
ed30: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
ed40: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
ed50: 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
ed60: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
ed70: 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  lation16(.  sqli
ed80: 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
ed90: 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20  t void *zName,. 
eda0: 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
edb0: 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
edc0: 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
edd0: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
ede0: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
edf0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
ee00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
ee10: 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69   *zName8;.  sqli
ee20: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
ee30: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
ee40: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
ee50: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61  cFailed );.  zNa
ee60: 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  me8 = sqlite3Utf
ee70: 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c  16to8(db, zName,
ee80: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31   -1, SQLITE_UTF1
ee90: 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20  6NATIVE);.  if( 
eea0: 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63  zName8 ){.    rc
eeb0: 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
eec0: 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28  on(db, zName8, (
eed0: 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43  u8)enc, SQLITE_C
eee0: 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c 20  OLL_USER, pCtx, 
eef0: 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20  xCompare, 0);.  
ef00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ef10: 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d  db, zName8);.  }
ef20: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
ef30: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
ef40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ef50: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
ef60: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ef70: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ef80: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
ef90: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
efa0: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
efb0: 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
efc0: 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
efd0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
efe0: 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
eff0: 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
f000: 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
f010: 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
f020: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
f030: 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
f040: 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ed(.  sqlite3 *d
f050: 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
f060: 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
f070: 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
f080: 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
f090: 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
f0a0: 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20  nst char*).){.  
f0b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f0c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f0d0: 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
f0e0: 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b  d = xCollNeeded;
f0f0: 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
f100: 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  ed16 = 0;.  db->
f110: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
f120: 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
f130: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f140: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
f150: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
f160: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
f170: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
f180: 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
f190: 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
f1a0: 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
f1b0: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
f1c0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
f1d0: 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
f1e0: 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
f1f0: 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
f200: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
f210: 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
f220: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
f230: 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74  eeded16(.  sqlit
f240: 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
f250: 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
f260: 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
f270: 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73  eeded16)(void*,s
f280: 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
f290: 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  tRep,const void*
f2a0: 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ).){.  sqlite3_m
f2b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f2c0: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
f2d0: 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  llNeeded = 0;.  
f2e0: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
f2f0: 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31  6 = xCollNeeded1
f300: 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  6;.  db->pCollNe
f310: 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
f320: 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
f330: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f340: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f350: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f360: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
f370: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
f380: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f390: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
f3a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
f3b0: 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61  tion is now an a
f3c0: 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75  nachronism. It u
f3d0: 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74  sed to be used t
f3e0: 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
f3f0: 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  .** malloc() fai
f400: 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65  lure, but SQLite
f410: 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61   now does this a
f420: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f  utomatically..*/
f430: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .int sqlite3_glo
f440: 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64  bal_recover(void
f450: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
f460: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
f470: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
f480: 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
f490: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
f4a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
f4b0: 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f  autocommit.** mo
f4c0: 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
f4d0: 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41   if it is and FA
f4e0: 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74  LSE if not.  Aut
f4f0: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20  ocommit mode is 
f500: 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  on.** by default
f510: 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73  .  Autocommit is
f520: 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42   disabled by a B
f530: 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61  EGIN statement a
f540: 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20  nd reenabled.** 
f550: 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d  by the next COMM
f560: 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a  IT or ROLLBACK..
f570: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20  **.******* THIS 
f580: 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45 4e 54  IS AN EXPERIMENT
f590: 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20 53 55  AL API AND IS SU
f5a0: 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47 45 20  BJECT TO CHANGE 
f5b0: 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ******.*/.int sq
f5c0: 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
f5d0: 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
f5e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
f5f0: 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f  autoCommit;.}../
f600: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
f610: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
f620: 73 75 62 74 69 74 75 74 65 73 20 66 6f 72 20 63  subtitutes for c
f630: 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f  onstants SQLITE_
f640: 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49  CORRUPT,.** SQLI
f650: 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54  TE_MISUSE, SQLIT
f660: 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49  E_CANTOPEN, SQLI
f670: 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73  TE_IOERR and pos
f680: 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f  sibly other erro
f690: 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20  r.** constants. 
f6a0: 20 54 68 65 79 20 73 65 72 76 65 72 20 74 77 6f   They server two
f6b0: 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a   purposes:.**.**
f6c0: 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20     1.  Serve as 
f6d0: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
f6e0: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
f6f0: 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75  kpoint in a debu
f700: 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f  gger.**       to
f710: 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72   detect when ver
f720: 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  sion error condi
f730: 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a  tions occurs..**
f740: 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65  .**   2.  Invoke
f750: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74   sqlite3_log() t
f760: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f  o provide the so
f770: 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69  urce code locati
f780: 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20  on where.**     
f790: 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72    a low-level er
f7a0: 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74  ror is first det
f7b0: 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ected..*/.int sq
f7c0: 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f  lite3CorruptErro
f7d0: 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
f7e0: 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
f7f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
f800: 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
f810: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
f820: 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20  ORRUPT,.        
f830: 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65 20        "database 
f840: 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69  corruption at li
f850: 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
f860: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f870: 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
f880: 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
f890: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f8a0: 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20  _CORRUPT;.}.int 
f8b0: 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72  sqlite3MisuseErr
f8c0: 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
f8d0: 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
f8e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
f8f0: 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
f900: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
f910: 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20  MISUSE, .       
f920: 20 20 20 20 20 20 20 22 6d 69 73 75 73 65 20 61         "misuse a
f930: 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e  t line %d of [%.
f940: 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  10s]",.         
f950: 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b       lineno, 20+
f960: 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
f970: 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ());.  return SQ
f980: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69  LITE_MISUSE;.}.i
f990: 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70  nt sqlite3Cantop
f9a0: 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  enError(int line
f9b0: 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
f9c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
f9d0: 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
f9e0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
f9f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a  LITE_CANTOPEN, .
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
fa10: 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20  annot open file 
fa20: 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
fa30: 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
fa40: 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
fa50: 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
fa60: 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
fa70: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
fa80: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
fa90: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
faa0: 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ED./*.** This is
fab0: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72   a convenience r
fac0: 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65  outine that make
fad0: 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  s sure that all 
fae0: 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a  thread-specific.
faf0: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  ** data for this
fb00: 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e   thread has been
fb10: 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a   deallocated..**
fb20: 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f  .** SQLite no lo
fb30: 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64  nger uses thread
fb40: 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73  -specific data s
fb50: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
fb60: 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  s now a.** no-op
fb70: 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65  .  It is retaine
fb80: 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  d for historical
fb90: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a   compatibility..
fba0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
fbb0: 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76  thread_cleanup(v
fbc0: 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oid){.}.#endif..
fbd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74  /*.** Return met
fbe0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  a information ab
fbf0: 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63  out a specific c
fc00: 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62  olumn of a datab
fc10: 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65  ase table..** Se
fc20: 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c  e comment in sql
fc30: 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68  ite3.h (sqlite.h
fc40: 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73  .in) for details
fc50: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
fc60: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
fc70: 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71  _METADATA.int sq
fc80: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
fc90: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73  mn_metadata(.  s
fca0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
fcb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
fcc0: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
fcd0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
fce0: 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20  *zDbName,       
fcf0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
fd00: 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  e or NULL */.  c
fd10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
fd20: 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61  eName,     /* Ta
fd30: 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ble name */.  co
fd40: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
fd50: 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c  nName,    /* Col
fd60: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
fd70: 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74  ar const **pzDat
fd80: 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54  aType,    /* OUT
fd90: 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61  PUT: Declared da
fda0: 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  ta type */.  cha
fdb0: 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c  r const **pzColl
fdc0: 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50  Seq,     /* OUTP
fdd0: 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  UT: Collation se
fde0: 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20  quence name */. 
fdf0: 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20   int *pNotNull, 
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe10: 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
fe20: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
fe30: 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  int exists */.  
fe40: 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  int *pPrimaryKey
fe50: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
fe60: 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
fe70: 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b  olumn part of PK
fe80: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f   */.  int *pAuto
fe90: 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  inc             
fea0: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
feb0: 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61  e if column is a
fec0: 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f  uto-increment */
fed0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
fee0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
fef0: 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
ff00: 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
ff10: 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
ff20: 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f  iCol;..  char co
ff30: 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d  nst *zDataType =
ff40: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
ff50: 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a   *zCollSeq = 0;.
ff60: 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20    int notnull = 
ff70: 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  0;.  int primary
ff80: 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  key = 0;.  int a
ff90: 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f  utoinc = 0;..  /
ffa0: 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74  * Ensure the dat
ffb0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
ffc0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a   been loaded */.
ffd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ffe0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
fff0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10000 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
10010 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
10020 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  (db, &zErrMsg);.
10030 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
10040 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =rc ){.    goto 
10050 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
10060 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
10070 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
10080 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71  n */.  pTab = sq
10090 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
100a0 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  b, zTableName, z
100b0 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  DbName);.  if( !
100c0 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53  pTab || pTab->pS
100d0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61  elect ){.    pTa
100e0 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  b = 0;.    goto 
100f0 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
10100 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f    /* Find the co
10110 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69  lumn for which i
10120 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64  nfo is requested
10130 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
10140 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e  3IsRowid(zColumn
10150 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f  Name) ){.    iCo
10160 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
10170 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
10180 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d   ){.      pCol =
10190 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
101a0 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  l];.    }.  }els
101b0 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  e{.    for(iCol=
101c0 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
101d0 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
101e0 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
101f0 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
10200 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
10210 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
10220 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d  Name, zColumnNam
10230 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
10240 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
10250 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
10260 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
10270 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20       pTab = 0;. 
10280 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
10290 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
102a0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
102b0 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20  ng block stores 
102c0 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  the meta informa
102d0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62  tion that will b
102e0 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  e returned.  ** 
102f0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  to the caller in
10300 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
10310 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c   zDataType, zCol
10320 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70  lSeq, notnull, p
10330 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61  rimarykey.  ** a
10340 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74  nd autoinc. At t
10350 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
10360 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c  are two possibil
10370 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a  ities:.  ** .  *
10380 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65  *     1. The spe
10390 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  cified column na
103a0 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22  me was rowid", "
103b0 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f  oid" or "_rowid_
103c0 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61  " .  **        a
103d0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65  nd there is no e
103e0 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
103f0 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a  ed IPK column. .
10400 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e    **.  **     2.
10410 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   The table is no
10420 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  t a view and the
10430 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65   column name ide
10440 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a  ntified an .  **
10450 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74          explicit
10460 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
10470 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e  mn. Copy meta in
10480 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a  formation from *
10490 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  pCol..  */ .  if
104a0 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44  ( pCol ){.    zD
104b0 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e  ataType = pCol->
104c0 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c  zType;.    zColl
104d0 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  Seq = pCol->zCol
104e0 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d  l;.    notnull =
104f0 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d   pCol->notNull!=
10500 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  0;.    primaryke
10510 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69  y  = pCol->isPri
10520 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61 75 74  mKey!=0;.    aut
10530 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
10540 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
10550 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
10560 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
10570 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
10580 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
10590 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
105a0 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
105b0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
105c0 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
105d0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
105e0 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
105f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
10600 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
10610 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
10620 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
10630 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
10640 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
10650 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
10660 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
10670 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
10680 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
10690 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
106a0 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
106b0 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
106c0 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
106d0 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
106e0 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
106f0 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
10700 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
10710 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
10720 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
10730 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
10740 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
10750 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
10760 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
10770 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
10780 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
10790 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
107a0 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
107b0 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
107c0 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
107d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
107e0 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
107f0 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
10800 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10810 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
10820 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
10830 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
10840 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
10850 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
10860 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
10870 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
10880 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
10890 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
108a0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
108b0 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
108c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
108d0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
108e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
108f0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
10900 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10910 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c  #endif../*.** Sl
10920 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
10930 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
10940 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
10950 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74  me slept..*/.int
10960 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69   sqlite3_sleep(i
10970 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65  nt ms){.  sqlite
10980 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69  3_vfs *pVfs;.  i
10990 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20  nt rc;.  pVfs = 
109a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
109b0 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d  (0);.  if( pVfs=
109c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
109d0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
109e0 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c  on works in mill
109f0 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68  iseconds, but th
10a00 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53  e underlying OsS
10a10 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49  leep() .  ** API
10a20 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e   uses microsecon
10a30 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30  ds. Hence the 10
10a40 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  00's..  */.  rc 
10a50 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  = (sqlite3OsSlee
10a60 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29  p(pVfs, 1000*ms)
10a70 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  /1000);.  return
10a80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
10a90 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
10aa0 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73  the extended res
10ab0 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e  ult codes..*/.in
10ac0 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
10ad0 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
10ae0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
10af0 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74   onoff){.  sqlit
10b00 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10b10 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
10b20 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66  >errMask = onoff
10b30 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
10b40 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  0xff;.  sqlite3_
10b50 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10b60 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10b70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10b80 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
10b90 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74  xFileControl met
10ba0 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75  hod on a particu
10bb0 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  lar database..*/
10bc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c  .int sqlite3_fil
10bd0 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  e_control(sqlite
10be0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
10bf0 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20  r *zDbName, int 
10c00 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
10c10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10c20 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20  TE_ERROR;.  int 
10c30 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  iDb;.  sqlite3_m
10c40 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
10c50 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62  utex);.  if( zDb
10c60 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
10c70 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Db = 0;.  }else{
10c80 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20  .    for(iDb=0; 
10c90 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
10ca0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
10cb0 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44  trcmp(db->aDb[iD
10cc0 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  b].zName, zDbNam
10cd0 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
10ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
10cf0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20  Db<db->nDb ){.  
10d00 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
10d10 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
10d20 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 72  Bt;.    if( pBtr
10d30 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  ee ){.      Page
10d40 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20  r *pPager;.     
10d50 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
10d60 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
10d70 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
10d80 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
10d90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
10da0 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  ager(pBtree);.  
10db0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10dc0 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  er!=0 );.      f
10dd0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
10de0 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
10df0 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d      assert( fd!=
10e00 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  0 );.      if( f
10e10 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
10e20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10e30 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
10e40 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  (fd, op, pArg);.
10e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
10e60 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10e70 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  pBtree);.    }. 
10e80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
10e90 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
10ea0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
10eb0 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ;   .}../*.** In
10ec0 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
10ed0 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
10ee0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
10ef0 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
10f00 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
10f10 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
10f20 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
10f30 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74  N_TEST.  va_list
10f40 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
10f50 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
10f60 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  h( op ){..    /*
10f70 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65  .    ** Save the
10f80 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
10f90 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20  f the PRNG..    
10fa0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
10fb0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
10fc0 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  _SAVE: {.      s
10fd0 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74  qlite3PrngSaveSt
10fe0 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
10ff0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
11000 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65  *.    ** Restore
11010 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
11020 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61  e PRNG to the la
11030 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75  st state saved u
11040 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47  sing.    ** PRNG
11050 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f  _SAVE.  If PRNG_
11060 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62  SAVE has never b
11070 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65  efore been calle
11080 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  d, then.    ** t
11090 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69  his verb acts li
110a0 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20  ke PRNG_RESET.. 
110b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
110c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
110d0 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20  RNG_RESTORE: {. 
110e0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
110f0 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a  RestoreState();.
11100 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11110 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
11120 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47  * Reset the PRNG
11130 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69   back to its uni
11140 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
11150 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c  .  The next call
11160 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
11170 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20  e3_randomness() 
11180 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20  will reseed the 
11190 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e  PRNG using a sin
111a0 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  gle call.    ** 
111b0 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65  to the xRandomne
111c0 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ss method of the
111d0 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20   default VFS..  
111e0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
111f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
11200 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20  NG_RESET: {.    
11210 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73    sqlite3PrngRes
11220 65 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  etState();.     
11230 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
11240 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
11250 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
11260 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20  ol(BITVEC_TEST, 
11270 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20  size, program). 
11280 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e     **.    ** Run
11290 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20   a test against 
112a0 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20  a Bitvec object 
112b0 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72  of size.  The pr
112c0 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20  ogram argument. 
112d0 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61     ** is an arra
112e0 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68  y of integers th
112f0 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74  at defines the t
11300 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  est.  Return -1 
11310 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f  on a.    ** memo
11320 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
11330 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73  ror, 0 on succes
11340 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66  s, or non-zero f
11350 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  or an error..   
11360 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69   ** See the sqli
11370 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
11380 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74  Test() for addit
11390 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
113a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
113b0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
113c0 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20  RL_BITVEC_TEST: 
113d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
113e0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
113f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72  ;.      int *aPr
11400 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
11410 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20  int*);.      rc 
11420 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  = sqlite3BitvecB
11430 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61  uiltinTest(sz, a
11440 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65  Prog);.      bre
11450 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
11460 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
11470 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
11480 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
11490 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64  KS, xBegin, xEnd
114a0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
114b0 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74  Register hooks t
114c0 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61  o call to indica
114d0 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28  te which malloc(
114e0 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20  ) failures .    
114f0 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20  ** are benign.. 
11500 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
11510 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
11520 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
11530 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  KS: {.      type
11540 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f  def void (*void_
11550 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b  function)(void);
11560 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
11570 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69  tion xBenignBegi
11580 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  n;.      void_fu
11590 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e  nction xBenignEn
115a0 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  d;.      xBenign
115b0 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61  Begin = va_arg(a
115c0 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
115d0 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  );.      xBenign
115e0 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  End = va_arg(ap,
115f0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
11600 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
11610 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28  nignMallocHooks(
11620 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42  xBenignBegin, xB
11630 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20  enignEnd);.     
11640 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
11650 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
11660 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
11670 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
11680 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  RL_PENDING_BYTE,
11690 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29   unsigned int X)
116a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
116b0 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  et the PENDING b
116c0 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65  yte to the value
116d0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
116e0 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a  , if X>0..    **
116f0 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
11700 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72   if X==0.  Retur
11710 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
11720 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a  he pending byte.
11730 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69      ** as it exi
11740 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69  sting before thi
11750 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
11760 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  lled..    **.   
11770 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20   ** IMPORTANT:  
11780 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
11790 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30  DING byte from 0
117a0 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74  x40000000 result
117b0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69  s in.    ** an i
117c0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61  ncompatible data
117d0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  base file format
117e0 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  .  Changing the 
117f0 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20  PENDING byte.   
11800 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61   ** while any da
11810 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11820 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74  n is open result
11830 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61  s in undefined a
11840 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65  nd.    ** dilete
11850 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a  rious behavior..
11860 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
11870 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
11880 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a  PENDING_BYTE: {.
11890 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49        rc = PENDI
118a0 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66  NG_BYTE;.#ifndef
118b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44   SQLITE_OMIT_WSD
118c0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
118d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65   unsigned int ne
118e0 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70  wVal = va_arg(ap
118f0 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b  , unsigned int);
11900 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  .        if( new
11910 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e  Val ) sqlite3Pen
11920 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61  dingByte = newVa
11930 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  l;.      }.#endi
11940 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  f.      break;. 
11950 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
11960 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
11970 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
11980 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
11990 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
119a0 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
119b0 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
119c0 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
119d0 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
119e0 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  t.    ** assert(
119f0 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74  ) was enabled at
11a00 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20   compile-time.  
11a10 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64  If X is true and
11a20 20 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a   assert().    **
11a30 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
11a40 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
11a50 75 65 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  ue is true.  If 
11a60 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20  X is true and.  
11a70 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73    ** assert() is
11a80 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
11a90 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
11aa0 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20   is zero.  If X 
11ab0 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20  is.    ** false 
11ac0 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20  and assert() is 
11ad0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
11ae0 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65  e assertion fire
11af0 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  s and the.    **
11b00 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e   process aborts.
11b10 20 20 49 66 20 58 20 69 73 20 66 61 6c 73 65 20    If X is false 
11b20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73 20  and assert() is 
11b30 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
11b40 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  he.    ** return
11b50 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a   value is zero..
11b60 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
11b70 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
11b80 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20  ASSERT: {.      
11b90 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d  volatile int x =
11ba0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
11bb0 28 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70  ( (x = va_arg(ap
11bc0 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20  ,int))!=0 );.   
11bd0 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20     rc = x;.     
11be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
11bf0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
11c00 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
11c10 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
11c20 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20  TRL_ALWAYS, int 
11c30 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
11c40 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
11c50 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
11c60 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77   test to see how
11c70 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a   the ALWAYS and.
11c80 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63      ** NEVER mac
11c90 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ros were defined
11ca0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
11cb0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11cc0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
11cd0 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20   is ALWAYS(X).  
11ce0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
11cf0 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74  he recommended t
11d00 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66  est is X==2.  If
11d10 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
11d20 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61  e is 2, that mea
11d30 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53  ns.    ** ALWAYS
11d40 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
11d50 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61  re both no-op pa
11d60 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
11d70 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  s, which is the.
11d80 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73      ** default s
11d90 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  etting.  If the 
11da0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
11db0 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29  1, then ALWAYS()
11dc0 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a   is either.    *
11dd0 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20  * hard-coded to 
11de0 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20  true or else it 
11df0 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61  asserts if its a
11e00 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
11e10 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
11e20 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72  st behavior (har
11e30 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29  d-coded to true)
11e40 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
11e50 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
11e60 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
11e70 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
11e80 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e  ) is disabled an
11e90 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20  d the second.   
11ea0 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73   ** behavior (as
11eb0 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75  sert if the argu
11ec0 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29  ment to ALWAYS()
11ed0 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68   is false) is th
11ee0 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
11ef0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
11f00 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
11f10 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65  at assert() is e
11f20 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nabled..    **. 
11f30 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69     ** The run-ti
11f40 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  me test procedur
11f50 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d  e might look som
11f60 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73  ething like this
11f70 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
11f80 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
11f90 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
11fa0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
11fb0 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20  YS, 2)==2 ){.   
11fc0 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
11fd0 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
11fe0 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d   are no-op pass-
11ff0 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20  through macros. 
12000 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69     **    }else i
12010 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
12020 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
12030 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
12040 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  1) ){.    **    
12050 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61    // ALWAYS(x) a
12060 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73  sserts that x is
12070 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20   true. NEVER(x) 
12080 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c  asserts x is fal
12090 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  se..    **    }e
120a0 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  lse{.    **     
120b0 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73   // ALWAYS(x) is
120c0 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20   a constant 1.  
120d0 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f  NEVER(x) is a co
120e0 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a  nstant 0..    **
120f0 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20      }.    */.   
12100 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
12110 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a  TCTRL_ALWAYS: {.
12120 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
12130 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
12140 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28      rc = ALWAYS(
12150 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
12160 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
12170 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
12180 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
12190 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73  TCTRL_RESERVE, s
121a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
121b0 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
121c0 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72 76   Set the nReserv
121d0 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20  e size to N for 
121e0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
121f0 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
12200 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  e.    ** connect
12210 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20  ion db..    */. 
12220 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
12230 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a  ESTCTRL_RESERVE:
12240 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
12250 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
12260 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
12270 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
12280 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
12290 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
122a0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
122b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
122c0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 64  reeSetPageSize(d
122d0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
122e0 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , x, 0);.      s
122f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12300 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
12310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12320 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
12330 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
12340 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
12350 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73  OPTIMIZATIONS, s
12360 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
12370 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N).    **.    **
12380 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
12390 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  le various optim
123a0 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73  izations for tes
123b0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
123c0 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75  The .    ** argu
123d0 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d  ment N is a bitm
123e0 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74  ask of optimizat
123f0 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62  ions to be disab
12400 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c  led.  For normal
12410 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
12420 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e  n N should be 0.
12430 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68    The idea is th
12440 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72 61  at a test progra
12450 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20  m (like the.    
12460 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73  ** SQL Logic Tes
12470 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f  t or SLT test mo
12480 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68  dule) can run th
12490 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69  e same SQL multi
124a0 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a  ple times.    **
124b0 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70   with various op
124c0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61  timizations disa
124d0 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  bled to verify t
124e0 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73  hat the same ans
124f0 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62  wer.    ** is ob
12500 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20  tained in every 
12510 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
12520 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
12530 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
12540 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ONS: {.      sql
12550 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
12560 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
12570 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
12580 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
12590 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d       db->flags =
125a0 20 28 78 20 26 20 53 51 4c 49 54 45 5f 4f 70 74   (x & SQLITE_Opt
125b0 4d 61 73 6b 29 20 7c 20 28 64 62 2d 3e 66 6c 61  Mask) | (db->fla
125c0 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 70 74  gs & ~SQLITE_Opt
125d0 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 62 72 65  Mask);.      bre
125e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ak;.    }..#ifde
125f0 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  f SQLITE_N_KEYWO
12600 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  RD.    /* sqlite
12610 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
12620 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
12630 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20  SKEYWORD, const 
12640 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20  char *zWord).   
12650 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57   **.    ** If zW
12660 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64  ord is a keyword
12670 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74   recognized by t
12680 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20  he parser, then 
12690 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a  return the.    *
126a0 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77  * number of keyw
126b0 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f  ords.  Or if zWo
126c0 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77  rd is not a keyw
126d0 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ord, return 0.. 
126e0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68     ** .    ** Th
126f0 69 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20  is test feature 
12700 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
12710 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d  e in the amalgam
12720 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20  ation since.    
12730 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f  ** the SQLITE_N_
12740 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73  KEYWORD macro is
12750 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20   not defined in 
12760 74 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c  this file if SQL
12770 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75  ite.    ** is bu
12780 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61  ilt using separa
12790 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e  te source files.
127a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
127b0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
127c0 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20  _ISKEYWORD: {.  
127d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
127e0 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61  zWord = va_arg(a
127f0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
12800 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
12810 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12820 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20  Word);.      rc 
12830 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  = (sqlite3Keywor
12840 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64  dCode((u8*)zWord
12850 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53  , n)!=TK_ID) ? S
12860 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
12870 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  : 0;.      break
12880 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a  ;.    }.#endif .
12890 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
128a0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
128b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 47 48  ITE_TESTCTRL_PGH
128c0 44 52 53 5a 29 0a 20 20 20 20 2a 2a 0a 20 20 20  DRSZ).    **.   
128d0 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73   ** Return the s
128e0 69 7a 65 20 6f 66 20 61 20 70 63 61 63 68 65 20  ize of a pcache 
128f0 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 2e  header in bytes.
12900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
12910 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
12920 5f 50 47 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20  _PGHDRSZ: {.    
12930 20 20 72 63 20 3d 20 73 69 7a 65 6f 66 28 50 67    rc = sizeof(Pg
12940 48 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Hdr);.      brea
12950 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
12960 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
12970 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
12980 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
12990 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20  LOC, sz, &pNew, 
129a0 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20  pFree);.    **. 
129b0 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65     ** Pass pFree
129c0 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72   into sqlite3Scr
129d0 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20  atchFree(). .   
129e0 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e   ** If sz>0 then
129f0 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61   allocate a scra
12a00 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20  tch buffer into 
12a10 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  pNew.  .    */. 
12a20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
12a30 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
12a40 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76  ALLOC: {.      v
12a50 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70  oid *pFree, **pp
12a60 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  New;.      int s
12a70 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61  z;.      sz = va
12a80 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
12a90 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f       ppNew = va_
12aa0 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b  arg(ap, void**);
12ab0 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76  .      pFree = v
12ac0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
12ad0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29  ;.      if( sz )
12ae0 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65   *ppNew = sqlite
12af0 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73  3ScratchMalloc(s
12b00 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
12b10 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72  3ScratchFree(pFr
12b20 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ee);.      break
12b30 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 76  ;.    }..  }.  v
12b40 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
12b50 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12b60 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
12b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.