/ Hex Artifact Content
Login

Artifact fa654e1802e14a5f6c09c37971c3b69c1001d9c8:


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 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
1910: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30  ENTATION-OF: R-0
1920: 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74  0140-37445 SQLit
1930: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
1940: 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73  serializes calls
1950: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e  .  ** to the xIn
1960: 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68  it method, so th
1970: 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e  e xInit method n
1980: 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61  eed not be threa
1990: 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dsafe..  **.  **
19a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
19b0: 75 74 65 78 20 69 73 20 77 68 61 74 20 73 65 72  utex is what ser
19c0: 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74  ializes access t
19d0: 6f 20 74 68 65 20 61 70 70 64 65 66 20 70 63 61  o the appdef pca
19e0: 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d  che xInit.  ** m
19f0: 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c  ethods.  The sql
1a00: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
1a10: 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20  ods.xInit() all 
1a20: 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74  is embedded in t
1a30: 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  he.  ** call to 
1a40: 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69  sqlite3PcacheIni
1a50: 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a  tialize()..  */.
1a60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1a70: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f  enter(sqlite3Glo
1a80: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1a90: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
1aa0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ab0: 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71  .isInit==0 && sq
1ac0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ad0: 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20  g.inProgress==0 
1ae0: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61  ){.    FuncDefHa
1af0: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f  sh *pHash = &GLO
1b00: 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c  BAL(FuncDefHash,
1b10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75   sqlite3GlobalFu
1b20: 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71  nctions);.    sq
1b30: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b40: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31  g.inProgress = 1
1b50: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61  ;.    memset(pHa
1b60: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  sh, 0, sizeof(sq
1b70: 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74  lite3GlobalFunct
1b80: 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69  ions));.    sqli
1b90: 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61  te3RegisterGloba
1ba0: 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20  lFunctions();.  
1bb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1bc0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1bd0: 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  heInit==0 ){.   
1be0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1bf0: 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28  cacheInitialize(
1c00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1c30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
1c40: 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20  acheInit = 1;.  
1c50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c60: 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a  OsInit();.    }.
1c70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1c90: 71 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66  qlite3PCacheBuff
1ca0: 65 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33  erSetup( sqlite3
1cb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
1cc0: 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  ge, .          s
1cd0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ce0: 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74  ig.szPage, sqlit
1cf0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1d00: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Page);.      sql
1d10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1d20: 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  .isInit = 1;.   
1d30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c   }.    sqlite3Gl
1d40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1d50: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  gress = 0;.  }. 
1d60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d70: 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62  eave(sqlite3Glob
1d80: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1d90: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62  tex);..  /* Go b
1da0: 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74  ack under the st
1db0: 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63  atic mutex and c
1dc0: 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 63 75  lean up the recu
1dd0: 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78  rsive.  ** mutex
1de0: 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65   to prevent a re
1df0: 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a  source leak..  *
1e00: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1e10: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
1e20: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
1e30: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1e40: 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73  Mutex--;.  if( s
1e50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e60: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1e70: 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=0 ){.    asser
1e80: 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  t( sqlite3Global
1e90: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1ea0: 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
1eb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1ec0: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
1ed0: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1f00: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Mutex = 0;.  }. 
1f10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1f20: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1f30: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1f40: 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e  ng is just a san
1f50: 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ity check to mak
1f60: 65 20 73 75 72 65 20 53 51 4c 69 74 65 20 68 61  e sure SQLite ha
1f70: 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70  s.  ** been comp
1f80: 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  iled correctly. 
1f90: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
1fa0: 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64   to run this cod
1fb0: 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64  e, but.  ** we d
1fc0: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e  on't want to run
1fd0: 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e   it too often an
1fe0: 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79  d soak up CPU cy
1ff0: 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a  cles for no.  **
2000: 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20   reason.  So we 
2010: 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69  run it once duri
2020: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
2030: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
2040: 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53  NDEBUG.#ifndef S
2050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
2060: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54  ING_POINT.  /* T
2070: 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63  his section of c
2080: 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70  ode's only "outp
2090: 75 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72  ut" is via asser
20a0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  t() statements. 
20b0: 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51  */.  if ( rc==SQ
20c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
20d0: 36 34 20 78 20 3d 20 28 28 28 75 36 34 29 31 29  64 x = (((u64)1)
20e0: 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75  <<63)-1;.    dou
20f0: 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72  ble y;.    asser
2100: 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b  t(sizeof(x)==8);
2110: 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65  .    assert(size
2120: 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29  of(x)==sizeof(y)
2130: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79  );.    memcpy(&y
2140: 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73  , &x, 8);.    as
2150: 73 65 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e  sert( sqlite3IsN
2160: 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  aN(y) );.  }.#en
2170: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  dif.#endif..  re
2180: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2190: 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63  * Undo the effec
21a0: 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e  ts of sqlite3_in
21b0: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73  itialize().  Mus
21c0: 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  t not be called 
21d0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61  while.** there a
21e0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
21f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2200: 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c  ons or memory al
2210: 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20  locations or.** 
2220: 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f  while any part o
2230: 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65  f SQLite is othe
2240: 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20  rwise in use in 
2250: 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69  any thread.  Thi
2260: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
2270: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20  not threadsafe. 
2280: 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20   But it is safe 
2290: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  to invoke this r
22a0: 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65  outine.** on whe
22b0: 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  n SQLite is alre
22c0: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20  ady shut down.  
22d0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  If SQLite is alr
22e0: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a  eady shut down.*
22f0: 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
2300: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  ine is invoked, 
2310: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
2320: 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
2330: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
2340: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76  lite3_shutdown(v
2350: 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  oid){.  if( sqli
2360: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2370: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  isInit ){.    sq
2380: 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a  lite3_os_end();.
2390: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
23a0: 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e  t_auto_extension
23b0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
23c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
23d0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  it = 0;.  }.  if
23e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
23f0: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
2400: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
2410: 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28  3PcacheShutdown(
2420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
2430: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
2440: 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  cheInit = 0;.  }
2450: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2460: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
2470: 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  locInit ){.    s
2480: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28  qlite3MallocEnd(
2490: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
24a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
24b0: 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  locInit = 0;.  }
24c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74  obalConfig.isMut
24e0: 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  exInit ){.    sq
24f0: 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b  lite3MutexEnd();
2500: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2510: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78  alConfig.isMutex
2520: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Init = 0;.  }.. 
2530: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2540: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
2550: 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c   API allows appl
2560: 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69  ications to modi
2570: 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f  fy the global co
2580: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a  nfiguration of.*
2590: 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  * the SQLite lib
25a0: 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65  rary at run-time
25b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25c0: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
25d0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
25e0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
25f0: 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61  standing.** data
2600: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2610: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
2620: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f  ations.  This ro
2630: 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  utine is not.** 
2640: 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61 69  threadsafe.  Fai
2650: 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68 65  lure to heed the
2660: 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20  se warnings can 
2670: 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63  lead to unpredic
2680: 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f  table.** behavio
2690: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
26a0: 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c  3_config(int op,
26b0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
26c0: 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   ap;.  int rc = 
26d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
26e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
26f0: 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53  ) shall return S
2700: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20  QLITE_MISUSE if 
2710: 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68  it is invoked wh
2720: 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  ile.  ** the SQL
2730: 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20 69  ite library is i
2740: 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20  n use. */.  if( 
2750: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2760: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
2770: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
2780: 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74  E_BKPT;..  va_st
2790: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
27a0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
27b0: 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69    /* Mutex confi
27c0: 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
27d0: 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61   are only availa
27e0: 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73  ble in a threads
27f0: 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  afe.    ** compi
2800: 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20  le. .    */.#if 
2810: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2820: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
2830: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
2840: 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  0.    case SQLIT
2850: 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54  E_CONFIG_SINGLET
2860: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
2870: 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75  * Disable all mu
2880: 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  texing */.      
2890: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
28a0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
28b0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
28c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
28d0: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20  ullMutex = 0;.  
28e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2900: 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52  _CONFIG_MULTITHR
2910: 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAD: {.      /* 
2920: 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67  Disable mutexing
2930: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
2940: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  nections */.    
2950: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
2960: 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74  xing of core dat
2970: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
2980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2990: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
29a0: 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  utex = 1;.      
29b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
29c0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
29d0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
29e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
29f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45  SQLITE_CONFIG_SE
2a00: 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20  RIALIZED: {.    
2a10: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20    /* Enable all 
2a20: 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20  mutexing */.    
2a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2a40: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
2a50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
2a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2a70: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a  bFullMutex = 1;.
2a80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a90: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2aa0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a  TE_CONFIG_MUTEX:
2ab0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
2ac0: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
2ad0: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
2ae0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
2af0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b00: 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61  nfig.mutex = *va
2b10: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
2b20: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
2b30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2b40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2b50: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
2b60: 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  UTEX: {.      /*
2b70: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
2b80: 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c  rrent mutex impl
2b90: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
2ba0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
2bb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
2bc0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
2bd0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
2be0: 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tex;.      break
2bf0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2c00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2c10: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20  _CONFIG_MALLOC: 
2c20: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
2c30: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
2c40: 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65  e malloc impleme
2c50: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
2c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2c70: 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67  nfig.m = *va_arg
2c80: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
2c90: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
2ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2cb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2cc0: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a  ONFIG_GETMALLOC:
2cd0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
2ce0: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
2cf0: 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d   malloc() implem
2d00: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2d10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2d20: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c  balConfig.m.xMal
2d30: 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  loc==0 ) sqlite3
2d40: 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b  MemSetDefault();
2d50: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
2d60: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  p, sqlite3_mem_m
2d70: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
2d80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2d90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2da0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2db0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53  LITE_CONFIG_MEMS
2dc0: 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f  TATUS: {.      /
2dd0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
2de0: 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73  ble the malloc s
2df0: 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e  tatus collection
2e00: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2e10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d  3GlobalConfig.bM
2e20: 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28  emstat = va_arg(
2e30: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
2e40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2e50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2e60: 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20  FIG_SCRATCH: {. 
2e70: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
2e80: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73  e a buffer for s
2e90: 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70  cratch memory sp
2ea0: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ace */.      sql
2eb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2ec0: 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .pScratch = va_a
2ed0: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
2ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2ef0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
2f00: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
2f10: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
2f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2f30: 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  nScratch = va_ar
2f40: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
2f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2f60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2f70: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a  ONFIG_PAGECACHE:
2f80: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69   {.      /* Desi
2f90: 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66  gnate a buffer f
2fa0: 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65  or page cache me
2fb0: 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20  mory space */.  
2fc0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2fd0: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20  lConfig.pPage = 
2fe0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
2ff0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3000: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50  GlobalConfig.szP
3010: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3020: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3030: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3040: 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28  .nPage = va_arg(
3050: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3060: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3070: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3080: 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20  NFIG_PCACHE: {. 
3090: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
30a0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
30b0: 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d  age cache implem
30c0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
30d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
30e0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 20 3d 20 2a  onfig.pcache = *
30f0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3100: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
3110: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
3120: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3130: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3140: 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20  GETPCACHE: {.   
3150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3160: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3170: 65 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  e.xInit==0 ){.  
3180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
3190: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
31a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
31b0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
31c0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
31d0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
31e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
31f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3200: 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65     }..#if define
3210: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
3220: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
3230: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
3240: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
3250: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3260: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
3270: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
3280: 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d  uffer for heap m
3290: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
32a0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
32b0: 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d  alConfig.pHeap =
32c0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
32d0: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
32e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
32f0: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
3300: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3310: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3320: 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28  .mnReq = va_arg(
3330: 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20  ap, int);..     
3340: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3350: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31  alConfig.mnReq<1
3360: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3380: 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20  mnReq = 1;.     
3390: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
33a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
33b0: 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a  nReq>(1<<12) ){.
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d          /* cap m
33d0: 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65 20  in request size 
33e0: 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20  at 2^12 */.     
33f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3400: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28  Config.mnReq = (
3410: 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a  1<<12);.      }.
3420: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3430: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3440: 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Heap==0 ){.     
3450: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61     /* If the hea
3460: 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c  p pointer is NUL
3470: 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  L, then restore 
3480: 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65  the malloc imple
3490: 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20 20  mentation.      
34a0: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c    ** back to NUL
34b0: 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20  L pointers too. 
34c0: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
34d0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67   the malloc to g
34e0: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63  o.        ** bac
34f0: 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74  k to its default
3500: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3510: 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69  when sqlite3_ini
3520: 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20 20  tialize() is.   
3530: 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20       ** run..   
3540: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
3550: 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47  memset(&sqlite3G
3560: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30  lobalConfig.m, 0
3570: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
3580: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29  GlobalConfig.m))
3590: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68 65         /* The he
35b0: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  ap pointer is no
35c0: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73  t NULL, then ins
35d0: 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65 0a  tall one of the.
35e0: 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35 2e          ** mem5.
35f0: 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64 73  c/mem3.c methods
3600: 2e 20 49 66 20 6e 65 69 74 68 65 72 20 45 4e 41  . If neither ENA
3610: 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72 0a  BLE_MEMSYS3 nor.
3620: 20 20 20 20 20 20 20 20 2a 2a 20 45 4e 41 42 4c          ** ENABL
3630: 45 5f 4d 45 4d 53 59 53 35 20 69 73 20 64 65 66  E_MEMSYS5 is def
3640: 69 6e 65 64 2c 20 72 65 74 75 72 6e 20 61 6e 20  ined, return an 
3650: 65 72 72 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  error..        *
3660: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3670: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20  ENABLE_MEMSYS3. 
3680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
3690: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a  obalConfig.m = *
36a0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d  sqlite3MemGetMem
36b0: 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23  sys3();.#endif.#
36c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
36d0: 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20  BLE_MEMSYS5.    
36e0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
36f0: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c  lConfig.m = *sql
3700: 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73  ite3MemGetMemsys
3710: 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  5();.#endif.    
3720: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3730: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
3740: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3750: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
3760: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3770: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c  GlobalConfig.szL
3780: 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72  ookaside = va_ar
3790: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
37a0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
37b0: 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65  onfig.nLookaside
37c0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
37d0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
37e0: 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
37f0: 2f 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e  /* Record a poin
3800: 74 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65  ter to the logge
3810: 72 20 66 75 6e 63 63 74 69 6f 6e 20 61 6e 64 20  r funcction and 
3820: 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65  its first argume
3830: 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64  nt..    ** The d
3840: 65 66 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20  efault is NULL. 
3850: 20 4c 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61   Logging is disa
3860: 62 6c 65 64 20 69 66 20 74 68 65 20 66 75 6e 63  bled if the func
3870: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a  tion pointer is.
3880: 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20      ** NULL..   
3890: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
38a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20  ITE_CONFIG_LOG: 
38b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
38c0: 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
38d0: 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
38e0: 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
38f0: 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
3900: 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
3910: 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
3920: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
3930: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
3940: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
3950: 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  id(*)(void*,int,
3960: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20  const char*));. 
3970: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79       */.      ty
3980: 70 65 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46  pedef void(*LOGF
3990: 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74  UNC_t)(void*,int
39a0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  ,const char*);. 
39b0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
39c0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
39d0: 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55  va_arg(ap, LOGFU
39e0: 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  NC_t);.      sql
39f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3a00: 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72  .pLogArg = va_ar
3a10: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3a20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3a30: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3a40: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a  E_CONFIG_URI: {.
3a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3a60: 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
3a70: 72 69 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ri = va_arg(ap, 
3a80: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
3a90: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
3aa0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
3ab0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
3ac0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3ad0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
3ae0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
3af0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
3b00: 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64   up the lookasid
3b10: 65 20 62 75 66 66 65 72 73 20 66 6f 72 20 61 20  e buffers for a 
3b20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
3b30: 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ion..** Return S
3b40: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
3b50: 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f  ess.  .** If loo
3b60: 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65 61 64  kaside is alread
3b70: 79 20 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e  y active, return
3b80: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a   SQLITE_BUSY..**
3b90: 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d  .** The sz param
3ba0: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
3bb0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65  er of bytes in e
3bc0: 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c  ach lookaside sl
3bd0: 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70  ot..** The cnt p
3be0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
3bf0: 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e  number of slots.
3c00: 20 20 49 66 20 70 53 74 61 72 74 20 69 73 20 4e    If pStart is N
3c10: 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  ULL the.** space
3c20: 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69   for the lookasi
3c30: 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74  de memory is obt
3c40: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
3c50: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
3c60: 49 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74  If pStart is not
3c70: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73   NULL then it is
3c80: 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66   sz*cnt bytes of
3c90: 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66   memory to use f
3ca0: 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73  or.** the lookas
3cb0: 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ide memory..*/.s
3cc0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c  tatic int setupL
3cd0: 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33  ookaside(sqlite3
3ce0: 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66   *db, void *pBuf
3cf0: 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e  , int sz, int cn
3d00: 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70 53 74 61  t){.  void *pSta
3d10: 72 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f  rt;.  if( db->lo
3d20: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a  okaside.nOut ){.
3d30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3d40: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a  E_BUSY;.  }.  /*
3d50: 20 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69   Free any existi
3d60: 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66  ng lookaside buf
3d70: 66 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e  fer for this han
3d80: 64 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  dle before.  ** 
3d90: 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
3da0: 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74   one so we don't
3db0: 20 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70   have to have sp
3dc0: 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f  ace for .  ** bo
3dd0: 74 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  th at the same t
3de0: 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ime..  */.  if( 
3df0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
3e00: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
3e10: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
3e20: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
3e30: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
3e40: 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73  size of a lookas
3e50: 69 64 65 20 73 6c 6f 74 20 6e 65 65 64 73 20 74  ide slot needs t
3e60: 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  o be larger than
3e70: 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20   a pointer.  ** 
3e80: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
3e90: 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e  */.  if( sz<=(in
3ea0: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
3eb0: 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20  deSlot*) ) sz = 
3ec0: 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29  0;.  if( cnt<0 )
3ed0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
3ee0: 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20  sz==0 || cnt==0 
3ef0: 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  ){.    sz = 0;. 
3f00: 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20     pStart = 0;. 
3f10: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d   }else if( pBuf=
3f20: 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 52  =0 ){.    sz = R
3f30: 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 2f  OUNDDOWN8(sz); /
3f40: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
3f50: 39 33 38 32 20 2a 2f 0a 20 20 20 20 73 71 6c 69  9382 */.    sqli
3f60: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
3f70: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61  lloc();.    pSta
3f80: 72 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  rt = sqlite3Mall
3f90: 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f  oc( sz*cnt );  /
3fa0: 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33  * IMP: R-61949-3
3fb0: 35 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69  5727 */.    sqli
3fc0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
3fd0: 6f 63 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oc();.  }else{. 
3fe0: 20 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57     sz = ROUNDDOW
3ff0: 4e 38 28 73 7a 29 3b 20 2f 2a 20 49 4d 50 3a 20  N8(sz); /* IMP: 
4000: 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f  R-33038-09382 */
4010: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 42  .    pStart = pB
4020: 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f  uf;.  }.  db->lo
4030: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d  okaside.pStart =
4040: 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c   pStart;.  db->l
4050: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
4060: 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73   0;.  db->lookas
4070: 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a  ide.sz = (u16)sz
4080: 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74 20 29  ;.  if( pStart )
4090: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
40a0: 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a   LookasideSlot *
40b0: 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  p;.    assert( s
40c0: 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28  z > (int)sizeof(
40d0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
40e0: 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  );.    p = (Look
40f0: 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72  asideSlot*)pStar
4100: 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74  t;.    for(i=cnt
4110: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
4120: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
4130: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4140: 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Free;.      db->
4150: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
4160: 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28  = p;.      p = (
4170: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26  LookasideSlot*)&
4180: 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20  ((u8*)p)[sz];.  
4190: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b    }.    db->look
41a0: 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a  aside.pEnd = p;.
41b0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
41c0: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a  e.bEnabled = 1;.
41d0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
41e0: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42  e.bMalloced = pB
41f0: 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65  uf==0 ?1:0;.  }e
4200: 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  lse{.    db->loo
4210: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 30 3b  kaside.pEnd = 0;
4220: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4230: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
4240: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4250: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30  de.bMalloced = 0
4260: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
4270: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
4280: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 75  ** Return the mu
4290: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
42a0: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
42b0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71  onnection..*/.sq
42c0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c  lite3_mutex *sql
42d0: 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73 71  ite3_db_mutex(sq
42e0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
42f0: 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a  turn db->mutex;.
4300: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
4310: 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20  ration settings 
4320: 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61  for an individua
4330: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
4340: 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ction.*/.int sql
4350: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73  ite3_db_config(s
4360: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4370: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
4380: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
4390: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
43a0: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
43b0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
43c0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c  QLITE_DBCONFIG_L
43d0: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
43e0: 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76    void *pBuf = v
43f0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4400: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33  ; /* IMP: R-2683
4410: 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20  5-10964 */.     
4420: 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
4430: 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20  (ap, int);      
4440: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31   /* IMP: R-47871
4450: 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20  -25994 */.      
4460: 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67  int cnt = va_arg
4470: 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20  (ap, int);      
4480: 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d  /* IMP: R-04460-
4490: 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72  53386 */.      r
44a0: 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  c = setupLookasi
44b0: 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c  de(db, pBuf, sz,
44c0: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   cnt);.      bre
44d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
44e0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
44f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
4500: 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ct {.        int
4510: 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65   op;      /* The
4520: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   opcode */.     
4530: 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20     u32 mask;    
4540: 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62  /* Mask of the b
4550: 69 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c  it in sqlite3.fl
4560: 61 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72  ags to set/clear
4570: 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61   */.      } aFla
4580: 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  gOp[] = {.      
4590: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
45a0: 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c  FIG_ENABLE_FKEY,
45b0: 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69      SQLITE_Forei
45c0: 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20  gnKeys    },.   
45d0: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
45e0: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
45f0: 49 47 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e  IGGER, SQLITE_En
4600: 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a  ableTrigger  },.
4610: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75        };.      u
4620: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
4630: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4640: 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20  _ERROR; /* IMP: 
4650: 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f  R-42790-23372 */
4660: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4670: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61  i<ArraySize(aFla
4680: 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gOp); i++){.    
4690: 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b      if( aFlagOp[
46a0: 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20  i].op==op ){.   
46b0: 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66         int onoff
46c0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
46d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  t);.          in
46e0: 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67  t *pRes = va_arg
46f0: 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
4700: 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61        int oldFla
4710: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
4720: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e            if( on
4730: 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  off>0 ){.       
4740: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
4750: 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73  = aFlagOp[i].mas
4760: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
4770: 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20  se if( onoff==0 
4780: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ){.            d
4790: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c  b->flags &= ~aFl
47a0: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
47b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
47c0: 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73      if( oldFlags
47d0: 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20  !=db->flags ){. 
47e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
47f0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
4800: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
4810: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4820: 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
4830: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
4840: 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  Res = (db->flags
4850: 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61   & aFlagOp[i].ma
4860: 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20  sk)!=0;.        
4870: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
4880: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4890: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
48a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
48b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
48c0: 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64    }.  }.  va_end
48d0: 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (ap);.  return r
48e0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
48f0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
4900: 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d  buffer z[0..n-1]
4910: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70   contains all sp
4920: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
4930: 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f  int allSpaces(co
4940: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
4950: 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e   n){.  while( n>
4960: 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27  0 && z[n-1]==' '
4970: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74   ){ n--; }.  ret
4980: 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn n==0;.}../*.
4990: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
49a0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
49b0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
49c0: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
49d0: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
49e0: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
49f0: 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75  the padFlag argu
4a00: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
4a10: 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64   then space padd
4a20: 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  ing at the end.*
4a30: 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20  * of strings is 
4a40: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
4a50: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54  mplements the RT
4a60: 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  RIM collation..*
4a70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e  /.static int bin
4a80: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
4a90: 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74   *padFlag,.  int
4aa0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
4ab0: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
4ac0: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
4ad0: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
4ae0: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
4af0: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
4b00: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72  ey1 : nKey2;.  r
4b10: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
4b20: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
4b30: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
4b40: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
4b50: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
4b60: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
4b70: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
4b80: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
4b90: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
4ba0: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
4bb0: 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75     /* Leave rc u
4bc0: 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f  nchanged at 0 */
4bd0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4be0: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
4bf0: 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key2;.    }.  }.
4c00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4c10: 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75  /*.** Another bu
4c20: 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
4c30: 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53   sequence: NOCAS
4c40: 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  E. .**.** This c
4c50: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
4c60: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
4c70: 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61   be used for "ca
4c80: 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a  se independant.*
4c90: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53  * comparison". S
4ca0: 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67  QLite's knowledg
4cb0: 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c  e of upper and l
4cc0: 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61  ower case equiva
4cd0: 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73  lents.** extends
4ce0: 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20   only to the 26 
4cf0: 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  characters used 
4d00: 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c  in the English l
4d10: 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  anguage..**.** A
4d20: 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65  t the moment the
4d30: 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46  re is only a UTF
4d40: 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  -8 implementatio
4d50: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4d60: 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
4d70: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
4d80: 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
4d90: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
4da0: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
4db0: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
4dc0: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
4dd0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43   = sqlite3StrNIC
4de0: 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74  mp(.      (const
4df0: 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28   char *)pKey1, (
4e00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
4e10: 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32  y2, (nKey1<nKey2
4e20: 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a  )?nKey1:nKey2);.
4e30: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
4e40: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  ER(NotUsed);.  i
4e50: 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72  f( 0==r ){.    r
4e60: 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a   = nKey1-nKey2;.
4e70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
4e80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4e90: 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65  the ROWID of the
4ea0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73   most recent ins
4eb0: 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e  ert.*/.sqlite_in
4ec0: 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  t64 sqlite3_last
4ed0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71  _insert_rowid(sq
4ee0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
4ef0: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
4f00: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  id;.}../*.** Ret
4f10: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
4f20: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
4f30: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
4f40: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
4f50: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
4f60: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
4f70: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
4f80: 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a  rn db->nChange;.
4f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4fa0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
4fb0: 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  anges since the 
4fc0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
4fd0: 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69  was opened..*/.i
4fe0: 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c  nt sqlite3_total
4ff0: 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  _changes(sqlite3
5000: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
5010: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
5020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
5030: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
5040: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
5050: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
5060: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
5070: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
5080: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
5090: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
50a0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
50b0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
50c0: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
50d0: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
50e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
50f0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
5100: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
5110: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
5120: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
5130: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
5140: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
5150: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
5160: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
5170: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5180: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
5190: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
51a0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
51b0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
51c0: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
51d0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
51e0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
51f0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
5200: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
5210: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
5220: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
5230: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
5240: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
5250: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
5260: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
5270: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
5280: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
5290: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
52a0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
52b0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
52c0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
52d0: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
52e0: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
52f0: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
5300: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
5310: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
5320: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
5330: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
5340: 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63  or = p->pDestruc
5350: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
5360: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
5370: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
5380: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
5390: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
53a0: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
53b0: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
53c0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
53d0: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
53e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
53f0: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
5400: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
5410: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
5420: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
5430: 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  se.*/.int sqlite
5440: 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  3_close(sqlite3 
5450: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
5460: 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   *i;            
5470: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
5480: 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a  table iterator *
5490: 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66  /.  int j;..  if
54a0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
54b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
54c0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
54d0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
54e0: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
54f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
5500: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
5510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
5520: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
5530: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 65  ..  /* Force xDe
5540: 73 74 72 6f 79 20 63 61 6c 6c 73 20 6f 6e 20 61  stroy calls on a
5550: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
5560: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 65  s */.  sqlite3Re
5570: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
5580: 61 28 64 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a  a(db, -1);..  /*
5590: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
55a0: 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 52  n is open, the R
55b0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
55c0: 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a  ma() call above.
55d0: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61    ** will not ha
55e0: 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44  ve called the xD
55f0: 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68  isconnect() meth
5600: 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61  od on any virtua
5610: 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e  l.  ** tables in
5620: 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73   the db->aVTrans
5630: 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f  [] array. The fo
5640: 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56  llowing sqlite3V
5650: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20  tabRollback().  
5660: 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20  ** call will do 
5670: 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64  so. We need to d
5680: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68  o this before th
5690: 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69  e check for acti
56a0: 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ve.  ** SQL stat
56b0: 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73  ements below, as
56c0: 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70   the v-table imp
56d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
56e0: 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20  be storing.  ** 
56f0: 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74  some prepared st
5700: 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61  atements interna
5710: 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  lly..  */.  sqli
5720: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
5730: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
5740: 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73  ere are any outs
5750: 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72 65 74  tanding VMs, ret
5760: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
5770: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   */.  if( db->pV
5780: 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dbe ){.    sqlit
5790: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
57a0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
57b0: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f    "unable to clo
57c0: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
57d0: 6c 69 73 65 64 20 73 74 61 74 65 6d 65 6e 74 73  lised statements
57e0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
57f0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
5800: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
5810: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5820: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
5830: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
5840: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 3b 0a  SickOrOk(db) );.
5850: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
5860: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
5870: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
5880: 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20  ->aDb[j].pBt;.  
5890: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
58a0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63  ite3BtreeIsInBac
58b0: 6b 75 70 28 70 42 74 29 20 29 7b 0a 20 20 20 20  kup(pBt) ){.    
58c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
58d0: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
58e0: 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 62  .          "unab
58f0: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
5900: 74 6f 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  to unfinished ba
5910: 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 22 29  ckup operation")
5920: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5930: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
5940: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 72 65  mutex);.      re
5950: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
5960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
5970: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
5980: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
5990: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
59a0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
59b0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
59c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
59d0: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73  nDb; j++){.    s
59e0: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
59f0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20  &db->aDb[j];.   
5a00: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b   if( pDb->pBt ){
5a10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
5a20: 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42  reeClose(pDb->pB
5a30: 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  t);.      pDb->p
5a40: 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  Bt = 0;.      if
5a50: 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( j!=1 ){.      
5a60: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d    pDb->pSchema =
5a70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5a80: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
5a90: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
5aa0: 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f  ma(db, -1);..  /
5ab0: 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20  * Tell the code 
5ac0: 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74  in notify.c that
5ad0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
5ae0: 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20  no longer holds 
5af0: 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61  any.  ** locks a
5b00: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  nd does not requ
5b10: 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20  ire any further 
5b20: 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
5b30: 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
5b40: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
5b50: 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20  nClosed(db);..  
5b60: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
5b70: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
5b80: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
5b90: 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72 28  Static );.  for(
5ba0: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
5bb0: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
5bc0: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
5bd0: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
5be0: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
5bf0: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
5c00: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
5c10: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
5c20: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
5c30: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
5c40: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
5c50: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
5c60: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
5c70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
5c80: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
5c90: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
5ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5cb0: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
5cc0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
5cd0: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
5ce0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
5cf0: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
5d00: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
5d10: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
5d20: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
5d30: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
5d40: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
5d50: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
5d60: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
5d70: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
5d80: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
5d90: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
5da0: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
5db0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
5dc0: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
5dd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5de0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5df0: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
5e00: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
5e10: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
5e20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
5e30: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
5e40: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
5e50: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
5e60: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
5e70: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
5e80: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
5e90: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
5ea0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
5eb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
5ec0: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
5ed0: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
5ee0: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
5ef0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5f00: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
5f10: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
5f20: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
5f30: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
5f40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
5f50: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
5f60: 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73  ; /* Deallocates
5f70: 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f   any cached erro
5f80: 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20  r strings. */.  
5f90: 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a  if( db->pErr ){.
5fa0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
5fb0: 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a  Free(db->pErr);.
5fc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f    }.  sqlite3Clo
5fd0: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
5fe0: 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
5ff0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
6000: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
6010: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
6020: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
6030: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
6040: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
6050: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
6060: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
6070: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
6080: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
6090: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
60a0: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
60b0: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
60c0: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
60d0: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
60e0: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
60f0: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
6100: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
6110: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
6120: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
6130: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
6140: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
6150: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
6160: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
6170: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6180: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6190: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
61a0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
61b0: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
61c0: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
61d0: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
61e0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
61f0: 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69  ut==0 );  /* Fai
6200: 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64  ls on a lookasid
6210: 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f  e memory leak */
6220: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6230: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6240: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6250: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6260: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6270: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
6280: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6290: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
62a0: 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61  ollback all data
62b0: 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76  base files..*/.v
62c0: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
62d0: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
62e0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
62f0: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
6300: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6310: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
6320: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
6330: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
6340: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28  Malloc();.  for(
6350: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
6360: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
6370: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a  ->aDb[i].pBt ){.
6380: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6390: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
63a0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
63b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
63c0: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
63d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
63e0: 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61  eeRollback(db->a
63f0: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
6400: 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54    db->aDb[i].inT
6410: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  rans = 0;.    }.
6420: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
6430: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20  bRollback(db);. 
6440: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
6450: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66  nMalloc();..  if
6460: 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ( db->flags&SQLI
6470: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
6480: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
6490: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
64a0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
64b0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
64c0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
64d0: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  -1);.  }..  /* A
64e0: 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  ny deferred cons
64f0: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
6500: 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  s have now been 
6510: 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64  resolved. */.  d
6520: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
6530: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f   = 0;..  /* If o
6540: 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ne has been conf
6550: 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74  igured, invoke t
6560: 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b  he rollback-hook
6570: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
6580: 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  f( db->xRollback
6590: 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54  Callback && (inT
65a0: 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74  rans || !db->aut
65b0: 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20  oCommit) ){.    
65c0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
65d0: 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62  lback(db->pRollb
65e0: 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  ackArg);.  }.}..
65f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
6600: 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61  tatic string tha
6610: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
6620: 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
6630: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
6640: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63  * argument..*/.c
6650: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
6660: 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29  e3ErrStr(int rc)
6670: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
6680: 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73   char* const aMs
6690: 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53  g[] = {.    /* S
66a0: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20  QLITE_OK        
66b0: 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72    */ "not an err
66c0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
66d0: 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a  TE_ERROR       *
66e0: 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72  / "SQL logic err
66f0: 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61  or or missing da
6700: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
6710: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20  SQLITE_INTERNAL 
6720: 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20     */ 0,.    /* 
6730: 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20  SQLITE_PERM     
6740: 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65     */ "access pe
6750: 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22  rmission denied"
6760: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6770: 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22  ABORT       */ "
6780: 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74  callback request
6790: 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c  ed query abort",
67a0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42  .    /* SQLITE_B
67b0: 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64  USY        */ "d
67c0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
67d0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
67e0: 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f  E_LOCKED      */
67f0: 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65   "database table
6800: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
6810: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   /* SQLITE_NOMEM
6820: 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f         */ "out o
6830: 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f  f memory",.    /
6840: 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  * SQLITE_READONL
6850: 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74  Y    */ "attempt
6860: 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64   to write a read
6870: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a  only database",.
6880: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
6890: 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e  TERRUPT   */ "in
68a0: 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20  terrupted",.    
68b0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  /* SQLITE_IOERR 
68c0: 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49        */ "disk I
68d0: 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  /O error",.    /
68e0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
68f0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
6900: 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20  e disk image is 
6910: 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20  malformed",.    
6920: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  /* SQLITE_NOTFOU
6930: 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77  ND    */ "unknow
6940: 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20  n operation",.  
6950: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c    /* SQLITE_FULL
6960: 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61          */ "data
6970: 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20  base or disk is 
6980: 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  full",.    /* SQ
6990: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20  LITE_CANTOPEN   
69a0: 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f   */ "unable to o
69b0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
69c0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
69d0: 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f  E_PROTOCOL    */
69e0: 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63   "locking protoc
69f0: 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ol",.    /* SQLI
6a00: 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a  TE_EMPTY       *
6a10: 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  / "table contain
6a20: 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20  s no data",.    
6a30: 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  /* SQLITE_SCHEMA
6a40: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
6a50: 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
6a60: 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  anged",.    /* S
6a70: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20  QLITE_TOOBIG    
6a80: 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20    */ "string or 
6a90: 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20  blob too big",. 
6aa0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     /* SQLITE_CON
6ab0: 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e  STRAINT  */ "con
6ac0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c  straint failed",
6ad0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
6ae0: 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64  ISMATCH    */ "d
6af0: 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
6b00: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6b10: 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20  _MISUSE      */ 
6b20: 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65  "library routine
6b30: 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73   called out of s
6b40: 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a  equence",.    /*
6b50: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20   SQLITE_NOLFS   
6b60: 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69      */ "large fi
6b70: 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69  le support is di
6b80: 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  sabled",.    /* 
6b90: 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20  SQLITE_AUTH     
6ba0: 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61     */ "authoriza
6bb0: 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  tion denied",.  
6bc0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d    /* SQLITE_FORM
6bd0: 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69  AT      */ "auxi
6be0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
6bf0: 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20  ormat error",.  
6c00: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47    /* SQLITE_RANG
6c10: 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64  E       */ "bind
6c20: 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78   or column index
6c30: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a   out of range",.
6c40: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
6c50: 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69  TADB      */ "fi
6c60: 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20  le is encrypted 
6c70: 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61  or is not a data
6c80: 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 72 63  base",.  };.  rc
6c90: 20 26 3d 20 30 78 66 66 3b 0a 20 20 69 66 28 20   &= 0xff;.  if( 
6ca0: 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26  ALWAYS(rc>=0) &&
6cb0: 20 72 63 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66   rc<(int)(sizeof
6cc0: 28 61 4d 73 67 29 2f 73 69 7a 65 6f 66 28 61 4d  (aMsg)/sizeof(aM
6cd0: 73 67 5b 30 5d 29 29 20 26 26 20 61 4d 73 67 5b  sg[0])) && aMsg[
6ce0: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  rc]!=0 ){.    re
6cf0: 74 75 72 6e 20 61 4d 73 67 5b 72 63 5d 3b 0a 20  turn aMsg[rc];. 
6d00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6d10: 72 6e 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f  rn "unknown erro
6d20: 72 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r";.  }.}../*.**
6d30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
6d40: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
6d50: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
6d60: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
6d70: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
6d80: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
6d90: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
6da0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
6db0: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
6dc0: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
6dd0: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
6de0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
6df0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
6e00: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
6e10: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
6e20: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
6e40: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6e50: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
6e80: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
6e90: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
6ea0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
6eb0: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
6ec0: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
6ed0: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
6ee0: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
6ef0: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
6f00: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
6f10: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
6f20: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
6f30: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
6f40: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
6f50: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
6f60: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
6f70: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
6f80: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
6f90: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
6fa0: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
6fb0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
6fc0: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
6fd0: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
6fe0: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
6ff0: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
7000: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
7010: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
7020: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
7030: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
7040: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
7050: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
7060: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
7070: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
7080: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
7090: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
70a0: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
70b0: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
70c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
70d0: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
70e0: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
70f0: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
7100: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
7110: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
7120: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
7130: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
7140: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
7150: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
7160: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
7170: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
7180: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
7190: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
71a0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
71b0: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
71c0: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
71d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
71e0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
71f0: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
7200: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
7210: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
7220: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
7230: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
7240: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7250: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
7260: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
7270: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
7280: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
7290: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
72a0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
72b0: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
72c0: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
72d0: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
72e0: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
72f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
7300: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
7310: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
7320: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
7330: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
7340: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
7350: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
7360: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
7370: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
7380: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
7390: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
73a0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
73b0: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
73c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
73d0: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
73e0: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
73f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7400: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
7410: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
7420: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
7430: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
7440: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
7450: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
7460: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
7470: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
7480: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
7490: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
74a0: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
74b0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
74c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
74d0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
74e0: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
74f0: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
7500: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
7510: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
7520: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
7530: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
7540: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7550: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7560: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7570: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
7580: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
7590: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
75a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
75b0: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
75c0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
75d0: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
75e0: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
75f0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
7600: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
7610: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
7620: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
7630: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
7640: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
7650: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
7660: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
7670: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
7680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
7690: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
76a0: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
76b0: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
76c0: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
76d0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
76e0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
76f0: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
7700: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
7710: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
7720: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f  ProgressOps = nO
7730: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
7740: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
7750: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
7760: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
7770: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
7780: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
7790: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
77a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
77b0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
77c0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
77d0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
77e0: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
77f0: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
7800: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
7810: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
7820: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
7830: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
7840: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
7850: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
7860: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
7870: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
7880: 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30   ms){.  if( ms>0
7890: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79   ){.    db->busy
78a0: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
78b0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
78c0: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
78d0: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
78e0: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
78f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
7900: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
7910: 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ler(db, 0, 0);. 
7920: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7930: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7940: 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e  Cause any pendin
7950: 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73  g operation to s
7960: 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69  top at its earli
7970: 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  est opportunity.
7980: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7990: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
79a0: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75  e3 *db){.  db->u
79b0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
79c0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
79d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
79e0: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
79f0: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
7a00: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
7a10: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
7a20: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
7a30: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
7a40: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
7a50: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
7a60: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
7a70: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
7a80: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
7a90: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
7aa0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
7ab0: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
7ac0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
7ad0: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
7ae0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
7af0: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
7b00: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
7b10: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
7b20: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
7b30: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
7b40: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
7b50: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
7b60: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
7b70: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
7b80: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
7b90: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7ba0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
7bb0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
7bc0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
7bd0: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46  3_context*),.  F
7be0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
7bf0: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
7c00: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
7c10: 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65  t nName;..  asse
7c20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7c30: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
7c40: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
7c50: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
7c60: 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28       (xFunc && (
7c70: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
7c80: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46  ) || .      (!xF
7c90: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
7ca0: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
7cb0: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
7cc0: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
7cd0: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
7ce0: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
7cf0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
7d00: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
7d10: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
7d20: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46  ite3Strlen30( zF
7d30: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
7d40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7d50: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
7d60: 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20  .  }.  .#ifndef 
7d70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
7d80: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
7d90: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
7da0: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
7db0: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
7dc0: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
7dd0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
7de0: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
7df0: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
7e00: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
7e10: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
7e20: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
7e30: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
7e40: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
7e50: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
7e60: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
7e70: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
7e80: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
7e90: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
7ea0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
7eb0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
7ec0: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
7ed0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
7ee0: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
7ef0: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
7f00: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
7f10: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7f20: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
7f30: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
7f40: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
7f50: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
7f60: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
7f70: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
7f80: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  tructor);.    if
7f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7fa0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
7fb0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
7fc0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
7fd0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
7fe0: 55 54 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20  UTF16LE,.       
7ff0: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
8000: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
8010: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
8020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8030: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8040: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
8050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
8060: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
8070: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
8080: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
8090: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
80a0: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
80b0: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
80c0: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
80d0: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
80e0: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
80f0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
8100: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
8110: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
8120: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
8130: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
8140: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
8150: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
8160: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
8170: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
8180: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
8190: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
81a0: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
81b0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
81c0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
81d0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
81e0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
81f0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
8200: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
8210: 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63  p->iPrefEnc==enc
8220: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
8230: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
8240: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
8250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8260: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
8270: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
8280: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
8290: 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e  /modify user-fun
82a0: 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74  ction due to act
82b0: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
82c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
82d0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
82e0: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
82f0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
8300: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8310: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
8320: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
8330: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
8340: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
8350: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
8360: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61  unctionName, nNa
8370: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
8380: 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  c, 1);.  assert(
8390: 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  p || db->mallocF
83a0: 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70  ailed);.  if( !p
83b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
83c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
83d0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64  ..  /* If an old
83e0: 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  er version of th
83f0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  e function with 
8400: 61 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73  a configured des
8410: 74 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20  tructor is.  ** 
8420: 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69  being replaced i
8430: 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
8440: 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65  ctor function he
8450: 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f  re. */.  functio
8460: 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b  nDestroy(db, p);
8470: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ..  if( pDestruc
8480: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
8490: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  ructor->nRef++;.
84a0: 20 20 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75    }.  p->pDestru
84b0: 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74  ctor = pDestruct
84c0: 6f 72 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d  or;.  p->flags =
84d0: 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d   0;.  p->xFunc =
84e0: 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74   xFunc;.  p->xSt
84f0: 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d  ep = xStep;.  p-
8500: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
8510: 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  nal;.  p->pUserD
8520: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
8530: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31  .  p->nArg = (u1
8540: 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  6)nArg;.  return
8550: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8560: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
8570: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
8580: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
8590: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
85a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
85b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
85c0: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
85d0: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
85e0: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
85f0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
8600: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
8610: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
8620: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
8630: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8640: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8650: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
8660: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
8670: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
8680: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
8690: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
86a0: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
86b0: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
86c0: 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20  xStep,.         
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61             xFina
86f0: 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  l, 0);.}..int sq
8700: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8710: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ction_v2(.  sqli
8720: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
8730: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
8740: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
8750: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
8760: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
8770: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
8780: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
8790: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
87a0: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
87b0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
87c0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
87d0: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
87e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
87f0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
8800: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
8810: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
8820: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
8830: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
8840: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
8850: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
8860: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78  >mutex);.  if( x
8870: 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70  Destroy ){.    p
8880: 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72  Arg = (FuncDestr
8890: 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44  uctor *)sqlite3D
88a0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
88b0: 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72  sizeof(FuncDestr
88c0: 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28  uctor));.    if(
88d0: 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20   !pArg ){.      
88e0: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
88f0: 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20     goto out;.   
8900: 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65   }.    pArg->xDe
8910: 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79  stroy = xDestroy
8920: 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65  ;.    pArg->pUse
8930: 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20  rData = p;.  }. 
8940: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
8950: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
8960: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
8970: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
8980: 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20  Final, pArg);.  
8990: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
89a0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
89b0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
89c0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
89d0: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
89e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
89f0: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75   pArg);.  }.. ou
8a00: 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
8a10: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
8a20: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8a30: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8a40: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
8a50: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
8a60: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
8a70: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
8a80: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
8a90: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
8aa0: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
8ab0: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
8ac0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
8ad0: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
8ae0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
8af0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
8b00: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
8b10: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
8b20: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
8b30: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8b40: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
8b50: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
8b60: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
8b70: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
8b80: 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20  char *zFunc8;.  
8b90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
8ba0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
8bb0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
8bc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
8bd0: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
8be0: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
8bf0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
8c00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
8c10: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
8c20: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
8c30: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
8c40: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46   eTextRep, p, xF
8c50: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
8c60: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
8c70: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
8c80: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
8c90: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
8ca0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
8cb0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8cc0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
8cd0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
8ce0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
8cf0: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
8d00: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
8d10: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
8d20: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
8d30: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
8d40: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
8d50: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
8d60: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
8d70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
8d80: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
8d90: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
8da0: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
8db0: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
8dc0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
8dd0: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
8de0: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
8df0: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
8e00: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
8e10: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
8e20: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
8e30: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
8e40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
8e50: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
8e60: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
8e70: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
8e80: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
8e90: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
8ea0: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
8eb0: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
8ec0: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
8ed0: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
8ee0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
8ef0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
8f00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
8f10: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
8f20: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
8f30: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
8f40: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
8f50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8f60: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8f70: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46  if( sqlite3FindF
8f80: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
8f90: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
8fa0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d  SQLITE_UTF8, 0)=
8fb0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8fc0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
8fd0: 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
8fe0: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  0, sqlite3Invali
9010: 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  dFunction, 0, 0,
9020: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   0);.  }.  rc = 
9030: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
9040: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
9050: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9060: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
9070: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9080: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9090: 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
90a0: 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63   Register a trac
90b0: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
90c0: 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
90d0: 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
90e0: 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73  ered trace.** is
90f0: 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
9100: 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20  ** A NULL trace 
9110: 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
9120: 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69  hat no tracing i
9130: 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
9140: 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65  on-NULL.** trace
9150: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
9160: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
9170: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
9180: 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
9190: 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  .** SQL statemen
91a0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  t..*/.void *sqli
91b0: 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65  te3_trace(sqlite
91c0: 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54  3 *db, void (*xT
91d0: 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  race)(void*,cons
91e0: 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a  t char*), void *
91f0: 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  pArg){.  void *p
9200: 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Old;.  sqlite3_m
9210: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9220: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
9230: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20  db->pTraceArg;. 
9240: 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54   db->xTrace = xT
9250: 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61  race;.  db->pTra
9260: 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ceArg = pArg;.  
9270: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9280: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9290: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
92a0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
92b0: 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  a profile functi
92c0: 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72  on.  The pArg fr
92d0: 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  om the previousl
92e0: 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a  y registered .**
92f0: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
9300: 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  n is returned.  
9310: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72  .**.** A NULL pr
9320: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d  ofile function m
9330: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f  eans that no pro
9340: 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74  filing is execut
9350: 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a  es.  A non-NULL.
9360: 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20  ** profile is a 
9370: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
9380: 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e  ction that is in
9390: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
93a0: 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61  clusion of.** ea
93b0: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
93c0: 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f   that is run..*/
93d0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70  .void *sqlite3_p
93e0: 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  rofile(.  sqlite
93f0: 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a  3 *db,.  void (*
9400: 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c  xProfile)(void*,
9410: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
9420: 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f  te_uint64),.  vo
9430: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f  id *pArg.){.  vo
9440: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
9450: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
9460: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
9470: 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c  ld = db->pProfil
9480: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f  eArg;.  db->xPro
9490: 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b  file = xProfile;
94a0: 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41  .  db->pProfileA
94b0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
94c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
94d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
94e0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65  eturn pOld;.}.#e
94f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
9500: 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  MIT_TRACE */../*
9510: 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20  ** EXPERIMENTAL 
9520: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74  ***.**.** Regist
9530: 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f  er a function to
9540: 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e   be invoked when
9550: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
9560: 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 74  omments..** If t
9570: 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74  he invoked funct
9580: 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ion returns non-
9590: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63  zero, then the c
95a0: 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a  ommit becomes a.
95b0: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  ** rollback..*/.
95c0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f  void *sqlite3_co
95d0: 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  mmit_hook(.  sql
95e0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
95f0: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
9600: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
9610: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
9620: 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  int (*xCallback)
9630: 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e  (void*),  /* Fun
9640: 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20  ction to invoke 
9650: 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a  on each commit *
9660: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9680: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
9690: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
96a0: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
96b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
96c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
96d0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f    pOld = db->pCo
96e0: 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78  mmitArg;.  db->x
96f0: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d  CommitCallback =
9700: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
9710: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70  ->pCommitArg = p
9720: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
9730: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9740: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9750: 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pOld;.}../*.** R
9760: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
9770: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
9780: 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
9790: 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
97a0: 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
97b0: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
97c0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
97d0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
97e0: 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
97f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9810: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
9820: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
9830: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
9840: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
9850: 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c  nt,char const *,
9860: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c  char const *,sql
9870: 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  ite_int64),.  vo
9880: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
9890: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
98a0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
98b0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
98c0: 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
98d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
98e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
98f0: 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72   = db->pUpdateAr
9900: 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65  g;.  db->xUpdate
9910: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
9920: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64  back;.  db->pUpd
9930: 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
9940: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9950: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
9960: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
9970: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
9980: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
9990: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
99a0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
99b0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20  on is rolled.** 
99c0: 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74  back by this dat
99d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
99e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
99f0: 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
9a00: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a20: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
9a30: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
9a40: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
9a50: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
9a60: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
9a70: 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
9a80: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
9a90: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
9aa0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
9ab0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
9ac0: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
9ad0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9ae0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
9af0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
9b00: 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  ;.  db->xRollbac
9b10: 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  kCallback = xCal
9b20: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f  lback;.  db->pRo
9b30: 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67  llbackArg = pArg
9b40: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9b50: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9b60: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
9b70: 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  t;.}..#ifndef SQ
9b80: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
9b90: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
9ba0: 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
9bb0: 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
9bc0: 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  y sqlite3_wal_au
9bd0: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a  tocheckpoint()..
9be0: 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ** Invoke sqlite
9bf0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
9c00: 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
9c10: 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  f frames in the 
9c20: 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67  log file.** is g
9c30: 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69  reater than sqli
9c40: 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74  te3.pWalArg cast
9c50: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28   to an integer (
9c60: 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
9c70: 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61  ured by.** wal_a
9c80: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29  utocheckpoint())
9c90: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
9ca0: 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28  3WalDefaultHook(
9cb0: 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  .  void *pClient
9cc0: 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67  Data,     /* Arg
9cd0: 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ument */.  sqlit
9ce0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9cf0: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
9d00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9d10: 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44  *zDb,       /* D
9d20: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
9d30: 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20   nFrame         
9d40: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57      /* Size of W
9d50: 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e  AL */.){.  if( n
9d60: 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54  Frame>=SQLITE_PT
9d70: 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74  R_TO_INT(pClient
9d80: 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c  Data) ){.    sql
9d90: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
9da0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
9db0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
9dc0: 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
9dd0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
9de0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
9df0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9e00: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
9e10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
9e20: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  */../*.** Config
9e30: 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77  ure an sqlite3_w
9e40: 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
9e50: 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ck to automatica
9e60: 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  lly checkpoint.*
9e70: 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74  * a database aft
9e80: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
9e90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
9ea0: 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20  here are nFrame 
9eb0: 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65  or.** more frame
9ec0: 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
9ed0: 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20  e. Passing zero 
9ee0: 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  or a negative va
9ef0: 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46  lue as the.** nF
9f00: 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64  rame parameter d
9f10: 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69  isables automati
9f20: 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e  c checkpoints en
9f30: 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  tirely..**.** Th
9f40: 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  e callback regis
9f50: 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
9f60: 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20  nction replaces 
9f70: 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c  any existing cal
9f80: 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65  lback.** registe
9f90: 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  red using sqlite
9fa0: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69  3_wal_hook(). Li
9fb0: 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72  kewise, register
9fc0: 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a  ing a callback.*
9fd0: 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  * using sqlite3_
9fe0: 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62  wal_hook() disab
9ff0: 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  les the automati
a000: 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63  c checkpoint mec
a010: 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67  hanism.** config
a020: 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ured by this fun
a030: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
a040: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
a050: 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
a060: 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65   *db, int nFrame
a070: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
a080: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53  _OMIT_WAL.  UNUS
a090: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
a0a0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
a0b0: 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65  ETER(nFrame);.#e
a0c0: 6c 73 65 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  lse.  if( nFrame
a0d0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
a0e0: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73  3_wal_hook(db, s
a0f0: 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
a100: 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54  Hook, SQLITE_INT
a110: 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29  _TO_PTR(nFrame))
a120: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
a130: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
a140: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23  db, 0, 0);.  }.#
a150: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
a160: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a170: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
a180: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
a190: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
a1a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
a1b0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
a1c0: 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d  the write-ahead-
a1d0: 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61  log by this data
a1e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
a1f0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
a200: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71  3_wal_hook(.  sq
a210: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a230: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
a240: 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64   to this db hand
a250: 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61  le */.  int(*xCa
a260: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20  llback)(void *, 
a270: 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20  sqlite3*, const 
a280: 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76  char*, int),.  v
a290: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
a2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a2b0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
a2c0: 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c   passed to xCall
a2d0: 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66  back() */.){.#if
a2e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a2f0: 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65  _WAL.  void *pRe
a300: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
a310: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
a320: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
a330: 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d  ->pWalArg;.  db-
a340: 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20  >xWalCallback = 
a350: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
a360: 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b  >pWalArg = pArg;
a370: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a380: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
a3a0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
a3b0: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
a3c0: 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
a3d0: 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a  atabase zDb..*/.
a3e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
a3f0: 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20  checkpoint_v2(. 
a400: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
a430: 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
a440: 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
a450: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
a460: 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
a470: 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20  abase (or NULL) 
a480: 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20  */.  int eMode, 
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43       /* SQLITE_C
a4b0: 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75  HECKPOINT_* valu
a4c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f  e */.  int *pnLo
a4d0: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
a4e0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
a4f0: 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69  ize of WAL log i
a500: 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  n frames */.  in
a510: 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20  t *pnCkpt       
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a530: 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62   OUT: Total numb
a540: 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65  er of frames che
a550: 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a  ckpointed */.){.
a560: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
a570: 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20  IT_WAL.  return 
a580: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
a590: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
a5c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  e */.  int iDb =
a5d0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
a5e0: 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65  CHED;  /* sqlite
a5f0: 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66  3.aDb[] index of
a600: 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e   db to checkpoin
a610: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  t */..  /* Initi
a620: 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
a630: 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31   variables to -1
a640: 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
a650: 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69  r occurs. */.  i
a660: 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f  f( pnLog ) *pnLo
a670: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e  g = -1;.  if( pn
a680: 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d  Ckpt ) *pnCkpt =
a690: 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   -1;..  assert( 
a6a0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
a6b0: 54 5f 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48  T_FULL>SQLITE_CH
a6c0: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
a6d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
a6e0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
a6f0: 46 55 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43  FULL<SQLITE_CHEC
a700: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29  KPOINT_RESTART )
a710: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
a720: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
a730: 53 53 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f  SSIVE+2==SQLITE_
a740: 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41  CHECKPOINT_RESTA
a750: 52 54 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  RT );.  if( eMod
a760: 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e<SQLITE_CHECKPO
a770: 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65  INT_PASSIVE || e
a780: 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43  Mode>SQLITE_CHEC
a790: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29  KPOINT_RESTART )
a7a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a7b0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
a7c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a7d0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
a7e0: 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20  );.  if( zDb && 
a7f0: 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44  zDb[0] ){.    iD
a800: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
a810: 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
a820: 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20    }.  if( iDb<0 
a830: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
a840: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
a850: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
a860: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e  QLITE_ERROR, "un
a870: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20  known database: 
a880: 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c  %s", zDb);.  }el
a890: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
a8a0: 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64  ite3Checkpoint(d
a8b0: 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70  b, iDb, eMode, p
a8c0: 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
a8d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
a8e0: 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a  db, rc, 0);.  }.
a8f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
a900: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
a910: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
a920: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
a930: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
a940: 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.}.../*.** C
a950: 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
a960: 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69  se zDb. If zDb i
a970: 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68  s NULL, or if th
a980: 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69  e buffer zDb poi
a990: 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69  nts.** to contai
a9a0: 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ns a zero-length
a9b0: 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74   string, all att
a9c0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
a9d0: 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69  are .** checkpoi
a9e0: 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
a9f0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
aa00: 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
aa10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
aa20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
aa30: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
aa40: 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 53  nt_v2(db, zDb, S
aa50: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
aa60: 5f 50 41 53 53 49 56 45 2c 20 30 2c 20 30 29 3b  _PASSIVE, 0, 0);
aa70: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
aa80: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
aa90: 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69  * Run a checkpoi
aaa0: 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69  nt on database i
aab0: 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  Db. This is a no
aac0: 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20  -op if database 
aad0: 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75  iDb is.** not cu
aae0: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20  rrently open in 
aaf0: 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  WAL mode..**.** 
ab00: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
ab10: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   is open on the 
ab20: 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63  database being c
ab30: 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69  heckpointed, thi
ab40: 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
ab50: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f  eturns SQLITE_LO
ab60: 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b  CKED and a check
ab70: 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74  point is not att
ab80: 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61  empted. If .** a
ab90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
aba0: 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65  hile running the
abb0: 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20   checkpoint, an 
abc0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
abd0: 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
abe0: 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49  d (i.e. SQLITE_I
abf0: 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65  OERR). Otherwise
ac00: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
ac10: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20  ** The mutex on 
ac20: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
ac30: 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  db should be hel
ac40: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
ac50: 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73   The mutex.** as
ac60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
ac70: 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65  e specific b-tre
ac80: 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
ac90: 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79  nted is taken by
aca0: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
acb0: 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63  n while the chec
acc0: 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e  kpoint is runnin
acd0: 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20  g..**.** If iDb 
ace0: 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45  is passed SQLITE
acf0: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74  _MAX_ATTACHED, t
ad00: 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64  hen all attached
ad10: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a   databases are.*
ad20: 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20  * checkpointed. 
ad30: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
ad40: 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
ad50: 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
ad60: 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74  ately -.** no at
ad70: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
ad80: 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20   checkpoint any 
ad90: 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61  remaining databa
ada0: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ses..**.** Param
adb0: 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e  eter eMode is on
adc0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43  e of SQLITE_CHEC
add0: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
ade0: 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e  FULL or RESTART.
adf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
ae00: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
ae10: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
ae20: 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a  int eMode, int *
ae30: 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b  pnLog, int *pnCk
ae40: 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pt){.  int rc = 
ae50: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
ae60: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
ae70: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
ae80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ae90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
aea0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
aeb0: 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64  rough attached d
aec0: 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73  bs */.  int bBus
aed0: 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
aee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
aef0: 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68  if SQLITE_BUSY h
af00: 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  as been encounte
af10: 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  red */..  assert
af20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
af30: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
af40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
af50: 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d  Log || *pnLog==-
af60: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
af70: 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70  pnCkpt || *pnCkp
af80: 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28  t==-1 );..  for(
af90: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26  i=0; i<db->nDb &
afa0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
afb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
afc0: 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51  ==iDb || iDb==SQ
afd0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
afe0: 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
aff0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63  sqlite3BtreeChec
b000: 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69  kpoint(db->aDb[i
b010: 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e  ].pBt, eMode, pn
b020: 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
b030: 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20      pnLog = 0;. 
b040: 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b       pnCkpt = 0;
b050: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b060: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
b070: 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b        bBusy = 1;
b080: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
b090: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
b0a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
b0b0: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
b0c0: 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20  _OK && bBusy) ? 
b0d0: 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
b0e0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b0f0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
b100: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b110: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
b120: 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72  ue if main-memor
b130: 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
b140: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61   instead of.** a
b150: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
b160: 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61  for transient pa
b170: 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74  ger files and st
b180: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
b190: 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
b1a0: 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20  eturned depends 
b1b0: 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
b1c0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28  db->temp_store (
b1d0: 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d  runtime.** param
b1e0: 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f  eter) and the co
b1f0: 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
b200: 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   of SQLITE_TEMP_
b210: 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f  STORE. The.** fo
b220: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
b230: 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61  scribes the rela
b240: 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
b250: 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65   these two value
b260: 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75  s.** and this fu
b270: 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76  nctions return v
b280: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51  alue..**.**   SQ
b290: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
b2a0: 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
b2b0: 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
b2c0: 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
b2d0: 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
b2f0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
b300: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
b310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b320: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
b340: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
b350: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
b360: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
b390: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
b3a0: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
b3d0: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
b3e0: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
b3f0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
b400: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
b410: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
b420: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
b430: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
b440: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
b460: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
b470: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
b4b0: 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 1).**   2     
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4d0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
b4e0: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
b4f0: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20  turn 1).**   3  
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
b520: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
b530: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e  (return 1).*/.in
b540: 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  t sqlite3TempInM
b550: 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69  emory(const sqli
b560: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51  te3 *db){.#if SQ
b570: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
b580: 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =1.  return ( db
b590: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
b5a0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
b5b0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
b5c0: 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =2.  return ( db
b5d0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
b5e0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
b5f0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
b600: 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  =3.  return 1;.#
b610: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
b620: 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c  _TEMP_STORE<1 ||
b630: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
b640: 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b  RE>3.  return 0;
b650: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
b660: 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e   Return UTF-8 en
b670: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
b680: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
b690: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
b6a0: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
b6b0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
b6c0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71  qlite3_errmsg(sq
b6d0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
b6e0: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
b6f0: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
b700: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
b710: 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
b720: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
b730: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
b740: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
b750: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
b760: 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d  3ErrStr(SQLITE_M
b770: 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d  ISUSE_BKPT);.  }
b780: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b790: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
b7a0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
b7b0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b7c0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
b7d0: 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
b7e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
b7f0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
b800: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d  3_value_text(db-
b810: 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65  >pErr);.    asse
b820: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
b830: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
b840: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   z==0 ){.      z
b850: 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
b860: 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20  (db->errCode);. 
b870: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
b880: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
b890: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
b8a0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
b8b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
b8c0: 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  F16./*.** Return
b8d0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
b8e0: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
b8f0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
b900: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
b910: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
b920: 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
b930: 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65  _errmsg16(sqlite
b940: 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
b950: 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66   const u16 outOf
b960: 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f  Mem[] = {.    'o
b970: 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
b980: 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c  , 'o', 'f', ' ',
b990: 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20   'm', 'e', 'm', 
b9a0: 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30  'o', 'r', 'y', 0
b9b0: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
b9c0: 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b  onst u16 misuse[
b9d0: 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27  ] = {.    'l', '
b9e0: 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61  i', 'b', 'r', 'a
b9f0: 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27  ', 'r', 'y', ' '
ba00: 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c  , .    'r', 'o',
ba10: 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20   'u', 't', 'i', 
ba20: 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a  'n', 'e', ' ', .
ba30: 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c      'c', 'a', 'l
ba40: 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27  ', 'l', 'e', 'd'
ba50: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
ba60: 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
ba70: 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27  .    'o', 'f', '
ba80: 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65   ', .    's', 'e
ba90: 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27  ', 'q', 'u', 'e'
baa0: 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c  , 'n', 'c', 'e',
bab0: 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
bac0: 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
bad0: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
bae0: 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
baf0: 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
bb00: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
bb10: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
bb20: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
bb30: 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
bb40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bb50: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
bb60: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
bb70: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
bb80: 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
bb90: 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
bba0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
bbb0: 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
bbc0: 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
bbd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
bbe0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
bbf0: 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71  db->pErr, -1, sq
bc00: 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
bc10: 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20  errCode),.      
bc20: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
bc30: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
bc40: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
bc50: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
bc60: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
bc70: 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  }.    /* A mallo
bc80: 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69  c() may have fai
bc90: 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  led within the c
bca0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  all to sqlite3_v
bcb0: 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20  alue_text16().  
bcc0: 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
bcd0: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
bce0: 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
bcf0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
bd00: 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
bd10: 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
bd20: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20  e returning. Do 
bd30: 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69  this directly, i
bd40: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20  nstead of via.  
bd50: 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45    ** sqlite3ApiE
bd60: 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20  xit(), to avoid 
bd70: 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61  setting the data
bd80: 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f  base handle erro
bd90: 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a  r message..    *
bda0: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
bdb0: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  Failed = 0;.  }.
bdc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bdd0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
bde0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
bdf0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
be00: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
be10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
be20: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
be30: 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
be40: 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
be50: 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
be60: 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
be70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
be80: 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
be90: 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
bea0: 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
beb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bec0: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
bed0: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
bee0: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
bef0: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
bf00: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
bf10: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
bf20: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
bf30: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
bf40: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
bf50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
bf60: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
bf70: 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
bf80: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
bf90: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
bfa0: 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
bfb0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
bfc0: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
bfd0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
bfe0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
bff0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
c000: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
c010: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
c020: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
c030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
c040: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
c050: 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a   db->errCode;.}.
c060: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
c070: 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  new collating fu
c080: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62  nction for datab
c090: 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e  ase "db".  The n
c0a0: 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20  ame is zName.** 
c0b0: 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  and the encoding
c0c0: 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74   is enc..*/.stat
c0d0: 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c  ic int createCol
c0e0: 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
c0f0: 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3* db,.  const c
c100: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75  har *zName, .  u
c110: 38 20 65 6e 63 2c 0a 20 20 75 38 20 63 6f 6c 6c  8 enc,.  u8 coll
c120: 54 79 70 65 2c 0a 20 20 76 6f 69 64 2a 20 70 43  Type,.  void* pC
c130: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
c140: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
c150: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
c160: 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
c170: 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
c180: 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
c190: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
c1a0: 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  2;.  int nName =
c1b0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c1c0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73  (zName);.  .  as
c1d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c1e0: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
c1f0: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
c200: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
c210: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
c220: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
c230: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
c240: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
c250: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
c260: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
c270: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
c280: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
c290: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
c2a0: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
c2b0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
c2c0: 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a  /.  enc2 = enc;.
c2d0: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
c2e0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
c2f0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
c300: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
c310: 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66  _ALIGNED );.  if
c320: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
c330: 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51  TF16 || enc2==SQ
c340: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
c350: 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d  ED ){.    enc2 =
c360: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
c370: 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  IVE;.  }.  if( e
c380: 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20  nc2<SQLITE_UTF8 
c390: 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55  || enc2>SQLITE_U
c3a0: 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65  TF16BE ){.    re
c3b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
c3c0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
c3d0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
c3e0: 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
c3f0: 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
c400: 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
c410: 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
c420: 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
c430: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
c440: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
c450: 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
c460: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
c470: 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
c480: 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
c490: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
c4a0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
c4b0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
c4c0: 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
c4d0: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 0);.  if( pCo
c4e0: 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
c4f0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  p ){.    if( db-
c500: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
c510: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c520: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
c530: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
c540: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
c550: 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f  /modify collatio
c560: 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74  n sequence due t
c570: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
c580: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  nts");.      ret
c590: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
c5a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c5b0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
c5c0: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
c5d0: 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
c5e0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
c5f0: 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
c600: 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
c610: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
c620: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c630: 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
c640: 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
c650: 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
c660: 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
c670: 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
c680: 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
c690: 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
c6a0: 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
c6b0: 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
c6c0: 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
c6d0: 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
c6e0: 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
c6f0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
c700: 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
c710: 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
c720: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
c730: 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
c740: 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
c750: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
c760: 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
c770: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
c780: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
c790: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
c7a0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
c7b0: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
c7c0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
c7d0: 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
c7e0: 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
c7f0: 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
c800: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
c810: 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
c820: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c830: 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
c840: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
c850: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c860: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
c870: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
c880: 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
c890: 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
c8a0: 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
c8b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c8c0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43  pColl->xCmp = xC
c8d0: 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d  ompare;.  pColl-
c8e0: 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20  >pUser = pCtx;. 
c8f0: 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78   pColl->xDel = x
c900: 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e  Del;.  pColl->en
c910: 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20  c = (u8)(enc2 | 
c920: 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54  (enc & SQLITE_UT
c930: 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20  F16_ALIGNED));. 
c940: 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 63   pColl->type = c
c950: 6f 6c 6c 54 79 70 65 3b 0a 20 20 73 71 6c 69 74  ollType;.  sqlit
c960: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
c970: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74  TE_OK, 0);.  ret
c980: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c990: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72  .../*.** This ar
c9a0: 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64  ray defines hard
c9b0: 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e   upper bounds on
c9c0: 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20   limit values.  
c9d0: 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  The.** initializ
c9e0: 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20  er must be kept 
c9f0: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
ca00: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a   SQLITE_LIMIT_*.
ca10: 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73  ** #defines in s
ca20: 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61  qlite3.h..*/.sta
ca30: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48  tic const int aH
ca40: 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  ardLimit[] = {. 
ca50: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
ca60: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
ca70: 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _SQL_LENGTH,.  S
ca80: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
ca90: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ,.  SQLITE_MAX_E
caa0: 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  XPR_DEPTH,.  SQL
cab0: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
cac0: 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54  _SELECT,.  SQLIT
cad0: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20  E_MAX_VDBE_OP,. 
cae0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
caf0: 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49  TION_ARG,.  SQLI
cb00: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
cb10: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  .  SQLITE_MAX_LI
cb20: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
cb30: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
cb40: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
cb50: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  .  SQLITE_MAX_TR
cb60: 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a  IGGER_DEPTH,.};.
cb70: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
cb80: 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
cb90: 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
cba0: 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
cbb0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
cbc0: 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
cbd0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
cbe0: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
cbf0: 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
cc00: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
cc10: 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
cc20: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
cc30: 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
cc40: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
cc50: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
cc60: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
cc70: 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
cc80: 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
cc90: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
cca0: 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
ccb0: 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
ccc0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
ccd0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
cce0: 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
ccf0: 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
cd00: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
cd10: 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
cd20: 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
cd30: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
cd40: 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
cd50: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
cd60: 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
cd70: 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
cd80: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
cd90: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
cda0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
cdb0: 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30  UNCTION_ARG>1000
cdc0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
cdd0: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
cde0: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
cdf0: 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64   0 and 1000.#end
ce00: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
ce10: 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
ce20: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
ce30: 48 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53  HED>62.# error S
ce40: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
ce50: 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
ce60: 65 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64  en 0 and 62.#end
ce70: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
ce80: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
ce90: 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  ENGTH<1.# error 
cea0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
ceb0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d  PATTERN_LENGTH m
cec0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
ced0: 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
cee0: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33  ITE_MAX_COLUMN>3
cef0: 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  2767.# error SQL
cf00: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d  ITE_MAX_COLUMN m
cf10: 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33  ust not exceed 3
cf20: 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20  2767.#endif.#if 
cf30: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
cf40: 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72  ER_DEPTH<1.# err
cf50: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  or SQLITE_MAX_TR
cf60: 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74  IGGER_DEPTH must
cf70: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
cf80: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
cf90: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
cfa0: 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f  f a limit.  Repo
cfb0: 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
cfc0: 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c  ..** If an inval
cfd0: 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69  id limit index i
cfe0: 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f  s supplied, repo
cff0: 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e  rt -1..** Make n
d000: 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74  o changes but st
d010: 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f  ill report the o
d020: 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a  ld value if the.
d030: 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20  ** new limit is 
d040: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
d050: 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69  A new lower limi
d060: 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e  t does not shrin
d070: 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74  k existing const
d080: 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72  ructs..** It mer
d090: 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ely prevents new
d0a0: 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74   constructs that
d0b0: 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69   exceed the limi
d0c0: 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e  t.** from formin
d0d0: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
d0e0: 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20  3_limit(sqlite3 
d0f0: 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64  *db, int limitId
d100: 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b  , int newLimit){
d110: 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b  .  int oldLimit;
d120: 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ...  /* EVIDENCE
d130: 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
d140: 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
d150: 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
d160: 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
d170: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
d180: 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
d190: 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
d1a0: 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
d1b0: 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
d1c0: 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
d1d0: 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
d1e0: 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
d1f0: 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
d200: 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
d210: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d220: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d230: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
d240: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
d250: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
d260: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d270: 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
d280: 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
d290: 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
d2a0: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
d2b0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
d2c0: 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
d2d0: 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
d2e0: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
d2f0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
d300: 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
d310: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
d320: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
d330: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d340: 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
d350: 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
d360: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
d370: 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
d380: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d390: 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
d3a0: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
d3b0: 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
d3c0: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
d3d0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
d3e0: 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
d3f0: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
d400: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
d410: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d420: 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
d430: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
d440: 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
d450: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
d460: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
d470: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
d480: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
d4c0: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
d4d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
d4e0: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d4f0: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
d500: 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
d510: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
d520: 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
d530: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d540: 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
d550: 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
d560: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
d580: 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
d590: 5f 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f  _DEPTH==(SQLITE_
d5a0: 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
d5b0: 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
d5c0: 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
d5d0: 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
d5e0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
d5f0: 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
d600: 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
d610: 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
d620: 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
d630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
d640: 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
d650: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
d660: 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
d670: 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
d680: 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
d690: 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
d6a0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
d6b0: 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
d6c0: 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
d6d0: 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
d6e0: 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
d6f0: 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d710: 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
d720: 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  35419 */.}../*.*
d730: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d740: 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65  is used to parse
d750: 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e   both URIs and n
d760: 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73  on-URI filenames
d770: 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a   passed by the.*
d780: 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75  * user to API fu
d790: 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
d7a0: 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65  open() or sqlite
d7b0: 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64  3_open_v2(), and
d7c0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a   for database.**
d7d0: 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20   URIs specified 
d7e0: 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43  as part of ATTAC
d7f0: 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  H statements..**
d800: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
d810: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
d820: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
d830: 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
d840: 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e  o use (or.** a N
d850: 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  ULL to signify t
d860: 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20  he default VFS) 
d870: 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20  if the URI does 
d880: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76  not contain a "v
d890: 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79  fs=xxx".** query
d8a0: 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20   parameter. The 
d8b0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
d8c0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49  contains the URI
d8d0: 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   (or non-URI fil
d8e0: 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66  ename).** itself
d8f0: 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
d900: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
d910: 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61  he *pFlags varia
d920: 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ble should conta
d930: 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  in.** the defaul
d940: 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  t flags to open 
d950: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
d960: 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61  dle with. The va
d970: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
d980: 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20   *pFlags may be 
d990: 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72  updated before r
d9a0: 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20  eturning if the 
d9b0: 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e  URI filename con
d9c0: 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65  tains .** "cache
d9d0: 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78  =xxx" or "mode=x
d9e0: 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  xx" query parame
d9f0: 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ters..**.** If s
da00: 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
da10: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
da20: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a  . In this case *
da30: 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20  ppVfs is set to 
da40: 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
da50: 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20  VFS that should 
da60: 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  be used to open 
da70: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
da80: 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65  e. *pzFile is se
da90: 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
daa0: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
dab0: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
dac0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65   the file to ope
dad0: 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
dae0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
daf0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
db00: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
db10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
db20: 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  to release.** th
db30: 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  is buffer..**.**
db40: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
db50: 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  urs, then an SQL
db60: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
db70: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
db80: 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20  pzErrMsg.** may 
db90: 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
dba0: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
dbb0: 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73  aining an Englis
dbc0: 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
dbd0: 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74   .** message. It
dbe0: 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
dbf0: 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
dc00: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
dc10: 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ly release.** th
dc20: 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c  is buffer by cal
dc30: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  ling sqlite3_fre
dc40: 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
dc50: 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63  te3ParseUri(.  c
dc60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
dc70: 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f  ultVfs,        /
dc80: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20  * VFS to use if 
dc90: 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65  no "vfs=xxx" que
dca0: 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63  ry option */.  c
dcb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c  onst char *zUri,
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dcd0: 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
dce0: 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f   URI to parse */
dcf0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
dd00: 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
dd10: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51     /* IN/OUT: SQ
dd20: 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
dd30: 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
dd40: 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20  _vfs **ppVfs,   
dd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
dd60: 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a   VFS to use */ .
dd70: 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c    char **pzFile,
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61    /* OUT: Filena
dda0: 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  me component of 
ddb0: 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  URI */.  char **
ddc0: 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
ddd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
dde0: 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
ddf0: 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
de00: 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
de10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
de20: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
de30: 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20  gs = *pFlags;.  
de40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
de50: 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a   = zDefaultVfs;.
de60: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
de70: 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e   char c;.  int n
de80: 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Uri = sqlite3Str
de90: 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20  len30(zUri);..  
dea0: 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73  assert( *pzErrMs
deb0: 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  g==0 );..  if( (
dec0: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
ded0: 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c  OPEN_URI) || sql
dee0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
def0: 2e 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26  .bOpenUri) .   &
df00: 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d  & nUri>=5 && mem
df10: 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a  cmp(zUri, "file:
df20: 22 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20  ", 5)==0 .  ){. 
df30: 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20     char *zOpt;. 
df40: 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20     int eState;  
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65   /* Parser state
df70: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52   when parsing UR
df80: 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e  I */.    int iIn
df90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dfa0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
dfb0: 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
dfc0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  */.    int iOut 
dfd0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
dfe0: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
dff0: 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
e000: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
e010: 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20  = nUri+2;       
e020: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e030: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
e040: 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  e */..    /* Mak
e050: 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54  e sure the SQLIT
e060: 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
e070: 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
e080: 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f  te to the VFS xO
e090: 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68  pen .    ** meth
e0a0: 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61  od that there ma
e0b0: 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d  y be extra param
e0c0: 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eters following 
e0d0: 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20  the file-name.  
e0e0: 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  */.    flags |= 
e0f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
e100: 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b  ..    for(iIn=0;
e110: 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b   iIn<nUri; iIn++
e120: 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69  ) nByte += (zUri
e130: 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20  [iIn]=='&');.   
e140: 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
e150: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
e160: 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
e170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e180: 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20 44 69  OMEM;..    /* Di
e190: 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65  scard the scheme
e1a0: 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73   and authority s
e1b0: 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55  egments of the U
e1c0: 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  RI. */.    if( z
e1d0: 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a  Uri[5]=='/' && z
e1e0: 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20  Uri[6]=='/' ){. 
e1f0: 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
e200: 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
e210: 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
e220: 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='/' ) iIn++;.
e230: 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d  .      if( iIn!=
e240: 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c  7 && (iIn!=16 ||
e250: 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f   memcmp("localho
e260: 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39  st", &zUri[7], 9
e270: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  )) ){.        *p
e280: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
e290: 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c  3_mprintf("inval
e2a0: 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79  id uri authority
e2b0: 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20  : %.*s", .      
e2c0: 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55        iIn-7, &zU
e2d0: 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20  ri[7]);.        
e2e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
e2f0: 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
e300: 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
e310: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
e320: 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 35 3b  {.      iIn = 5;
e330: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
e340: 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  opy the filename
e350: 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70   and any query p
e360: 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74  arameters into t
e370: 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e  he zFile buffer.
e380: 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20   .    ** Decode 
e390: 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73  %HH escape codes
e3a0: 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20   along the way. 
e3b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
e3c0: 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c  ithin this loop,
e3d0: 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65   variable eState
e3e0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30   may be set to 0
e3f0: 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64  , 1 or 2, depend
e400: 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ing.    ** on th
e410: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
e420: 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  t. As follows:. 
e430: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30     **.    **   0
e440: 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e  : Parsing file-n
e450: 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a  ame..    **   1:
e460: 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65   Parsing name se
e470: 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
e480: 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
e490: 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  meter..    **   
e4a0: 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65  2: Parsing value
e4b0: 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
e4c0: 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
e4d0: 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f  arameter..    */
e4e0: 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b  .    eState = 0;
e4f0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
e500: 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
e510: 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20  & c!='#' ){.    
e520: 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69    iIn++;.      i
e530: 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20  f( c=='%' .     
e540: 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
e550: 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20  igit(zUri[iIn]) 
e560: 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
e570: 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
e580: 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29  iIn+1]) .      )
e590: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63  {.        int oc
e5a0: 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65  tet = (sqlite3He
e5b0: 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
e5c0: 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20  +]) << 4);.     
e5d0: 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69     octet += sqli
e5e0: 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
e5f0: 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20  [iIn++]);..     
e600: 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74     assert( octet
e610: 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36  >=0 && octet<256
e620: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e630: 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  octet==0 ){.    
e640: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
e650: 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
e660: 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73  en "%00" appears
e670: 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e   within the URI.
e680: 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   In this.       
e690: 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67     ** case we ig
e6a0: 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e  nore all text in
e6b0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
e6c0: 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65  f the path, name
e6d0: 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   or.          **
e6e0: 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79   value currently
e6f0: 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53   being parsed. S
e700: 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72  o ignore the cur
e710: 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20  rent character. 
e720: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
e730: 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74  skip to the next
e740: 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22   "?", "=" or "&"
e750: 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
e760: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
e770: 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
e780: 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
e790: 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  #' .            
e7a0: 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20    && (eState!=0 
e7b0: 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20  || c!='?').     
e7c0: 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
e7d0: 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d  ate!=1 || (c!='=
e7e0: 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20  ' && c!='&')).  
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
e800: 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d  eState!=2 || c!=
e810: 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29  '&').          )
e820: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49  {.            iI
e830: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
e840: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
e850: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
e860: 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74         c = octet
e870: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e880: 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28  ( eState==1 && (
e890: 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27  c=='&' || c=='='
e8a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
e8b0: 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d   zFile[iOut-1]==
e8c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
e8d0: 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f  * An empty optio
e8e0: 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74  n name. Ignore t
e8f0: 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67  his option altog
e900: 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ether. */.      
e910: 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
e920: 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
e930: 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69  ]!='#' && zUri[i
e940: 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e  In-1]!='&' ) iIn
e950: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
e960: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
e970: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
e980: 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='&' ){.        
e990: 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
e9a0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
e9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e9c0: 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20   eState = 2;.   
e9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
e9e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
e9f0: 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30  e if( (eState==0
ea00: 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28   && c=='?') || (
ea10: 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d  eState==2 && c==
ea20: 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '&') ){.        
ea30: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65  c = 0;.        e
ea40: 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
ea50: 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69   }.      zFile[i
ea60: 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
ea70: 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  }.    if( eState
ea80: 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74  ==1 ) zFile[iOut
ea90: 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
eaa0: 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
eab0: 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
eac0: 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
ead0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
eae0: 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20   there were any 
eaf0: 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65  options specifie
eb00: 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  d that should be
eb10: 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20   interpreted .  
eb20: 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f    ** here. Optio
eb30: 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ns that are inte
eb40: 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63  rpreted here inc
eb50: 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74  lude "vfs" and t
eb60: 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  hose that.    **
eb70: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66   correspond to f
eb80: 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65  lags that may be
eb90: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
eba0: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
ebb0: 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20  .    ** method. 
ebc0: 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  */.    zOpt = &z
ebd0: 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  File[sqlite3Strl
ebe0: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a  en30(zFile)+1];.
ebf0: 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b      while( zOpt[
ec00: 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
ec10: 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74  nOpt = sqlite3St
ec20: 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20  rlen30(zOpt);.  
ec30: 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d      char *zVal =
ec40: 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a   &zOpt[nOpt+1];.
ec50: 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d        int nVal =
ec60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ec70: 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69  (zVal);..      i
ec80: 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65  f( nOpt==3 && me
ec90: 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74  mcmp("vfs", zOpt
eca0: 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
ecb0: 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a     zVfs = zVal;.
ecc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ecd0: 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e       struct Open
ece0: 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20  Mode {.         
ecf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
ed00: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
ed10: 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61  de;.        } *a
ed20: 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mode = 0;.      
ed30: 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70    char *zModeTyp
ed40: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
ed50: 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nt mask = 0;.   
ed60: 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
ed70: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   0;..        if(
ed80: 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63   nOpt==5 && memc
ed90: 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74  mp("cache", zOpt
eda0: 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 5)==0 ){.     
edb0: 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
edc0: 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63  ct OpenMode aCac
edd0: 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  heMode[] = {.   
ede0: 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72           { "shar
edf0: 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ed",  SQLITE_OPE
ee00: 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
ee10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
ee20: 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45  private", SQLITE
ee30: 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
ee40: 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
ee50: 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
ee60: 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
ee70: 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
ee80: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
ee90: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  E|SQLITE_OPEN_PR
eea0: 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20  IVATECACHE;.    
eeb0: 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43        aMode = aC
eec0: 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20  acheMode;.      
eed0: 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
eee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
eef0: 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b  eType = "cache";
ef00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ef10: 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26     if( nOpt==4 &
ef20: 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c  & memcmp("mode",
ef30: 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a   zOpt, 4)==0 ){.
ef40: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
ef50: 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
ef60: 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b   aOpenMode[] = {
ef70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
ef80: 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ro",  SQLITE_OPE
ef90: 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
efa0: 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22            { "rw"
efb0: 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
efc0: 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20  EADWRITE }, .   
efd0: 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22           { "rwc"
efe0: 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
eff0: 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
f000: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
f010: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
f020: 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
f030: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
f040: 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
f050: 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
f060: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
f070: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
f080: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  E;.          aMo
f090: 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a  de = aOpenMode;.
f0a0: 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20            limit 
f0b0: 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a  = mask & flags;.
f0c0: 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
f0d0: 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a  ype = "access";.
f0e0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
f0f0: 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a     if( aMode ){.
f100: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
f110: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d  .          int m
f120: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
f130: 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64     for(i=0; aMod
f140: 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20  e[i].z; i++){.  
f150: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
f160: 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b  char *z = aMode[
f170: 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  i].z;.          
f180: 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69    if( nVal==sqli
f190: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26  te3Strlen30(z) &
f1a0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c  & 0==memcmp(zVal
f1b0: 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20  , z, nVal) ){.  
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65              mode
f1d0: 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65   = aMode[i].mode
f1e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
f1f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
f200: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f210: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d  .          if( m
f220: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
f230: 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
f240: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
f250: 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f  f("no such %s mo
f260: 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79  de: %s", zModeTy
f270: 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
f280: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f290: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
f2a0: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
f2b0: 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
f2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f2d0: 69 66 28 20 6d 6f 64 65 3e 6c 69 6d 69 74 20 29  if( mode>limit )
f2e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
f2f0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
f300: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
f310: 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
f320: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
f350: 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
f360: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
f370: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
f380: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
f390: 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
f3a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f3b0: 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
f3c0: 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
f3d0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
f3e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
f3f0: 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
f400: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
f410: 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
f420: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72  lite3_malloc(nUr
f430: 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
f440: 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
f450: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
f460: 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55  memcpy(zFile, zU
f470: 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a  ri, nUri);.    z
f480: 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30  File[nUri] = '\0
f490: 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  ';.    zFile[nUr
f4a0: 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  i+1] = '\0';.  }
f4b0: 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c  ..  *ppVfs = sql
f4c0: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56  ite3_vfs_find(zV
f4d0: 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66  fs);.  if( *ppVf
f4e0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45  s==0 ){.    *pzE
f4f0: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
f500: 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
f510: 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29   vfs: %s", zVfs)
f520: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
f530: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61  E_ERROR;.  }. pa
f540: 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69  rse_uri_out:.  i
f550: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f560: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
f570: 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  free(zFile);.   
f580: 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a   zFile = 0;.  }.
f590: 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67    *pFlags = flag
f5a0: 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a  s;.  *pzFile = z
f5b0: 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  File;.  return r
f5c0: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
f5d0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
f5e0: 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69  he work of openi
f5f0: 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e  ng a database on
f600: 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71   behalf of.** sq
f610: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64  lite3_open() and
f620: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
f630: 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ). The database 
f640: 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e  filename "zFilen
f650: 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46  ame"  .** is UTF
f660: 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73  -8 encoded..*/.s
f670: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61  tatic int openDa
f680: 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20  tabase(.  const 
f690: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
f6a0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
f6b0: 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f  ename UTF-8 enco
f6c0: 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
f6d0: 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
f6e0: 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64  /* OUT: Returned
f6f0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
f700: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   */.  unsigned i
f710: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20  nt flags,    /* 
f720: 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67  Operational flag
f730: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
f740: 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a  r *zVfs       /*
f750: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   Name of the VFS
f760: 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
f770: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74  /* Store allocat
f7a0: 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  ed handle here *
f7b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
f7e0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68  de */.  int isTh
f7f0: 72 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20  readsafe;       
f800: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
f810: 66 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63  for threadsafe c
f820: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
f830: 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b  char *zOpen = 0;
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  /* Filename argu
f860: 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
f870: 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20  BtreeOpen() */. 
f880: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
f890: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
f8a0: 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
f8b0: 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61  e from sqlite3Pa
f8c0: 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a  rseUri() */..  *
f8d0: 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
f8e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f8f0: 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
f900: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
f910: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
f920: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
f930: 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f  ..  /* Only allo
f940: 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69  w sensible combi
f950: 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20  nations of bits 
f960: 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72 67  in the flags arg
f970: 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68  ument.  .  ** Th
f980: 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
f990: 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f  any non-sense co
f9a0: 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65  mbination is use
f9b0: 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64  d.  If we.  ** d
f9c0: 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65  o not block ille
f9d0: 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  gal combinations
f9e0: 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20   here, it could 
f9f0: 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73  trigger.  ** ass
fa00: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
fa10: 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72   in deeper layer
fa20: 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d  s.  Sensible com
fa30: 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61  binations.  ** a
fa40: 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31  re:.  **.  **  1
fa50: 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
fa60: 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a  EADONLY.  **  2:
fa70: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
fa80: 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a  ADWRITE.  **  6:
fa90: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
faa0: 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
fab0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a  _OPEN_CREATE.  *
fac0: 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  /.  assert( SQLI
fad0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
fae0: 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61    == 0x01 );.  a
faf0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
fb00: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20  EN_READWRITE == 
fb10: 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74  0x02 );.  assert
fb20: 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  ( SQLITE_OPEN_CR
fb30: 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20  EATE    == 0x04 
fb40: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
fb50: 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
fb60: 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e  x02 ); /* READON
fb70: 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  LY */.  testcase
fb80: 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
fb90: 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41  ==0x04 ); /* REA
fba0: 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74  DWRITE */.  test
fbb0: 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
fbc0: 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a  &7))==0x40 ); /*
fbd0: 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45   READWRITE | CRE
fbe0: 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31  ATE */.  if( ((1
fbf0: 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30  <<(flags&7)) & 0
fc00: 78 34 36 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  x46)==0 ) return
fc10: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
fc20: 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  KPT;..  if( sqli
fc30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
fc40: 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b  bCoreMutex==0 ){
fc50: 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
fc60: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
fc70: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
fc80: 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29  E_OPEN_NOMUTEX )
fc90: 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
fca0: 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
fcb0: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
fcc0: 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
fcd0: 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
fce0: 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  dsafe = 1;.  }el
fcf0: 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64  se{.    isThread
fd00: 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c  safe = sqlite3Gl
fd10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
fd20: 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  Mutex;.  }.  if(
fd30: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
fd40: 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
fd50: 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26  E ){.    flags &
fd60: 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  = ~SQLITE_OPEN_S
fd70: 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65  HAREDCACHE;.  }e
fd80: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47  lse if( sqlite3G
fd90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
fda0: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
fdb0: 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
fdc0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
fdd0: 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f  DCACHE;.  }..  /
fde0: 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c  * Remove harmful
fdf0: 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66   bits from the f
fe00: 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20  lags parameter. 
fe10: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
fe20: 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
fe30: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e   and SQLITE_OPEN
fe40: 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73  _FULLMUTEX flags
fe50: 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74   were.  ** dealt
fe60: 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65   with in the pre
fe70: 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b  vious code block
fe80: 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65  .  Besides these
fe90: 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20  , the only.  ** 
fea0: 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67  valid input flag
feb0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  s for sqlite3_op
fec0: 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49  en_v2() are SQLI
fed0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
fee0: 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
fef0: 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51  EN_READWRITE, SQ
ff00: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
ff10: 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  , SQLITE_OPEN_SH
ff20: 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20  AREDCACHE,.  ** 
ff30: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
ff40: 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f  ATECACHE, and so
ff50: 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73  me reserved bits
ff60: 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b  .  Silently mask
ff70: 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74  .  ** off all ot
ff80: 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a  her flags..  */.
ff90: 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53    flags &=  ~( S
ffa0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
ffb0: 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
ffc0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ffd0: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
ffe0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
fff0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
10000 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20  N_DB |.         
10010 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
10020 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20  N_TEMP_DB | .   
10030 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
10040 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
10050 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  T_DB | .        
10060 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
10070 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
10080 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
10090 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
100a0 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  MP_JOURNAL | .  
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
100c0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
100d0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
100e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
100f0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
10100 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
10110 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f    SQLITE_OPEN_NO
10120 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
10130 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
10140 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20  EN_FULLMUTEX |. 
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
10160 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
10170 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
10180 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
10190 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
101a0 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
101b0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
101c0 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
101d0 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
101e0 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
101f0 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68  _out;.  if( isTh
10200 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20  readsafe ){.    
10210 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
10220 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
10230 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
10240 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
10250 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
10260 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
10270 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
10280 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
10290 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
102a0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
102b0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
102c0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
102d0 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
102e0 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
102f0 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
10300 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
10310 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
10320 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
10330 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
10340 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
10350 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
10360 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
10370 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
10380 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
10390 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f  ));.  db->autoCo
103a0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e  mmit = 1;.  db->
103b0 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31  nextAutovac = -1
103c0 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  ;.  db->nextPage
103d0 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  size = 0;.  db->
103e0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
103f0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20  ShortColNames | 
10400 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
10410 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   | SQLITE_Enable
10420 54 72 69 67 67 65 72 0a 23 69 66 20 53 51 4c 49  Trigger.#if SQLI
10430 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10440 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20  FORMAT<4.       
10450 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
10460 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
10470 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
10480 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41  QLITE_ENABLE_LOA
10490 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
104b0 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73  QLITE_LoadExtens
104c0 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ion.#endif.#if S
104d0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45  QLITE_DEFAULT_RE
104e0 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53  CURSIVE_TRIGGERS
104f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10500 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72    | SQLITE_RecTr
10510 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69  iggers.#endif.#i
10520 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
10530 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
10540 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45  _KEYS) && SQLITE
10550 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
10560 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20  _KEYS.          
10570 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
10580 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64  ForeignKeys.#end
10590 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c  if.      ;.  sql
105a0 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
105b0 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66  ->aCollSeq);.#if
105c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
105d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
105e0 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
105f0 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
10600 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
10610 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
10620 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
10630 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f  INARY. BINARY wo
10640 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46  rks for both UTF
10650 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d  -8.  ** and UTF-
10660 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72  16, so add a ver
10670 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f  sion for each to
10680 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63   avoid any unnec
10690 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76  essary.  ** conv
106a0 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ersions. The onl
106b0 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e  y error that can
106c0 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61   occur here is a
106d0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
106e0 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  e..  */.  create
106f0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
10700 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
10710 54 46 38 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c  TF8, SQLITE_COLL
10720 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20  _BINARY, 0,.    
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69                bi
10740 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
10750 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
10760 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
10770 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53  QLITE_UTF16BE, S
10780 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52  QLITE_COLL_BINAR
10790 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  Y, 0,.          
107a0 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46          binCollF
107b0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
107c0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
107d0 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
107e0 55 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f  UTF16LE, SQLITE_
107f0 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a  COLL_BINARY, 0,.
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30    binCollFunc, 0
10820 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
10830 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
10840 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
10850 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c  QLITE_COLL_USER,
10860 20 28 76 6f 69 64 2a 29 31 2c 0a 20 20 20 20 20   (void*)1,.     
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e               bin
10880 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
10890 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
108a0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
108b0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
108c0 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  .  db->pDfltColl
108d0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
108e0 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
108f0 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c  _UTF8, "BINARY",
10900 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64   0);.  assert( d
10910 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20  b->pDfltColl!=0 
10920 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64  );..  /* Also ad
10930 64 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69  d a UTF-8 case-i
10940 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61  nsensitive colla
10950 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a  tion sequence. *
10960 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
10970 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22  ion(db, "NOCASE"
10980 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
10990 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53  QLITE_COLL_NOCAS
109a0 45 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  E, 0,.          
109b0 20 20 20 20 20 20 20 20 6e 6f 63 61 73 65 43 6f          nocaseCo
109c0 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b  llatingFunc, 0);
109d0 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
109e0 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72   filename/URI ar
109f0 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d  gument. */.  db-
10a00 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61  >openFlags = fla
10a10 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  gs;.  rc = sqlit
10a20 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c  e3ParseUri(zVfs,
10a30 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61   zFilename, &fla
10a40 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26  gs, &db->pVfs, &
10a50 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29  zOpen, &zErrMsg)
10a60 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
10a80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
10a90 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  M ) db->mallocFa
10aa0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71  iled = 1;.    sq
10ab0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
10ac0 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  c, zErrMsg ? "%s
10ad0 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b  " : 0, zErrMsg);
10ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10af0 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
10b00 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
10b10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
10b20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
10b30 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
10b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10b50 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
10b60 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d   zOpen, db, &db-
10b70 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a  >aDb[0].pBt, 0,.
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
10ba0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
10bb0 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  _DB);.  if( rc!=
10bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10bd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10be0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
10bf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10c00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
10c10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
10c20 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 67  b, rc, 0);.    g
10c30 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
10c40 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d    }.  db->aDb[0]
10c50 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
10c60 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
10c70 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
10c80 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
10c90 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
10ca0 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
10cb0 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  ...  /* The defa
10cc0 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  ult safety_level
10cd0 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
10ce0 74 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27  tabase is 'full'
10cf0 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20  ; for the temp. 
10d00 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20   ** database it 
10d10 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20  is 'NONE'. This 
10d20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65  matches the page
10d30 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73  r layer defaults
10d40 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61  .  .  */.  db->a
10d50 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d  Db[0].zName = "m
10d60 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  ain";.  db->aDb[
10d70 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  0].safety_level 
10d80 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  = 3;.  db->aDb[1
10d90 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22  ].zName = "temp"
10da0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73  ;.  db->aDb[1].s
10db0 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b  afety_level = 1;
10dc0 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
10dd0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
10de0 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  N;.  if( db->mal
10df0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
10e00 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
10e10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  ;.  }..  /* Regi
10e20 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69  ster all built-i
10e30 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74  n functions, but
10e40 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
10e50 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a  to read the.  **
10e60 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
10e70 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65   yet. This is de
10e80 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20  layed until the 
10e90 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64  first time the d
10ea0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20  atabase.  ** is 
10eb0 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  accessed..  */. 
10ec0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
10ed0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
10ee0 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
10ef0 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  erBuiltinFunctio
10f00 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  ns(db);..  /* Lo
10f10 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ad automatic ext
10f20 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73  ensions - extens
10f30 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  ions that have b
10f40 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20  een registered. 
10f50 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71   ** using the sq
10f60 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f  lite3_automatic_
10f70 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e  extension() API.
10f80 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 41  .  */.  sqlite3A
10f90 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  utoLoadExtension
10fa0 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  s(db);.  rc = sq
10fb0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
10fc0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10fd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
10fe0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
10ff0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
11000 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20  E_ENABLE_FTS1.  
11010 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
11020 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74  ailed ){.    ext
11030 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
11040 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts1Init(sqlite3*
11050 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
11060 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b  te3Fts1Init(db);
11070 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
11080 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11090 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62  E_FTS2.  if( !db
110a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
110b0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
110c0 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
110d0 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  t sqlite3Fts2Ini
110e0 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
110f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
11100 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  2Init(db);.  }.#
11110 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
11120 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
11130 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
11140 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
11150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
11170 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  3Init(db);.  }.#
11180 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
11190 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a  LITE_ENABLE_ICU.
111a0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
111b0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
111c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
111d0 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49  rc = sqlite3IcuI
111e0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
111f0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
11200 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
11210 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
11220 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
11230 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
11240 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65  c = sqlite3Rtree
11250 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
11260 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45  ndif..  sqlite3E
11270 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
11280 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f  ..  /* -DSQLITE_
11290 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
112a0 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43  MODE=1 makes EXC
112b0 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75  LUSIVE the defau
112c0 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
112d0 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f  mode.  -DSQLITE_
112e0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
112f0 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d  MODE=0 make NORM
11300 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  AL the default l
11310 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
11320 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67  .  Doing nothing
11330 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b   at all also mak
11340 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  es NORMAL the de
11350 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64  fault..  */.#ifd
11360 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
11370 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20  T_LOCKING_MODE. 
11380 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64   db->dfltLockMod
11390 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
113a0 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b  LT_LOCKING_MODE;
113b0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  .  sqlite3PagerL
113c0 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74  ockingMode(sqlit
113d0 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
113e0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20  >aDb[0].pBt),.  
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
11410 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
11420 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ODE);.#endif..  
11430 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
11440 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
11450 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
11460 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
11470 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
11480 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
11490 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
114b0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
114c0 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
114d0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
114e0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
114f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
11500 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
11510 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
11520 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11530 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62  zOpen);.  if( db
11540 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11550 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20  db->mutex!=0 || 
11560 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20  isThreadsafe==0 
11570 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
11580 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
11590 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
115a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
115b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
115c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
115d0 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66  rrcode(db);.  if
115e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
115f0 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
11600 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
11610 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
11620 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11630 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
11640 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
11650 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a  IC_SICK;.  }.  *
11660 70 70 44 62 20 3d 20 64 62 3b 0a 20 20 72 65 74  ppDb = db;.  ret
11670 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78  urn sqlite3ApiEx
11680 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  it(0, rc);.}../*
11690 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
116a0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
116b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
116c0 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
116d0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  r *zFilename, . 
116e0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20   sqlite3 **ppDb 
116f0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
11700 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
11710 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  ame, ppDb,.     
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
11740 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
11750 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
11760 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
11770 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20  pen_v2(.  const 
11780 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
11790 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
117a0 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a  lename (UTF-8) *
117b0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
117c0 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Db,         /* O
117d0 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61  UT: SQLite db ha
117e0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ndle */.  int fl
117f0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
11800 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20    /* Flags */.  
11810 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
11820 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
11830 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f  of VFS module to
11840 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   use */.){.  ret
11850 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
11860 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  (filename, ppDb,
11870 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66   (unsigned int)f
11880 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
11890 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
118a0 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
118b0 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
118c0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
118d0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
118e0 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
118f0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
11900 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
11910 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
11920 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
11930 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
11940 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
11950 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
11960 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
11970 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
11980 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  ..  assert( zFil
11990 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  ename );.  asser
119a0 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70  t( ppDb );.  *pp
119b0 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
119c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
119d0 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
119e0 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
119f0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
11a00 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
11a10 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
11a20 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
11a30 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
11a40 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65  (pVal, -1, zFile
11a50 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  name, SQLITE_UTF
11a60 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45  16NATIVE, SQLITE
11a70 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c  _STATIC);.  zFil
11a80 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  ename8 = sqlite3
11a90 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
11aa0 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
11ab0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29  if( zFilename8 )
11ac0 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  {.    rc = openD
11ad0 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
11ae0 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  e8, ppDb,.      
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11b10 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
11b20 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
11b30 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44      assert( *ppD
11b40 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b || rc==SQLITE_
11b50 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28  NOMEM );.    if(
11b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11b70 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  & !DbHasProperty
11b80 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63  (*ppDb, 0, DB_Sc
11b90 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20  hemaLoaded) ){. 
11ba0 20 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20       ENC(*ppDb) 
11bb0 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
11bc0 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  TIVE;.    }.  }e
11bd0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
11be0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
11bf0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
11c00 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
11c10 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78  urn sqlite3ApiEx
11c20 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e  it(0, rc);.}.#en
11c30 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11c40 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
11c50 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
11c60 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
11c70 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
11c80 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
11c90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11ca0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
11cb0 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
11cc0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
11cd0 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
11ce0 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
11cf0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
11d00 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
11d10 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
11d20 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
11d30 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
11d40 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
11d50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
11d60 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
11d70 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
11d80 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
11d90 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
11da0 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  nc, SQLITE_COLL_
11db0 55 53 45 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d  USER, pCtx, xCom
11dc0 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d  pare, 0);.  rc =
11dd0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
11de0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
11df0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
11e00 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11e10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11e20 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
11e30 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
11e40 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
11e50 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
11e60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
11e70 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
11e80 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  v2(.  sqlite3* d
11e90 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
11ea0 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
11eb0 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
11ec0 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
11ed0 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
11ee0 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
11ef0 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
11f00 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
11f10 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
11f20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11f30 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11f40 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
11f50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
11f60 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
11f70 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
11f80 2c 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54  , (u8)enc, SQLIT
11f90 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74  E_COLL_USER, pCt
11fa0 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65  x, xCompare, xDe
11fb0 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
11fc0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
11fd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
11fe0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11ff0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
12000 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
12010 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
12020 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
12030 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
12040 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
12050 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12060 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
12070 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
12080 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
12090 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76  * db, .  const v
120a0 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  oid *zName,.  in
120b0 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
120c0 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
120d0 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
120e0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
120f0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
12100 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12110 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
12120 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33  Name8;.  sqlite3
12130 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
12140 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
12150 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
12160 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38  iled );.  zName8
12170 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
12180 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  o8(db, zName, -1
12190 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
121a0 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61  TIVE);.  if( zNa
121b0 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
121c0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
121d0 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29  db, zName8, (u8)
121e0 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c  enc, SQLITE_COLL
121f0 5f 55 53 45 52 2c 20 70 43 74 78 2c 20 78 43 6f  _USER, pCtx, xCo
12200 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73  mpare, 0);.    s
12210 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12220 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20   zName8);.  }.  
12230 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
12240 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
12250 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12260 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
12270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
12280 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12290 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
122a0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
122b0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
122c0 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
122d0 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
122e0 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
122f0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
12300 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
12310 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
12320 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
12330 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
12340 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
12350 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
12360 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
12370 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
12380 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
12390 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
123a0 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
123b0 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c   char*).){.  sql
123c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
123d0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
123e0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
123f0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
12400 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
12410 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
12420 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
12430 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
12440 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12450 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12470 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
12480 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
12490 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
124a0 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
124b0 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
124c0 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
124d0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
124e0 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
124f0 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
12500 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
12510 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
12520 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
12530 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
12540 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
12550 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
12560 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
12570 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
12580 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
12590 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
125a0 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
125b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
125c0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
125d0 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
125e0 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
125f0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
12600 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
12610 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
12620 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
12630 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
12640 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12650 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
12660 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
12670 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12680 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
12690 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
126a0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
126b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
126c0 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
126d0 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
126e0 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
126f0 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
12700 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
12710 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
12720 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
12730 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
12740 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
12750 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
12760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12770 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
12780 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
12790 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
127a0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
127b0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
127c0 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
127d0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
127e0 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
127f0 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
12800 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
12810 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
12820 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
12830 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
12840 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
12850 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
12860 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
12870 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a  or ROLLBACK..**.
12880 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20  ******* THIS IS 
12890 41 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20  AN EXPERIMENTAL 
128a0 41 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45  API AND IS SUBJE
128b0 43 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a  CT TO CHANGE ***
128c0 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ***.*/.int sqlit
128d0 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
128e0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
128f0 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
12900 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
12910 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
12920 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
12930 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
12940 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
12950 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
12960 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
12970 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
12980 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62  IOERR and possib
12990 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
129a0 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
129b0 65 79 20 73 65 72 76 65 72 20 74 77 6f 20 70 75  ey server two pu
129c0 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
129d0 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
129e0 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
129f0 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
12a00 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
12a10 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
12a20 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
12a30 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
12a40 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
12a50 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
12a60 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
12a70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
12a80 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
12a90 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
12aa0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
12ab0 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
12ac0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12ad0 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
12ae0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
12af0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
12b00 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
12b10 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
12b20 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
12b30 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
12b40 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
12b50 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
12b60 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
12b80 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
12b90 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
12ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12bb0 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
12bc0 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
12bd0 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
12be0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
12bf0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
12c00 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
12c10 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
12c20 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
12c30 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
12c40 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
12c50 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
12c60 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
12c70 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
12c80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12c90 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
12ca0 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
12cb0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
12cc0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
12cd0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12ce0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
12cf0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
12d00 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
12d10 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
12d20 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
12d30 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
12d40 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
12d50 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
12d60 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
12d70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12d80 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
12d90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12da0 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
12db0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
12dc0 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
12dd0 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
12de0 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
12df0 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
12e00 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
12e10 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
12e20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
12e30 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
12e40 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
12e50 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
12e60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
12e70 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
12e80 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
12e90 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
12ea0 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
12eb0 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
12ec0 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
12ed0 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
12ee0 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
12ef0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
12f00 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
12f10 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
12f20 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
12f30 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
12f40 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
12f50 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
12f60 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12f70 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
12f80 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74  TADATA.int sqlit
12f90 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
12fa0 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
12fb0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
12fc0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
12fd0 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
12fe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
12ff0 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
13000 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
13010 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
13020 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
13030 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
13040 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
13050 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
13060 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
13070 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
13080 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
13090 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
130a0 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
130b0 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
130c0 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
130d0 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
130e0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
130f0 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
13100 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
13110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
13120 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
13130 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
13140 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
13150 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
13160 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
13170 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
13180 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
13190 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
131b0 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
131c0 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
131d0 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
131e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
131f0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
13200 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
13210 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
13220 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
13230 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  l;..  char const
13240 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
13250 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
13260 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
13270 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
13280 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
13290 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
132a0 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45  inc = 0;..  /* E
132b0 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
132c0 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
132d0 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
132e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
132f0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
13300 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13310 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
13320 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
13330 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
13340 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
13350 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
13360 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
13370 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
13380 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
13390 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
133a0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
133b0 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
133c0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
133d0 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
133e0 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
133f0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
13400 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
13410 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
13420 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
13430 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
13440 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
13450 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
13460 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
13470 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
13480 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
13490 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
134a0 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
134b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
134c0 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
134d0 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
134e0 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
134f0 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
13500 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
13510 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
13520 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
13530 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
13540 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
13550 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13560 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
13570 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
13580 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
13590 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
135a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
135b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
135c0 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
135d0 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
135e0 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
135f0 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
13600 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
13610 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
13620 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
13630 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
13640 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
13650 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
13660 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
13670 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
13680 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
13690 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
136a0 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
136b0 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
136c0 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
136d0 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
136e0 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
136f0 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
13700 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
13710 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
13720 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
13730 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
13740 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
13750 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
13760 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
13770 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
13780 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
13790 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
137a0 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
137b0 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
137c0 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
137d0 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
137e0 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
137f0 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
13800 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
13810 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
13820 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65  = pCol->isPrimKe
13830 79 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  y!=0;.    autoin
13840 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
13850 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
13860 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
13870 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
13880 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
13890 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
138a0 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
138b0 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
138c0 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
138d0 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22      zCollSeq = "
138e0 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72  BINARY";.  }..er
138f0 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
13900 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
13910 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68  db);..  /* Wheth
13920 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  er the function 
13930 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f  call succeeded o
13940 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68  r failed, set th
13950 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
13960 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74  ers.  ** to what
13970 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c  ever their local
13980 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f   counterparts co
13990 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72  ntain. If an err
139a0 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20  or did occur,.  
139b0 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20  ** this has the 
139c0 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e  effect of zeroin
139d0 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72  g all output par
139e0 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
139f0 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29  if( pzDataType )
13a00 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a   *pzDataType = z
13a10 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20  DataType;.  if( 
13a20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43  pzCollSeq ) *pzC
13a30 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65  ollSeq = zCollSe
13a40 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c  q;.  if( pNotNul
13a50 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20  l ) *pNotNull = 
13a60 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70  notnull;.  if( p
13a70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50  PrimaryKey ) *pP
13a80 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d  rimaryKey = prim
13a90 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41  arykey;.  if( pA
13aa0 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69  utoinc ) *pAutoi
13ab0 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20  nc = autoinc;.. 
13ac0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
13ad0 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  rc && !pTab ){. 
13ae0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13af0 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
13b00 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
13b10 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
13b20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
13b30 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a  olumn: %s.%s", z
13b40 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
13b50 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b     zColumnName);
13b60 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13b70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
13b80 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
13b90 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22  c, (zErrMsg?"%s"
13ba0 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  :0), zErrMsg);. 
13bb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13bc0 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  b, zErrMsg);.  r
13bd0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
13be0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
13bf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13c00 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
13c10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
13c20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  dif../*.** Sleep
13c30 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
13c40 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
13c50 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
13c60 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  slept..*/.int sq
13c70 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20  lite3_sleep(int 
13c80 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ms){.  sqlite3_v
13c90 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20  fs *pVfs;.  int 
13ca0 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c  rc;.  pVfs = sql
13cb0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
13cc0 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20  ;.  if( pVfs==0 
13cd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
13ce0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13cf0 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65  works in millise
13d00 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75  conds, but the u
13d10 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65  nderlying OsSlee
13d20 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73  p() .  ** API us
13d30 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e  es microseconds.
13d40 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27   Hence the 1000'
13d50 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28  s..  */.  rc = (
13d60 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70  sqlite3OsSleep(p
13d70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30  Vfs, 1000*ms)/10
13d80 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  00);.  return rc
13d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ;.}../*.** Enabl
13da0 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
13db0 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74   extended result
13dc0 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   codes..*/.int s
13dd0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
13de0 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c  result_codes(sql
13df0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e  ite3 *db, int on
13e00 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  off){.  sqlite3_
13e10 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
13e20 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
13e30 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20  rMask = onoff ? 
13e40 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66  0xffffffff : 0xf
13e50 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
13e60 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
13e70 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
13e80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13e90 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69  * Invoke the xFi
13ea0 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  leControl method
13eb0 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
13ec0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
13ed0 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  t sqlite3_file_c
13ee0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a  ontrol(sqlite3 *
13ef0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
13f00 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c  zDbName, int op,
13f10 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
13f20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13f30 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62  ERROR;.  int iDb
13f40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
13f50 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
13f60 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d  x);.  if( zDbNam
13f70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 44 62 20  e==0 ){.    iDb 
13f80 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
13f90 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62    for(iDb=0; iDb
13fa0 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29  <db->nDb; iDb++)
13fb0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
13fc0 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  mp(db->aDb[iDb].
13fd0 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3d  zName, zDbName)=
13fe0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
13ff0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c  }.  }.  if( iDb<
14000 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20 20 20 42  db->nDb ){.    B
14010 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 64  tree *pBtree = d
14020 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
14030 0a 20 20 20 20 69 66 28 20 70 42 74 72 65 65 20  .    if( pBtree 
14040 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  ){.      Pager *
14050 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 73 71  pPager;.      sq
14060 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
14070 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14080 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
14090 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20  .      pPager = 
140a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
140b0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20  r(pBtree);.     
140c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
140d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 64 20 3d  =0 );.      fd =
140e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
140f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
14100 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29   assert( fd!=0 )
14110 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
14120 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
14130 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  E_POINTER ){.   
14140 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66       *(sqlite3_f
14150 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b  ile**)pArg = fd;
14160 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
14170 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
14180 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65  else if( fd->pMe
14190 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
141a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
141b0 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f  ileControl(fd, o
141c0 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20  p, pArg);.      
141d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
141e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
141f0 55 4e 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UND;.      }.   
14200 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
14210 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
14220 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
14230 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
14240 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
14250 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a  rn rc;   .}../*.
14260 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
14270 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
14280 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
14290 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
142a0 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
142b0 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64  nt rc = 0;.#ifnd
142c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
142d0 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61  UILTIN_TEST.  va
142e0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
142f0 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
14300 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
14310 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76     /*.    ** Sav
14320 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  e the current st
14330 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e  ate of the PRNG.
14340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
14350 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
14360 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20  _PRNG_SAVE: {.  
14370 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53      sqlite3PrngS
14380 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  aveState();.    
14390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
143a0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
143b0 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20  store the state 
143c0 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74  of the PRNG to t
143d0 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61  he last state sa
143e0 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  ved using.    **
143f0 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20   PRNG_SAVE.  If 
14400 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65  PRNG_SAVE has ne
14410 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
14420 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  called, then.   
14430 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63   ** this verb ac
14440 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53  ts like PRNG_RES
14450 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ET..    */.    c
14460 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
14470 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
14480 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
14490 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74  3PrngRestoreStat
144a0 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
144b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
144c0 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65      ** Reset the
144d0 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74   PRNG back to it
144e0 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
144f0 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74  state.  The next
14500 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
14510 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
14520 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64  ss() will reseed
14530 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20   the PRNG using 
14540 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20  a single call.  
14550 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e    ** to the xRan
14560 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f  domness method o
14570 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  f the default VF
14580 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  S..    */.    ca
14590 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
145a0 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b  RL_PRNG_RESET: {
145b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
145c0 6e 67 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a  ngResetState();.
145d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
145e0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
145f0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
14600 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54  control(BITVEC_T
14610 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72  EST, size, progr
14620 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  am).    **.    *
14630 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61  * Run a test aga
14640 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62  inst a Bitvec ob
14650 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54  ject of size.  T
14660 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d  he program argum
14670 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e  ent.    ** is an
14680 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
14690 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  rs that defines 
146a0 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72  the test.  Retur
146b0 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a  n -1 on a.    **
146c0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
146d0 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73  on error, 0 on s
146e0 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a  uccess, or non-z
146f0 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72  ero for an error
14700 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65  ..    ** See the
14710 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
14720 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20  iltinTest() for 
14730 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
14740 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
14750 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
14760 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54  ESTCTRL_BITVEC_T
14770 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EST: {.      int
14780 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
14790 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74   int);.      int
147a0 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67   *aProg = va_arg
147b0 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
147c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
147d0 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
147e0 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20  sz, aProg);.    
147f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
14800 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
14810 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
14820 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
14830 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
14840 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
14850 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
14860 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
14870 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
14880 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
14890 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
148a0 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
148b0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
148c0 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
148d0 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
148e0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
148f0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
14900 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
14910 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
14920 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
14930 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
14940 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
14950 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
14960 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
14970 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
14980 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
14990 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
149a0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
149b0 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
149c0 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
149d0 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
149e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
149f0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
14a00 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
14a10 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
14a20 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
14a30 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
14a40 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
14a50 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
14a60 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
14a70 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
14a80 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
14a90 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
14aa0 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
14ab0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
14ac0 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
14ad0 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
14ae0 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
14af0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
14b00 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
14b10 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
14b20 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
14b30 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
14b40 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
14b50 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
14b60 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
14b70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
14b80 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
14b90 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
14ba0 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
14bb0 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
14bc0 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
14bd0 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
14be0 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
14bf0 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  ileterious behav
14c00 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
14c10 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
14c20 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
14c30 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
14c40 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
14c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14c60 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
14c70 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
14c80 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
14c90 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
14ca0 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
14cb0 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
14cc0 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
14cd0 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
14ce0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
14cf0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
14d00 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
14d10 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
14d20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
14d30 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
14d40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
14d50 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
14d60 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
14d70 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
14d80 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
14d90 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
14da0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
14db0 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
14dc0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
14dd0 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
14de0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
14df0 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
14e00 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
14e10 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
14e20 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
14e30 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
14e40 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
14e50 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
14e60 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
14e70 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
14e80 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
14e90 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
14ea0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
14eb0 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
14ec0 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
14ed0 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
14ee0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
14ef0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
14f00 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
14f10 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
14f20 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
14f30 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
14f40 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
14f50 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61  ssert( (x = va_a
14f60 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
14f70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
14f80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14f90 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
14fa0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
14fb0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
14fc0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
14fd0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
14fe0 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
14ff0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
15000 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
15010 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
15020 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
15030 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
15040 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
15050 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
15060 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
15070 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
15080 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
15090 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
150a0 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
150b0 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
150c0 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
150d0 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
150e0 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
150f0 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
15100 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
15110 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
15120 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
15130 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
15140 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
15150 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
15160 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
15170 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
15180 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
15190 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
151a0 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
151b0 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
151c0 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
151d0 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
151e0 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
151f0 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
15200 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
15210 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
15220 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
15230 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
15240 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
15250 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
15260 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
15270 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
15280 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
15290 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
152a0 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
152b0 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
152c0 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
152d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
152e0 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
152f0 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
15300 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
15310 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
15320 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
15330 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
15340 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
15350 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
15360 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
15370 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
15380 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
15390 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
153a0 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
153b0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
153c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
153d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
153e0 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
153f0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
15400 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
15410 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
15420 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
15430 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
15440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
15450 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
15460 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
15470 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
15480 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
15490 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
154a0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
154b0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
154c0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
154d0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
154e0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
154f0 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
15500 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
15510 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
15520 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
15530 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
15540 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
15550 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
15560 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
15570 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
15580 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
15590 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
155a0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
155b0 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
155c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
155d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
155e0 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
155f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
15600 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
15610 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
15620 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
15630 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
15640 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
15650 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
15660 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
15670 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
15680 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
15690 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
156a0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
156b0 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
156c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
156d0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
156e0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
156f0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
15700 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
15710 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
15720 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
15730 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
15740 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
15750 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
15760 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
15770 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
15780 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
15790 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
157a0 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
157b0 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
157c0 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
157d0 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
157e0 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
157f0 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
15800 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
15810 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
15820 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
15830 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
15840 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
15850 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
15860 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
15870 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
15880 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
15890 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
158a0 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
158b0 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
158c0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
158d0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
158e0 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
158f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15900 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
15910 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
15920 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
15930 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  t);.      db->fl
15940 61 67 73 20 3d 20 28 78 20 26 20 53 51 4c 49 54  ags = (x & SQLIT
15950 45 5f 4f 70 74 4d 61 73 6b 29 20 7c 20 28 64 62  E_OptMask) | (db
15960 2d 3e 66 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  ->flags & ~SQLIT
15970 45 5f 4f 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20  E_OptMask);.    
15980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15990 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f  #ifdef SQLITE_N_
159a0 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73  KEYWORD.    /* s
159b0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
159c0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
159d0 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63  TRL_ISKEYWORD, c
159e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
159f0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
15a00 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65  If zWord is a ke
15a10 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64  yword recognized
15a20 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20   by the parser, 
15a30 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
15a40 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
15a50 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69   keywords.  Or i
15a60 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61  f zWord is not a
15a70 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e   keyword, return
15a80 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20   0..    ** .    
15a90 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61  ** This test fea
15aa0 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  ture is only ava
15ab0 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d  ilable in the am
15ac0 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65  algamation since
15ad0 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  .    ** the SQLI
15ae0 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63  TE_N_KEYWORD mac
15af0 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ro is not define
15b00 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69  d in this file i
15b10 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20  f SQLite.    ** 
15b20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73  is built using s
15b30 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66  eparate source f
15b40 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iles..    */.   
15b50 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
15b60 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a  TCTRL_ISKEYWORD:
15b70 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
15b80 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f  har *zWord = va_
15b90 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
15ba0 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ar*);.      int 
15bb0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
15bc0 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20  n30(zWord);.    
15bd0 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b    rc = (sqlite3K
15be0 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29  eywordCode((u8*)
15bf0 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44  zWord, n)!=TK_ID
15c00 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  ) ? SQLITE_N_KEY
15c10 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20  WORD : 0;.      
15c20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
15c30 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c  dif ..    /* sql
15c40 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
15c50 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
15c60 4c 5f 50 47 48 44 52 53 5a 29 0a 20 20 20 20 2a  L_PGHDRSZ).    *
15c70 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  *.    ** Return 
15c80 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 63  the size of a pc
15c90 61 63 68 65 20 68 65 61 64 65 72 20 69 6e 20 62  ache header in b
15ca0 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ytes..    */.   
15cb0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
15cc0 54 43 54 52 4c 5f 50 47 48 44 52 53 5a 3a 20 7b  TCTRL_PGHDRSZ: {
15cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 69 7a 65  .      rc = size
15ce0 6f 66 28 50 67 48 64 72 29 3b 0a 20 20 20 20 20  of(PgHdr);.     
15cf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15d00 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
15d10 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
15d20 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
15d30 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70  CHMALLOC, sz, &p
15d40 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  New, pFree);.   
15d50 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20   **.    ** Pass 
15d60 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74  pFree into sqlit
15d70 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29 2e  e3ScratchFree().
15d80 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30   .    ** If sz>0
15d90 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
15da0 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20   scratch buffer 
15db0 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20  into pNew.  .   
15dc0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
15dd0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
15de0 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  ATCHMALLOC: {.  
15df0 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c      void *pFree,
15e00 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20   **ppNew;.      
15e10 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a  int sz;.      sz
15e20 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
15e30 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20  t);.      ppNew 
15e40 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
15e50 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65  d**);.      pFre
15e60 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
15e70 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28  oid*);.      if(
15e80 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73   sz ) *ppNew = s
15e90 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
15ea0 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73  loc(sz);.      s
15eb0 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
15ec0 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
15ed0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
15ee0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
15ef0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
15f00 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
15f10 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74  LTIME_FAULT, int
15f20 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
15f30 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
15f40 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
15f50 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65  -zero, configure
15f60 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73 6f   the wrappers so
15f70 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a   that all.    **
15f80 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
15f90 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29  s to localtime()
15fa0 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61   and variants fa
15fb0 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
15fc0 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64  zero,.    ** und
15fd0 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a  o this setting..
15fe0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15ff0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
16000 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
16010 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16020 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f  GlobalConfig.bLo
16030 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76  caltimeFault = v
16040 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
16050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16060 20 7d 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64   }..  }.  va_end
16070 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
16080 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
16090 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65  TIN_TEST */.  re
160a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
160b0 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
160c0 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65  ity routine, use
160d0 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65  ful to VFS imple
160e0 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74  mentations, that
160f0 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65   checks.** to se
16100 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  e if a database 
16110 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74  file was a URI t
16120 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20  hat contained a 
16130 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a  specific query .
16140 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e  ** parameter, an
16150 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20  d if so obtains 
16160 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
16170 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
16180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
16190 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
161a0 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70  s the filename p
161b0 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e  ointer passed in
161c0 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a  to the xOpen().*
161d0 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46  * method of a VF
161e0 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
161f0 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72  .  The zParam ar
16200 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
16210 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65  me of the.** que
16220 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20  ry parameter we 
16230 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74  seek.  This rout
16240 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
16250 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61  value of the zPa
16260 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ram.** parameter
16270 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
16280 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
16290 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
162a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
162b0 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20   returns a NULL 
162c0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
162d0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
162e0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f  uri_parameter(co
162f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
16300 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
16310 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 7a 46 69 6c  *zParam){.  zFil
16320 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
16330 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
16340 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  me) + 1;.  while
16350 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ( zFilename[0] )
16360 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74  {.    int x = st
16370 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
16380 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69  zParam);.    zFi
16390 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
163a0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
163b0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66  ame) + 1;.    if
163c0 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( x==0 ) return 
163d0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a  zFilename;.    z
163e0 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
163f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
16400 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a  ename) + 1;.  }.
16410 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a          return 0;.}.