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

Artifact 61e6886a0606b46fc4b38c2d8585ef55afcf9662:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 34 38 32  ATION-OF: R-5482
06a0: 33 2d 34 31 33 34 33 20 54 68 65 20 73 71 6c 69  3-41343 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 6d 75 74  was compiled mut
0700: 65 78 69 6e 67 20 63 6f 64 65 20 6f 6d 69 74 74  exing code omitt
0710: 65 64 20 64 75 65 20 74 6f 0a 2a 2a 20 74 68 65  ed due to.** the
0720: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
0730: 46 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  FE compile-time 
0740: 6f 70 74 69 6f 6e 20 62 65 69 6e 67 20 73 65 74  option being set
0750: 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
0760: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0770: 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53  (void){ return S
0780: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
0790: 3b 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ; }..#if !define
07a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
07b0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
07c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
07d0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
07e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
07f0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0800: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0810: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0820: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0830: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0840: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0850: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0860: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0870: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0880: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0890: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
08a0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
08b0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  ivity only..*/.v
08c0: 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54  oid (*sqlite3IoT
08d0: 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72  race)(const char
08e0: 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e  *, ...) = 0;.#en
08f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
0900: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
0910: 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  al variable poin
0920: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77  ts to a string w
0930: 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e  hich is the.** n
0940: 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
0950: 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69  ry, then that di
0960: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
0970: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
0980: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
0990: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
09a0: 20 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d   the "PRAGMA tem
09b0: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
09c0: 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a  y" SQL command..
09d0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
09e0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
09f0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  = 0;../*.** Init
0a00: 69 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20  ialize SQLite.  
0a10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0a20: 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
0a30: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
0a40: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0a50: 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20  cation,.** VFS, 
0a60: 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
0a70: 74 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f  tems prior to do
0a80: 69 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20  ing any serious 
0a90: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c  work with.** SQL
0aa0: 69 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e  ite.  But as lon
0ab0: 67 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20  g as you do not 
0ac0: 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c  compile with SQL
0ad0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
0ae0: 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  T.** this routin
0af0: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
0b00: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
0b10: 79 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73  y key routines s
0b20: 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65  uch as.** sqlite
0b30: 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a  3_open().  .**.*
0b40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0b50: 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74  s a no-op except
0b60: 20 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72   on its very fir
0b70: 73 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20  st call for the 
0b80: 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66  process,.** or f
0b90: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  or the first cal
0ba0: 6c 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  l after a call t
0bb0: 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  o sqlite3_shutdo
0bc0: 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  wn..**.** The fi
0bd0: 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61  rst thread to ca
0be0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
0bf0: 72 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c  runs the initial
0c00: 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f  ization to.** co
0c10: 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75  mpletion.  If su
0c20: 62 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73  bsequent threads
0c30: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
0c40: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ne before the fi
0c50: 72 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61  rst.** thread ha
0c60: 73 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69  s finished the i
0c70: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
0c80: 6f 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20  ocess, then the 
0c90: 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68  subsequent.** th
0ca0: 72 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b  reads must block
0cb0: 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
0cc0: 20 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73   thread finishes
0cd0: 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
0ce0: 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  lization..**.** 
0cf0: 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  The first thread
0d00: 20 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73   might call this
0d10: 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69   routine recursi
0d20: 76 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65  vely.  Recursive
0d30: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  .** calls to thi
0d40: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
0d50: 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63   not block, of c
0d60: 6f 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73  ourse.  Otherwis
0d70: 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
0d80: 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20  ization process 
0d90: 77 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70  would never comp
0da0: 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20  lete..**.** Let 
0db0: 58 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74  X be the first t
0dc0: 68 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74  hread to enter t
0dd0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65  his routine.  Le
0de0: 74 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65  t Y be some othe
0df0: 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68  r.** thread.  Th
0e00: 65 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69  en while the ini
0e10: 74 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tial invocation 
0e20: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
0e30: 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d  by X is.** incom
0e40: 70 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71  plete, it is req
0e50: 75 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a  uired that:.**.*
0e60: 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f  *    *  Calls to
0e70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
0e80: 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20  om Y must block 
0e90: 75 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d  until the outer-
0ea0: 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61  most.**       ca
0eb0: 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65  ll by X complete
0ec0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52  s..**.**    *  R
0ed0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
0ee0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  o this routine f
0ef0: 72 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74  rom thread X ret
0f00: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
0f10: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74  **       without
0f20: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e   blocking..*/.in
0f30: 74 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  t sqlite3_initia
0f40: 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55  lize(void){.  MU
0f50: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
0f60: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
0f70: 72 3b 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68  r; )       /* Th
0f80: 65 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75  e main static mu
0f90: 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  tex */.  int rc;
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
0fd0: 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
0fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
0ff0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
1000: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
1010: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1020: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1030: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1040: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c  dif..  /* If SQL
1050: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 63  ite is already c
1060: 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61  ompletely initia
1070: 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73  lized, then this
1080: 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71   call.  ** to sq
1090: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
10a0: 28 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e  () should be a n
10b0: 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69  o-op.  But the i
10c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
10d0: 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c  ** must be compl
10e0: 65 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20  ete.  So isInit 
10f0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20  must not be set 
1100: 75 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20 65  until the very e
1110: 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  nd.  ** of this 
1120: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
1130: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1140: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
1150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1160: 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  K;..  /* Make su
1170: 72 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  re the mutex sub
1180: 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61  system is initia
1190: 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c  lized.  If unabl
11a0: 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69  e to .  ** initi
11b0: 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20  alize the mutex 
11c0: 73 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72  subsystem, retur
11d0: 6e 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65  n early with the
11e0: 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20   error..  ** If 
11f0: 74 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f  the system is so
1200: 20 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72   sick that we ar
1210: 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  e unable to allo
1220: 63 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20  cate a mutex,.  
1230: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  ** there is not 
1240: 6d 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67  much SQLite is g
1250: 6f 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20  oing to be able 
1260: 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  to do..  **.  **
1270: 20 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   The mutex subsy
1280: 73 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63  stem must take c
1290: 61 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69  are of serializi
12a0: 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20  ng its own.  ** 
12b0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
12c0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
12d0: 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a  te3MutexInit();.
12e0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12f0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  n rc;..  /* Init
1300: 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f  ialize the mallo
1310: 63 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74  c() system and t
1320: 68 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e  he recursive pIn
1330: 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20  itMutex mutex.. 
1340: 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69   ** This operati
1350: 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  on is protected 
1360: 62 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41  by the STATIC_MA
1370: 53 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74  STER mutex.  Not
1380: 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65  e that.  ** Mute
1390: 78 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c  xAlloc() is call
13a0: 65 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20  ed for a static 
13b0: 6d 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69  mutex prior to i
13c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a  nitializing the.
13d0: 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73    ** malloc subs
13e0: 79 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70  ystem - this imp
13f0: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c  lies that the al
1400: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74  location of a st
1410: 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20  atic.  ** mutex 
1420: 6d 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65  must not require
1430: 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68   support from th
1440: 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  e malloc subsyst
1450: 65 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58  em..  */.  MUTEX
1460: 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
1470: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
1480: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1490: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
14a0: 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
14b0: 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
14c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  );.  sqlite3Glob
14d0: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78  alConfig.isMutex
14e0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20  Init = 1;.  if( 
14f0: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1500: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1510: 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
1520: 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28  lite3MallocInit(
1530: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1540: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1550: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1560: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
1570: 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  it = 1;.    if( 
1580: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1590: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
15a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
15c0: 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20  itMutex =.      
15d0: 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65       sqlite3Mute
15e0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15f0: 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
1600: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1610: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
1620: 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c  oreMutex && !sql
1630: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1640: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
1650: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1660: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1670: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
1680: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1690: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
16a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49  obalConfig.nRefI
16b0: 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a  nitMutex++;.  }.
16c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16d0: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
16e0: 0a 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e  .  /* If rc is n
16f0: 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20  ot SQLITE_OK at 
1700: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
1710: 20 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c   either the mall
1720: 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65  oc.  ** subsyste
1730: 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69  m could not be i
1740: 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68  nitialized or th
1750: 65 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20  e system failed 
1760: 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  to allocate.  **
1770: 20 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20   the pInitMutex 
1780: 6d 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e  mutex. Return an
1790: 20 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72   error in either
17a0: 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28   case.  */.  if(
17b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
17d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68  .  }..  /* Do th
17e0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e  e rest of the in
17f0: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64  itialization und
1800: 65 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  er the recursive
1810: 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74   mutex so.  ** t
1820: 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61  hat we will be a
1830: 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65  ble to handle re
1840: 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e  cursive calls in
1850: 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  to.  ** sqlite3_
1860: 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54  initialize().  T
1870: 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  he recursive cal
1880: 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65  ls normally come
1890: 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71   through.  ** sq
18a0: 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20  lite3_os_init() 
18b0: 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20  when it invokes 
18c0: 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
18d0: 73 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65  ster(), but othe
18e0: 72 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65  r.  ** recursive
18f0: 20 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73   calls might als
1900: 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  o be possible.. 
1910: 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45   **.  ** IMPLEME
1920: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30  NTATION-OF: R-00
1930: 31 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65  140-37445 SQLite
1940: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73   automatically s
1950: 65 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a  erializes calls.
1960: 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69    ** to the xIni
1970: 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65  t method, so the
1980: 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65   xInit method ne
1990: 65 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64  ed not be thread
19a0: 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  safe..  **.  ** 
19b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75  The following mu
19c0: 74 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69  tex is what seri
19d0: 61 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f  alizes access to
19e0: 20 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63   the appdef pcac
19f0: 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65  he xInit.  ** me
1a00: 74 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69  thods.  The sqli
1a10: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
1a20: 64 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69  ds.xInit() all i
1a30: 73 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68  s embedded in th
1a40: 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  e.  ** call to s
1a50: 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74  qlite3PcacheInit
1a60: 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20  ialize()..  */. 
1a70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a80: 6e 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62  nter(sqlite3Glob
1a90: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1aa0: 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tex);.  if( sqli
1ab0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ac0: 69 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c  isInit==0 && sql
1ad0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ae0: 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29  .inProgress==0 )
1af0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73  {.    FuncDefHas
1b00: 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42  h *pHash = &GLOB
1b10: 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20  AL(FuncDefHash, 
1b20: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
1b30: 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c  ctions);.    sql
1b40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1b50: 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b  .inProgress = 1;
1b60: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73  .    memset(pHas
1b70: 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c  h, 0, sizeof(sql
1b80: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
1b90: 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ons));.    sqlit
1ba0: 65 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c  e3RegisterGlobal
1bb0: 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20  Functions();.   
1bc0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1bd0: 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68  alConfig.isPCach
1be0: 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eInit==0 ){.    
1bf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
1c00: 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29  acheInitialize()
1c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1c40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
1c50: 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  cheInit = 1;.   
1c60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c70: 73 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20  sInit();.    }. 
1c80: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1ca0: 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65  lite3PCacheBuffe
1cb0: 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47  rSetup( sqlite3G
1cc0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67  lobalConfig.pPag
1cd0: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  e, .          sq
1ce0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1cf0: 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65  g.szPage, sqlite
1d00: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
1d10: 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  age);.      sqli
1d20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d30: 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  isInit = 1;.    
1d40: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  }.    sqlite3Glo
1d50: 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67  balConfig.inProg
1d60: 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ress = 0;.  }.  
1d70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1d80: 61 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ave(sqlite3Globa
1d90: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1da0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61  ex);..  /* Go ba
1db0: 63 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61  ck under the sta
1dc0: 74 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c  tic mutex and cl
1dd0: 65 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72  ean up the recur
1de0: 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20  sive.  ** mutex 
1df0: 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73  to prevent a res
1e00: 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f  ource leak..  */
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1e20: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1e30: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1e40: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1e50: 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71  utex--;.  if( sq
1e60: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e70: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c  g.nRefInitMutex<
1e80: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1e90: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1ea0: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
1eb0: 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
1ec0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
1ed0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
1ee0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
1ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
1f00: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1f10: 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  utex = 0;.  }.  
1f20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1f30: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20  ave(pMaster);.. 
1f40: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1f50: 67 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69  g is just a sani
1f60: 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ty check to make
1f70: 20 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73   sure SQLite has
1f80: 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69  .  ** been compi
1f90: 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  led correctly.  
1fa0: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
1fb0: 74 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  to run this code
1fc0: 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f  , but.  ** we do
1fd0: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20  n't want to run 
1fe0: 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64  it too often and
1ff0: 20 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63   soak up CPU cyc
2000: 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20  les for no.  ** 
2010: 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72  reason.  So we r
2020: 75 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e  un it once durin
2030: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
2040: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
2050: 44 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51  DEBUG.#ifndef SQ
2060: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
2070: 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68  NG_POINT.  /* Th
2080: 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f  is section of co
2090: 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75  de's only "outpu
20a0: 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74  t" is via assert
20b0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a  () statements. *
20c0: 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c  /.  if ( rc==SQL
20d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36  ITE_OK ){.    u6
20e0: 34 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c  4 x = (((u64)1)<
20f0: 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62  <63)-1;.    doub
2100: 6c 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74  le y;.    assert
2110: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a  (sizeof(x)==8);.
2120: 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f      assert(sizeo
2130: 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29  f(x)==sizeof(y))
2140: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c  ;.    memcpy(&y,
2150: 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73   &x, 8);.    ass
2160: 65 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61  ert( sqlite3IsNa
2170: 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  N(y) );.  }.#end
2180: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  if.#endif..  /* 
2190: 44 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c  Do extra initial
21a0: 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65  ization steps re
21b0: 71 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53  quested by the S
21c0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
21d0: 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69  .  ** compile-ti
21e0: 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  me option..  */.
21f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2200: 54 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 72  TRA_INIT.  if( r
2210: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2220: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2230: 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20  fig.isInit ){.  
2240: 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54    int SQLITE_EXT
2250: 52 41 5f 49 4e 49 54 28 76 6f 69 64 29 3b 0a 20  RA_INIT(void);. 
2260: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
2270: 58 54 52 41 5f 49 4e 49 54 28 29 3b 0a 20 20 7d  XTRA_INIT();.  }
2280: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2290: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
22a0: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
22b0: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
22c0: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
22d0: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
22e0: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
22f0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
2300: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2310: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
2320: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
2330: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2340: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2350: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2360: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
2370: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
2380: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
2390: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
23a0: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
23b0: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
23c0: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
23d0: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
23e0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
23f0: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
2400: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2410: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
2420: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2430: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2440: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2450: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2460: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2470: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2480: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2490: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
24a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
24b0: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
24c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
24d0: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
24e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
24f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2500: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2510: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2520: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2530: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2540: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2550: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2560: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2570: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2580: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2590: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
25a0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
25b0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
25c0: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
25d0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
25e0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
25f0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2600: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2610: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2620: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2630: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2640: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2650: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2660: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2670: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2680: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2690: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
26a0: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
26b0: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
26c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26d0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
26e0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
26f0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2700: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2710: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2720: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2730: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2740: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2750: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2760: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2770: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2780: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2790: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
27a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
27b0: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
27c0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
27d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
27e0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
27f0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2800: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2810: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2820: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2830: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2840: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2850: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
2860: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2870: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
2880: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
2890: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
28a0: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
28b0: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
28c0: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
28d0: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
28e0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
28f0: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
2900: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
2910: 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66   .    */.#if def
2920: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45  ined(SQLITE_THRE
2930: 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54  ADSAFE) && SQLIT
2940: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20  E_THREADSAFE>0. 
2950: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2960: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
2970: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2980: 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  isable all mutex
2990: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
29a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
29b0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b  .bCoreMutex = 0;
29c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
29d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
29e0: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
29f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2a00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2a10: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
2a20: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2a30: 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66  able mutexing of
2a40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2a50: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f  tions */.      /
2a60: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e  * Enable mutexin
2a70: 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73  g of core data s
2a80: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
2a90: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2aa0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2ab0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2ac0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2ad0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
2ae0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2af0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2b00: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41  ITE_CONFIG_SERIA
2b10: 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f  LIZED: {.      /
2b20: 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74  * Enable all mut
2b30: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
2b40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2b50: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
2b60: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
2b70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
2b80: 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  llMutex = 1;.   
2b90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2ba0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2bb0: 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a  CONFIG_MUTEX: {.
2bc0: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79        /* Specify
2bd0: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
2be0: 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61  mutex implementa
2bf0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
2c00: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2c10: 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72  g.mutex = *va_ar
2c20: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
2c30: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  tex_methods*);. 
2c40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c50: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2c60: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
2c70: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
2c80: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
2c90: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
2ca0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
2cb0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
2cc0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
2cd0: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
2ce0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
2cf0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2d00: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20     }.#endif...  
2d10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2d20: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
2d30: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
2d40: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
2d50: 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61  alloc implementa
2d60: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
2d70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2d80: 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  g.m = *va_arg(ap
2d90: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
2da0: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
2db0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2dc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2dd0: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a  IG_GETMALLOC: {.
2de0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
2df0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  e the current ma
2e00: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
2e10: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
2e20: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2e30: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
2e40: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d  ==0 ) sqlite3Mem
2e50: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
2e60: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
2e70: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
2e80: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
2e90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lobalConfig.m;. 
2ea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2eb0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2ec0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
2ed0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  US: {.      /* E
2ee0: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
2ef0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74   the malloc stat
2f00: 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f  us collection */
2f10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2f20: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
2f30: 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tat = va_arg(ap,
2f40: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
2f50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2f60: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
2f70: 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20  _SCRATCH: {.    
2f80: 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61    /* Designate a
2f90: 20 62 75 66 66 65 72 20 66 6f 72 20 73 63 72 61   buffer for scra
2fa0: 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  tch memory space
2fb0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2fc0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
2fd0: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
2fe0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
2ff0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3000: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20  onfig.szScratch 
3010: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3030: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
3040: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3050: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3060: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3070: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3080: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3090: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
30a0: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
30b0: 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72  page cache memor
30c0: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
30d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
30e0: 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f  nfig.pPage = va_
30f0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
3100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3110: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
3120: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3130: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3140: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
3150: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3160: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3170: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3180: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3190: 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  G_PCACHE: {.    
31a0: 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20    /* Specify an 
31b0: 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
31c0: 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74   cache implement
31d0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
31e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
31f0: 69 67 2e 70 63 61 63 68 65 20 3d 20 2a 76 61 5f  ig.pcache = *va_
3200: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3210: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2a 29  pcache_methods*)
3220: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3230: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
3240: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3250: 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  PCACHE: {.      
3260: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3270: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 2e 78  lConfig.pcache.x
3280: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
3290: 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65     sqlite3PCache
32a0: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
32b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f      }.      *va_
32c0: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
32d0: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2a 29  pcache_methods*)
32e0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
32f0: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 3b 0a 20  Config.pcache;. 
3300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3310: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
3320: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
3330: 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SYS3) || defined
3340: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
3350: 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73 65  EMSYS5).    case
3360: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
3370: 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAP: {.      /* 
3380: 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66 66  Designate a buff
3390: 65 72 20 66 6f 72 20 68 65 61 70 20 6d 65 6d 6f  er for heap memo
33a0: 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ry space */.    
33b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33c0: 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76 61  onfig.pHeap = va
33d0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
33e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
33f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70  obalConfig.nHeap
3400: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3410: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3420: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3430: 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Req = va_arg(ap,
3440: 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69 66   int);..      if
3450: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3460: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29 7b  onfig.mnReq<1 ){
3470: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3480: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
3490: 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  eq = 1;.      }e
34a0: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47  lse if( sqlite3G
34b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
34c0: 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20 20  q>(1<<12) ){.   
34d0: 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e 20       /* cap min 
34e0: 72 65 71 75 65 73 74 20 73 69 7a 65 20 61 74 20  request size at 
34f0: 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  2^12 */.        
3500: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3510: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c 3c  fig.mnReq = (1<<
3520: 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  12);.      }..  
3530: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
3540: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61  lobalConfig.pHea
3550: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
3560: 2f 2a 20 49 66 20 74 68 65 20 68 65 61 70 20 70  /* If the heap p
3570: 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20  ointer is NULL, 
3580: 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
3590: 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e   malloc implemen
35a0: 74 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  tation.        *
35b0: 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c 20 70  * back to NULL p
35c0: 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20 54 68  ointers too.  Th
35d0: 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
35e0: 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a 20  e malloc to go. 
35f0: 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74         ** back t
3600: 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20 69 6d  o its default im
3610: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65  plementation whe
3620: 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  n sqlite3_initia
3630: 6c 69 7a 65 28 29 20 69 73 0a 20 20 20 20 20 20  lize() is.      
3640: 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20 20 20    ** run..      
3650: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d    */.        mem
3660: 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62  set(&sqlite3Glob
3670: 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73  alConfig.m, 0, s
3680: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f  izeof(sqlite3Glo
3690: 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20  balConfig.m));. 
36a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36b0: 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20      /* The heap 
36c0: 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e  pointer is not N
36d0: 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74 61 6c  ULL, then instal
36e0: 6c 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20 20  l one of the.   
36f0: 20 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f 6d       ** mem5.c/m
3700: 65 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e 20 49  em3.c methods. I
3710: 66 20 6e 65 69 74 68 65 72 20 45 4e 41 42 4c 45  f neither ENABLE
3720: 5f 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20 20 20  _MEMSYS3 nor.   
3730: 20 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45 5f 4d       ** ENABLE_M
3740: 45 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e 65  EMSYS5 is define
3750: 64 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  d, return an err
3760: 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  or..        */.#
3770: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3780: 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20  BLE_MEMSYS3.    
3790: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
37a0: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c  lConfig.m = *sql
37b0: 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73  ite3MemGetMemsys
37c0: 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  3();.#endif.#ifd
37d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
37e0: 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20  _MEMSYS5.       
37f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3800: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
3810: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29  3MemGetMemsys5()
3820: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
3830: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3840: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
3850: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3860: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
3870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3880: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
3890: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
38a0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
38b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
38c0: 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  ig.nLookaside = 
38d0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
38e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
38f0: 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20    }.    .    /* 
3900: 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  Record a pointer
3910: 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66   to the logger f
3920: 75 6e 63 63 74 69 6f 6e 20 61 6e 64 20 69 74 73  uncction and its
3930: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3940: 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61  .    ** The defa
3950: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f  ult is NULL.  Lo
3960: 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65  gging is disable
3970: 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  d if the functio
3980: 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20  n pointer is.   
3990: 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f   ** NULL..    */
39a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
39b0: 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20  _CONFIG_LOG: {. 
39c0: 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20       /* MSVC is 
39d0: 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c  picky about pull
39e0: 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72  ing func ptrs fr
39f0: 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20  om va lists..   
3a00: 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70     ** http://sup
3a10: 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63  port.microsoft.c
3a20: 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20  om/kb/47961.    
3a30: 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62    ** sqlite3Glob
3a40: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
3a50: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28  va_arg(ap, void(
3a60: 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  *)(void*,int,con
3a70: 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
3a80: 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
3a90: 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43  ef void(*LOGFUNC
3aa0: 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  _t)(void*,int,co
3ab0: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
3ac0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3ad0: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
3ae0: 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f  arg(ap, LOGFUNC_
3af0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3b00: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c  3GlobalConfig.pL
3b10: 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61  ogArg = va_arg(a
3b20: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
3b30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3b40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3b50: 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20  ONFIG_URI: {.   
3b60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3b70: 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 20  Config.bOpenUri 
3b80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3b90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3ba0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75      }..    defau
3bb0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
3bc0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
3bd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3be0: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
3bf0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
3c00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
3c10: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62   the lookaside b
3c20: 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61 74  uffers for a dat
3c30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3c40: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
3c50: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
3c60: 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73  .  .** If lookas
3c70: 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ide is already a
3c80: 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51  ctive, return SQ
3c90: 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a  LITE_BUSY..**.**
3ca0: 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65   The sz paramete
3cb0: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
3cc0: 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63 68  of bytes in each
3cd0: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e   lookaside slot.
3ce0: 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61  .** The cnt para
3cf0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
3d00: 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49  ber of slots.  I
3d10: 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c  f pStart is NULL
3d20: 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f   the.** space fo
3d30: 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  r the lookaside 
3d40: 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e  memory is obtain
3d50: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
3d60: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20  malloc()..** If 
3d70: 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55  pStart is not NU
3d80: 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a  LL then it is sz
3d90: 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65  *cnt bytes of me
3da0: 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a  mory to use for.
3db0: 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  ** the lookaside
3dc0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
3dd0: 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b  ic int setupLook
3de0: 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64  aside(sqlite3 *d
3df0: 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  b, void *pBuf, i
3e00: 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b  nt sz, int cnt){
3e10: 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b  .  void *pStart;
3e20: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
3e30: 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20  side.nOut ){.   
3e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
3e50: 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72  USY;.  }.  /* Fr
3e60: 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ee any existing 
3e70: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
3e80: 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65   for this handle
3e90: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c   before.  ** all
3ea0: 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e  ocating a new on
3eb0: 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61  e so we don't ha
3ec0: 76 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65  ve to have space
3ed0: 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20   for .  ** both 
3ee0: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
3ef0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
3f00: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
3f10: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
3f20: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
3f30: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
3f40: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a    }.  /* The siz
3f50: 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65  e of a lookaside
3f60: 20 73 6c 6f 74 20 6e 65 65 64 73 20 74 6f 20 62   slot needs to b
3f70: 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 20  e larger than a 
3f80: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 74 6f 20  pointer.  ** to 
3f90: 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a  be useful..  */.
3fa0: 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73    if( sz<=(int)s
3fb0: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
3fc0: 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a  lot*) ) sz = 0;.
3fd0: 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e    if( cnt<0 ) cn
3fe0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d  t = 0;.  if( sz=
3ff0: 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a  =0 || cnt==0 ){.
4000: 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20      sz = 0;.    
4010: 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65  pStart = 0;.  }e
4020: 6c 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20  lse if( pBuf==0 
4030: 29 7b 0a 20 20 20 20 73 7a 20 3d 20 52 4f 55 4e  ){.    sz = ROUN
4040: 44 44 4f 57 4e 38 28 73 7a 29 3b 20 2f 2a 20 49  DDOWN8(sz); /* I
4050: 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38  MP: R-33038-0938
4060: 32 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  2 */.    sqlite3
4070: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
4080: 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20  c();.    pStart 
4090: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
40a0: 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49   sz*cnt );  /* I
40b0: 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37 32  MP: R-61949-3572
40c0: 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  7 */.    sqlite3
40d0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
40e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
40f0: 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  sz = ROUNDDOWN8(
4100: 73 7a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  sz); /* IMP: R-3
4110: 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20  3038-09382 */.  
4120: 20 20 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b    pStart = pBuf;
4130: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .  }.  db->looka
4140: 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53  side.pStart = pS
4150: 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b  tart;.  db->look
4160: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b  aside.pFree = 0;
4170: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4180: 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20  .sz = (u16)sz;. 
4190: 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
41a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f     int i;.    Lo
41b0: 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a  okasideSlot *p;.
41c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e      assert( sz >
41d0: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f   (int)sizeof(Loo
41e0: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a  kasideSlot*) );.
41f0: 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69      p = (Lookasi
4200: 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a  deSlot*)pStart;.
4210: 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b      for(i=cnt-1;
4220: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
4230: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62     p->pNext = db
4240: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
4250: 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f  e;.      db->loo
4260: 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70  kaside.pFree = p
4270: 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f  ;.      p = (Loo
4280: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75  kasideSlot*)&((u
4290: 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d  8*)p)[sz];.    }
42a0: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
42b0: 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20  de.pEnd = p;.   
42c0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
42d0: 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20  Enabled = 1;.   
42e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
42f0: 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d  Malloced = pBuf=
4300: 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65  =0 ?1:0;.  }else
4310: 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  {.    db->lookas
4320: 69 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20  ide.pEnd = 0;.  
4330: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4340: 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20  bEnabled = 0;.  
4350: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4360: 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20  bMalloced = 0;. 
4370: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4380: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4390: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
43a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
43b0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
43c0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
43d0: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
43e0: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
43f0: 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
4400: 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a  n db->mutex;.}..
4410: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  /*.** Configurat
4420: 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72  ion settings for
4430: 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64   an individual d
4440: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
4450: 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  on.*/.int sqlite
4460: 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69  3_db_config(sqli
4470: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c  te3 *db, int op,
4480: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
4490: 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   ap;.  int rc;. 
44a0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
44b0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
44c0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
44d0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b  TE_DBCONFIG_LOOK
44e0: 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76  ASIDE: {.      v
44f0: 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61  oid *pBuf = va_a
4500: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f  rg(ap, void*); /
4510: 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31  * IMP: R-26835-1
4520: 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  0964 */.      in
4530: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
4540: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a  , int);       /*
4550: 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35   IMP: R-47871-25
4560: 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  994 */.      int
4570: 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70   cnt = va_arg(ap
4580: 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20  , int);      /* 
4590: 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33  IMP: R-04460-533
45a0: 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  86 */.      rc =
45b0: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
45c0: 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e  db, pBuf, sz, cn
45d0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
45e0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
45f0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74  lt: {.      stat
4600: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
4610: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70  {.        int op
4620: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ;      /* The op
4630: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  code */.        
4640: 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20  u32 mask;    /* 
4650: 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20  Mask of the bit 
4660: 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73  in sqlite3.flags
4670: 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f   to set/clear */
4680: 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70  .      } aFlagOp
4690: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b  [] = {.        {
46a0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
46b0: 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20  _ENABLE_FKEY,   
46c0: 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b   SQLITE_ForeignK
46d0: 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  eys    },.      
46e0: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
46f0: 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47  FIG_ENABLE_TRIGG
4700: 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  ER, SQLITE_Enabl
4710: 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20  eTrigger  },.   
4720: 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69     };.      unsi
4730: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20  gned int i;.    
4740: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
4750: 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34  ROR; /* IMP: R-4
4760: 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20  2790-23372 */.  
4770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
4780: 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70  rraySize(aFlagOp
4790: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
47a0: 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e   if( aFlagOp[i].
47b0: 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20  op==op ){.      
47c0: 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20      int onoff = 
47d0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
47e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a  .          int *
47f0: 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70  pRes = va_arg(ap
4800: 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20  , int*);.       
4810: 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20     int oldFlags 
4820: 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  = db->flags;.   
4830: 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66         if( onoff
4840: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
4850: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61    db->flags |= a
4860: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a  FlagOp[i].mask;.
4870: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
4880: 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a  if( onoff==0 ){.
4890: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
48a0: 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f  flags &= ~aFlagO
48b0: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
48c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
48d0: 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64   if( oldFlags!=d
48e0: 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  b->flags ){.    
48f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4900: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
4910: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
4920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4930: 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20     if( pRes ){. 
4940: 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
4950: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
4960: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29  aFlagOp[i].mask)
4970: 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  !=0;.          }
4980: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
4990: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
49a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
49b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
49c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
49d0: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
49e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
49f0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
4a00: 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75 66   true if the buf
4a10: 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f  fer z[0..n-1] co
4a20: 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65  ntains all space
4a30: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
4a40: 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74   allSpaces(const
4a50: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
4a60: 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  {.  while( n>0 &
4a70: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b  & z[n-1]==' ' ){
4a80: 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e   n--; }.  return
4a90: 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   n==0;.}../*.** 
4aa0: 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
4ab0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ult collating fu
4ac0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49  nction named "BI
4ad0: 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20 61  NARY" which is a
4ae0: 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62  lways.** availab
4af0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
4b00: 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e   padFlag argumen
4b10: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
4b20: 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e 67  en space padding
4b30: 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f   at the end.** o
4b40: 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e  f strings is ign
4b50: 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c  ored.  This impl
4b60: 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d  ements the RTRIM
4b70: 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   collation..*/.s
4b80: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c  tatic int binCol
4b90: 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70  lFunc(.  void *p
4ba0: 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b  adFlag,.  int nK
4bb0: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
4bc0: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
4bd0: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
4be0: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
4bf0: 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65  rc, n;.  n = nKe
4c00: 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31  y1<nKey2 ? nKey1
4c10: 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d   : nKey2;.  rc =
4c20: 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
4c30: 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
4c40: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
4c50: 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26   padFlag.     &&
4c60: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
4c70: 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65  r*)pKey1)+n, nKe
4c80: 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c  y1-n).     && al
4c90: 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29  lSpaces(((char*)
4ca0: 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d  pKey2)+n, nKey2-
4cb0: 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  n).    ){.      
4cc0: 2f 2a 20 4c 65 61 76 65 20 72 63 20 75 6e 63 68  /* Leave rc unch
4cd0: 61 6e 67 65 64 20 61 74 20 30 20 2a 2f 0a 20 20  anged at 0 */.  
4ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
4cf0: 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79  c = nKey1 - nKey
4d00: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  2;.    }.  }.  r
4d10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4d20: 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74  ** Another built
4d30: 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  -in collating se
4d40: 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20  quence: NOCASE. 
4d50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c  .**.** This coll
4d60: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
4d70: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
4d80: 20 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20   used for "case 
4d90: 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20 63  independant.** c
4da0: 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69  omparison". SQLi
4db0: 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f  te's knowledge o
4dc0: 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65  f upper and lowe
4dd0: 72 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e  r case equivalen
4de0: 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e  ts.** extends on
4df0: 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61  ly to the 26 cha
4e00: 72 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20  racters used in 
4e10: 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  the English lang
4e20: 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74  uage..**.** At t
4e30: 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20  he moment there 
4e40: 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20  is only a UTF-8 
4e50: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
4e60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
4e70: 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
4e80: 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  c(.  void *NotUs
4e90: 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ed,.  int nKey1,
4ea0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
4eb0: 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
4ec0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
4ed0: 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20  y2.){.  int r = 
4ee0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
4ef0: 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68  .      (const ch
4f00: 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e  ar *)pKey1, (con
4f10: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c  st char *)pKey2,
4f20: 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e   (nKey1<nKey2)?n
4f30: 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55  Key1:nKey2);.  U
4f40: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
4f50: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
4f60: 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20  0==r ){.    r = 
4f70: 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d  nKey1-nKey2;.  }
4f80: 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a  .  return r;.}..
4f90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4fa0: 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f   ROWID of the mo
4fb0: 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74  st recent insert
4fc0: 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34  .*/.sqlite_int64
4fd0: 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e   sqlite3_last_in
4fe0: 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74  sert_rowid(sqlit
4ff0: 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
5000: 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  n db->lastRowid;
5010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5020: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
5030: 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f  hanges in the mo
5040: 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
5050: 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  o sqlite3_exec()
5060: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5070: 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  _changes(sqlite3
5080: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
5090: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
50a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
50b0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
50c0: 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  es since the dat
50d0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
50e0: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20   opened..*/.int 
50f0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
5100: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
5110: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
5120: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d  >nTotalChange;.}
5130: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
5140: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
5150: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
5160: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
5170: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  s fields of the.
5180: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
5190: 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f  le object, it do
51a0: 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79  es not close any
51b0: 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
51c0: 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20   may be open.** 
51d0: 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61  at the b-tree/pa
51e0: 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  ger level..*/.vo
51f0: 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  id sqlite3CloseS
5200: 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65  avepoints(sqlite
5210: 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28  3 *db){.  while(
5220: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
5230: 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74  ){.    Savepoint
5240: 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61   *pTmp = db->pSa
5250: 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d  vepoint;.    db-
5260: 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
5270: 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  mp->pNext;.    s
5280: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5290: 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62   pTmp);.  }.  db
52a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
52b0: 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  ;.  db->nStateme
52c0: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73  nt = 0;.  db->is
52d0: 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
52e0: 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint = 0;.}../*.
52f0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65  ** Invoke the de
5300: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
5310: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
5320: 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20  h FuncDef p, if 
5330: 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20  any. Except,.** 
5340: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  if this is not t
5350: 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20  he last copy of 
5360: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f  the function, do
5370: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20   not invoke it. 
5380: 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69  Multiple.** copi
5390: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66  es of a single f
53a0: 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61  unction are crea
53b0: 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f  ted when create_
53c0: 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61  function() is ca
53d0: 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c  lled.** with SQL
53e0: 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65  ITE_ANY as the e
53f0: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
5400: 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e  ic void function
5410: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
5420: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29  *db, FuncDef *p)
5430: 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  {.  FuncDestruct
5440: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20  or *pDestructor 
5450: 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72  = p->pDestructor
5460: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ;.  if( pDestruc
5470: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
5480: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  ructor->nRef--;.
5490: 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63      if( pDestruc
54a0: 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  tor->nRef==0 ){.
54b0: 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f        pDestructo
54c0: 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73  r->xDestroy(pDes
54d0: 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61  tructor->pUserDa
54e0: 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
54f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
5500: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
5510: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
5520: 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ose an existing 
5530: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a  SQLite database.
5540: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
5550: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
5560: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
5570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5580: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
5590: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
55a0: 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66 28 20 21   int j;..  if( !
55b0: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
55c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
55d0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
55e0: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
55f0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
5600: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
5610: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
5620: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
5630: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  r(db->mutex);.. 
5640: 20 2f 2a 20 46 6f 72 63 65 20 78 44 65 73 74 72   /* Force xDestr
5650: 6f 79 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20  oy calls on all 
5660: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 2a  virtual tables *
5670: 2f 0a 20 20 73 71 6c 69 74 65 33 52 65 73 65 74  /.  sqlite3Reset
5680: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
5690: 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a 20 49 66  b, -1);..  /* If
56a0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
56b0: 73 20 6f 70 65 6e 2c 20 74 68 65 20 52 65 73 65  s open, the Rese
56c0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
56d0: 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a  ) call above.  *
56e0: 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20  * will not have 
56f0: 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63  called the xDisc
5700: 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20  onnect() method 
5710: 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20  on any virtual. 
5720: 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68   ** tables in th
5730: 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20  e db->aVTrans[] 
5740: 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f  array. The follo
5750: 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62  wing sqlite3Vtab
5760: 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20  Rollback().  ** 
5770: 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e  call will do so.
5780: 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74   We need to do t
5790: 68 69 73 20 62 65 66 6f 72 65 20 74 68 65 20 63  his before the c
57a0: 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a  heck for active.
57b0: 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
57c0: 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68  nts below, as th
57d0: 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d  e v-table implem
57e0: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  entation may be 
57f0: 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d  storing.  ** som
5800: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
5810: 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79  ments internally
5820: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
5830: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
5840: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
5850: 20 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e   are any outstan
5860: 64 69 6e 67 20 56 4d 73 2c 20 72 65 74 75 72 6e  ding VMs, return
5870: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f   SQLITE_BUSY. */
5880: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
5890: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
58a0: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
58b0: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
58c0: 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20  unable to close 
58d0: 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 73  due to unfinalis
58e0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ed statements");
58f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
5900: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
5910: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ex);.    return 
5920: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
5930: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5940: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
5950: 6b 4f 72 4f 6b 28 64 62 29 20 29 3b 0a 0a 20 20  kOrOk(db) );..  
5960: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
5970: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; j++){.    Bt
5980: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
5990: 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[j].pBt;.    i
59a0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
59b0: 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70  3BtreeIsInBackup
59c0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 73  (pBt) ){.      s
59d0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
59e0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
59f0: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
5a00: 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20  to close due to 
5a10: 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75  unfinished backu
5a20: 70 20 6f 70 65 72 61 74 69 6f 6e 22 29 3b 0a 20  p operation");. 
5a30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
5a40: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
5a50: 65 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ex);.      retur
5a60: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
5a70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
5a80: 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  ree any outstand
5a90: 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74  ing Savepoint st
5aa0: 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73  ructures. */.  s
5ab0: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
5ac0: 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 66 6f  oints(db);..  fo
5ad0: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
5ae0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
5af0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
5b00: 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66  ->aDb[j];.    if
5b10: 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pDb->pBt ){.  
5b20: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
5b30: 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b  Close(pDb->pBt);
5b40: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20  .      pDb->pBt 
5b50: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  = 0;.      if( j
5b60: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=1 ){.        p
5b70: 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b  Db->pSchema = 0;
5b80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5b90: 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 73 65   }.  sqlite3Rese
5ba0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
5bb0: 64 62 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a 20 54  db, -1);..  /* T
5bc0: 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ell the code in 
5bd0: 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68  notify.c that th
5be0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20  e connection no 
5bf0: 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79  longer holds any
5c00: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20  .  ** locks and 
5c10: 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
5c20: 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c   any further unl
5c30: 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
5c40: 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  acks..  */.  sql
5c50: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c  ite3ConnectionCl
5c60: 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 61 73 73  osed(db);..  ass
5c70: 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20  ert( db->nDb<=2 
5c80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
5c90: 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb==db->aDbSta
5ca0: 74 69 63 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  tic );.  for(j=0
5cb0: 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64 62  ; j<ArraySize(db
5cc0: 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29  ->aFunc.a); j++)
5cd0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
5ce0: 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70  Next, *pHash, *p
5cf0: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e  ;.    for(p=db->
5d00: 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70  aFunc.a[j]; p; p
5d10: 3d 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 70  =pHash){.      p
5d20: 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b  Hash = p->pHash;
5d30: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
5d40: 29 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74  ){.        funct
5d50: 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70  ionDestroy(db, p
5d60: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  );.        pNext
5d70: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
5d80: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5d90: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
5da0: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
5db0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5dc0: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
5dd0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
5de0: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
5df0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
5e00: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
5e10: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
5e20: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
5e30: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
5e40: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
5e50: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
5e60: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
5e70: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
5e80: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
5e90: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
5ea0: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
5eb0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
5ec0: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
5ed0: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
5ee0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
5ef0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5f00: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
5f10: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
5f20: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
5f30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5f40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
5f50: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
5f60: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
5f70: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
5f80: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
5f90: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
5fa0: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
5fb0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
5fc0: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
5fd0: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
5fe0: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
5ff0: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
6000: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
6010: 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ree(db, pMod);. 
6020: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
6030: 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75  Clear(&db->aModu
6040: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  le);.#endif..  s
6050: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
6060: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f  SQLITE_OK, 0); /
6070: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
6080: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
6090: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 69 66 28  trings. */.  if(
60a0: 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20   db->pErr ){.   
60b0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
60c0: 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d  e(db->pErr);.  }
60d0: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
60e0: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a  xtensions(db);..
60f0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
6100: 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
6110: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70  ;..  /* The temp
6120: 2d 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  -database schema
6130: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69   is allocated di
6140: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74  fferently from t
6150: 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a  he other schema.
6160: 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73    ** objects (us
6170: 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ing sqliteMalloc
6180: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  () directly, ins
6190: 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42  tead of sqlite3B
61a0: 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20  treeSchema()).. 
61b0: 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20   ** So it needs 
61c0: 74 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65  to be freed here
61d0: 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20  . Todo: Why not 
61e0: 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63  roll the temp sc
61f0: 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  hema into.  ** t
6200: 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61  he same sqliteMa
6210: 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e  lloc() as the on
6220: 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73  e that allocates
6230: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
6240: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20   ** structure?. 
6250: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
6260: 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  ree(db, db->aDb[
6270: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  1].pSchema);.  s
6280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6290: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
62a0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
62b0: 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
62c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
62d0: 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78  x_free(db->mutex
62e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
62f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d  >lookaside.nOut=
6300: 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20  =0 );  /* Fails 
6310: 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  on a lookaside m
6320: 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20  emory leak */.  
6330: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
6340: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20  e.bMalloced ){. 
6350: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6360: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
6370: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tart);.  }.  sql
6380: 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20  ite3_free(db);. 
6390: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
63a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
63b0: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
63c0: 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e files..*/.void
63d0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
63e0: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 29  All(sqlite3 *db)
63f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
6400: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
6410: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6420: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
6430: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
6440: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
6450: 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30  loc();.  for(i=0
6460: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
6470: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
6480: 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20 20 20  Db[i].pBt ){.   
6490: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
64a0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 64 62 2d  reeIsInTrans(db-
64b0: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
64c0: 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20          inTrans 
64d0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
64e0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
64f0: 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44 62 5b  ollback(db->aDb[
6500: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20 20 64  i].pBt);.      d
6510: 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e  b->aDb[i].inTran
6520: 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  s = 0;.    }.  }
6530: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
6540: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
6550: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
6560: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 64  lloc();..  if( d
6570: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
6580: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b  InternChanges ){
6590: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
65a0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
65b0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
65c0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
65d0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 2d 31 29  alSchema(db, -1)
65e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 79 20  ;.  }..  /* Any 
65f0: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
6600: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
6610: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
6620: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
6630: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
6640: 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  0;..  /* If one 
6650: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
6660: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
6670: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
6680: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
6690: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
66a0: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
66b0: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
66c0: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
66d0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
66e0: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
66f0: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
6700: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
6710: 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64  ic string that d
6720: 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e  escribes the kin
6730: 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69  d of error speci
6740: 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61  fied in the.** a
6750: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73  rgument..*/.cons
6760: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
6770: 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20  rrStr(int rc){. 
6780: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
6790: 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d  ar* const aMsg[]
67a0: 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49   = {.    /* SQLI
67b0: 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a  TE_OK          *
67c0: 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22  / "not an error"
67d0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
67e0: 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22  ERROR       */ "
67f0: 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20  SQL logic error 
6800: 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62  or missing datab
6810: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
6820: 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20  ITE_INTERNAL    
6830: 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  */ 0,.    /* SQL
6840: 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20  ITE_PERM        
6850: 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69  */ "access permi
6860: 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ssion denied",. 
6870: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f     /* SQLITE_ABO
6880: 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c  RT       */ "cal
6890: 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20  lback requested 
68a0: 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20  query abort",.  
68b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    /* SQLITE_BUSY
68c0: 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61          */ "data
68d0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c  base is locked",
68e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  .    /* SQLITE_L
68f0: 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64  OCKED      */ "d
6900: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
6910: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
6920: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20   SQLITE_NOMEM   
6930: 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d      */ "out of m
6940: 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53  emory",.    /* S
6950: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20  QLITE_READONLY  
6960: 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f    */ "attempt to
6970: 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c   write a readonl
6980: 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20  y database",.   
6990: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   /* SQLITE_INTER
69a0: 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72  RUPT   */ "inter
69b0: 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20  rupted",.    /* 
69c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20  SQLITE_IOERR    
69d0: 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20     */ "disk I/O 
69e0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
69f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20  QLITE_CORRUPT   
6a00: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64    */ "database d
6a10: 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c  isk image is mal
6a20: 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20  formed",.    /* 
6a30: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
6a40: 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f     */ "unknown o
6a50: 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f  peration",.    /
6a60: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20  * SQLITE_FULL   
6a70: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
6a80: 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c  e or disk is ful
6a90: 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  l",.    /* SQLIT
6aa0: 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f  E_CANTOPEN    */
6ab0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
6ac0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c   database file",
6ad0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50  .    /* SQLITE_P
6ae0: 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c  ROTOCOL    */ "l
6af0: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22  ocking protocol"
6b00: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6b10: 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22  EMPTY       */ "
6b20: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e  table contains n
6b30: 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20  o data",.    /* 
6b40: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20  SQLITE_SCHEMA   
6b50: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
6b60: 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67  schema has chang
6b70: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
6b80: 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a  TE_TOOBIG      *
6b90: 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f  / "string or blo
6ba0: 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20  b too big",.    
6bb0: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  /* SQLITE_CONSTR
6bc0: 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72  AINT  */ "constr
6bd0: 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20  aint failed",.  
6be0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d    /* SQLITE_MISM
6bf0: 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61  ATCH    */ "data
6c00: 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a  type mismatch",.
6c10: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
6c20: 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69  SUSE      */ "li
6c30: 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61  brary routine ca
6c40: 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75  lled out of sequ
6c50: 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ence",.    /* SQ
6c60: 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20  LITE_NOLFS      
6c70: 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20   */ "large file 
6c80: 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62  support is disab
6c90: 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  led",.    /* SQL
6ca0: 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20  ITE_AUTH        
6cb0: 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f  */ "authorizatio
6cc0: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
6cd0: 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20  * SQLITE_FORMAT 
6ce0: 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61       */ "auxilia
6cf0: 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d  ry database form
6d00: 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  at error",.    /
6d10: 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20  * SQLITE_RANGE  
6d20: 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72       */ "bind or
6d30: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75   column index ou
6d40: 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20  t of range",.   
6d50: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44   /* SQLITE_NOTAD
6d60: 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20  B      */ "file 
6d70: 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20  is encrypted or 
6d80: 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73  is not a databas
6d90: 65 22 2c 0a 20 20 7d 3b 0a 20 20 72 63 20 26 3d  e",.  };.  rc &=
6da0: 20 30 78 66 66 3b 0a 20 20 69 66 28 20 41 4c 57   0xff;.  if( ALW
6db0: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
6dc0: 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 4d  <(int)(sizeof(aM
6dd0: 73 67 29 2f 73 69 7a 65 6f 66 28 61 4d 73 67 5b  sg)/sizeof(aMsg[
6de0: 30 5d 29 29 20 26 26 20 61 4d 73 67 5b 72 63 5d  0])) && aMsg[rc]
6df0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6e00: 6e 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d 65  n aMsg[rc];.  }e
6e10: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
6e20: 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b  "unknown error";
6e30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6e40: 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
6e50: 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c  ments a busy cal
6e60: 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70  lback that sleep
6e70: 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61  s and tries.** a
6e80: 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d  gain until a tim
6e90: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65  eout value is re
6ea0: 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65  ached.  The time
6eb0: 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  out value is.** 
6ec0: 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
6ed0: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
6ee0: 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74  s passed in as t
6ef0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
6f00: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
6f10: 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c  int sqliteDefaul
6f20: 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20  tBusyCallback(. 
6f30: 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20  void *ptr,      
6f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
6f50: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
6f60: 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20  */. int count   
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6f80: 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  Number of times 
6f90: 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62  table has been b
6fa0: 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51  usy */.){.#if SQ
6fb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28  LITE_OS_WIN || (
6fc0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
6fd0: 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
6fe0: 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63 6f  EEP).  static co
6ff0: 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20  nst u8 delays[] 
7000: 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35  =.     { 1, 2, 5
7010: 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35  , 10, 15, 20, 25
7020: 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20  , 25,  25,  50, 
7030: 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74   50, 100 };.  st
7040: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f  atic const u8 to
7050: 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  tals[] =.     { 
7060: 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c  0, 1, 3,  8, 18,
7070: 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33   33, 53, 78, 103
7080: 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20  , 128, 178, 228 
7090: 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c  };.# define NDEL
70a0: 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c  AY ArraySize(del
70b0: 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  ays).  sqlite3 *
70c0: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
70d0: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
70e0: 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d  ut = db->busyTim
70f0: 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61  eout;.  int dela
7100: 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73  y, prior;..  ass
7110: 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b  ert( count>=0 );
7120: 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e  .  if( count < N
7130: 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c  DELAY ){.    del
7140: 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e  ay = delays[coun
7150: 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  t];.    prior = 
7160: 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20  totals[count];. 
7170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61   }else{.    dela
7180: 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41  y = delays[NDELA
7190: 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  Y-1];.    prior 
71a0: 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d  = totals[NDELAY-
71b0: 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e  1] + delay*(coun
71c0: 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20  t-(NDELAY-1));. 
71d0: 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b   }.  if( prior +
71e0: 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74   delay > timeout
71f0: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
7200: 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b  timeout - prior;
7210: 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d  .    if( delay<=
7220: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7230: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
7240: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c  ep(db->pVfs, del
7250: 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75  ay*1000);.  retu
7260: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71  rn 1;.#else.  sq
7270: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
7280: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
7290: 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71  t timeout = ((sq
72a0: 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75  lite3 *)ptr)->bu
72b0: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28  syTimeout;.  if(
72c0: 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20   (count+1)*1000 
72d0: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
72e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
72f0: 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28   sqlite3OsSleep(
7300: 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30  db->pVfs, 100000
7310: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
7320: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
7330: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
7340: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a   busy handler..*
7350: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7360: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
7370: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61   an operation fa
7380: 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b  iled with a lock
7390: 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  ..** If this rou
73a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tine returns non
73b0: 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
73c0: 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20  is retried.  If 
73d0: 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c  it.** returns 0,
73e0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61   the operation a
73f0: 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51  borts with an SQ
7400: 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e  LITE_BUSY error.
7410: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
7420: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
7430: 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29  (BusyHandler *p)
7440: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
7450: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c  ( NEVER(p==0) ||
7460: 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20   p->xFunc==0 || 
7470: 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74  p->nBusy<0 ) ret
7480: 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d  urn 0;.  rc = p-
7490: 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20  >xFunc(p->pArg, 
74a0: 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28  p->nBusy);.  if(
74b0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d   rc==0 ){.    p-
74c0: 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d  >nBusy = -1;.  }
74d0: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  else{.    p->nBu
74e0: 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sy++;.  }.  retu
74f0: 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn rc; .}../*.**
7500: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
7510: 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ts the busy call
7520: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
7530: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
7540: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
7550: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
7560: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
7570: 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
7580: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
7590: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
75a0: 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  b,.  int (*xBusy
75b0: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20  )(void*,int),.  
75c0: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
75d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
75e0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
75f0: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
7600: 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b  r.xFunc = xBusy;
7610: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
7620: 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a  er.pArg = pArg;.
7630: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
7640: 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 73  r.nBusy = 0;.  s
7650: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
7660: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
7670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7680: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
7690: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
76a0: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
76b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
76c0: 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73  ets the progress
76d0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
76e0: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
76f0: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
7700: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
7710: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
7720: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  n argument. The 
7730: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
7740: 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76  k will.** be inv
7750: 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20  oked every nOps 
7760: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64  opcodes..*/.void
7770: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
7780: 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  s_handler(.  sql
7790: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
77a0: 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78   nOps,.  int (*x
77b0: 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29  Progress)(void*)
77c0: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  , .  void *pArg.
77d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
77e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
77f0: 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e  ex);.  if( nOps>
7800: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  0 ){.    db->xPr
7810: 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65  ogress = xProgre
7820: 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f  ss;.    db->nPro
7830: 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73 3b  gressOps = nOps;
7840: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
7850: 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ssArg = pArg;.  
7860: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78  }else{.    db->x
7870: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
7880: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
7890: 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ps = 0;.    db->
78a0: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30  pProgressArg = 0
78b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
78c0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
78d0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
78e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
78f0: 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61  utine installs a
7900: 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61   default busy ha
7910: 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73  ndler that waits
7920: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63   for the.** spec
7930: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ified number of 
7940: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66  milliseconds bef
7950: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e  ore returning 0.
7960: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
7970: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c  busy_timeout(sql
7980: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73  ite3 *db, int ms
7990: 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  ){.  if( ms>0 ){
79a0: 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d  .    db->busyTim
79b0: 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20 73  eout = ms;.    s
79c0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
79d0: 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65  ler(db, sqliteDe
79e0: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
79f0: 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20  k, (void*)db);. 
7a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
7a10: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
7a20: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
7a30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7a40: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
7a50: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
7a60: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
7a70: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
7a80: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
7a90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
7aa0: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
7ab0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e 69  *db){.  db->u1.i
7ac0: 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31  sInterrupted = 1
7ad0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
7ae0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61   function is exa
7af0: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73  ctly the same as
7b00: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7b10: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65  function(), exce
7b20: 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  pt.** that it is
7b30: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20   designed to be 
7b40: 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e  called by intern
7b50: 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66  al code. The dif
7b60: 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68  ference is.** th
7b70: 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  at if a malloc()
7b80: 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65   fails in sqlite
7b90: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7ba0: 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  n(), an error co
7bb0: 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  de.** is returne
7bc0: 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63  d and the malloc
7bd0: 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61  Failed flag clea
7be0: 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  red. .*/.int sql
7bf0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a  ite3CreateFunc(.
7c00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
7c10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
7c20: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
7c30: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
7c40: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72  c,.  void *pUser
7c50: 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78  Data,.  void (*x
7c60: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
7c70: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
7c80: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
7c90: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
7ca0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
7cb0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
7cc0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
7cd0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
7ce0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e 63  ontext*),.  Func
7cf0: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
7d00: 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75 6e  tructor.){.  Fun
7d10: 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cDef *p;.  int n
7d20: 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Name;..  assert(
7d30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7d40: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
7d50: 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f  ;.  if( zFunctio
7d60: 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20  nName==0 ||.    
7d70: 20 20 28 78 46 75 6e 63 20 26 26 20 28 78 46 69    (xFunc && (xFi
7d80: 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c  nal || xStep)) |
7d90: 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  | .      (!xFunc
7da0: 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21   && (xFinal && !
7db0: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
7dc0: 20 28 21 78 46 75 6e 63 20 26 26 20 28 21 78 46   (!xFunc && (!xF
7dd0: 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20  inal && xStep)) 
7de0: 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d  ||.      (nArg<-
7df0: 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45  1 || nArg>SQLITE
7e00: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
7e10: 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35  G) ||.      (255
7e20: 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  <(nName = sqlite
7e30: 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63  3Strlen30( zFunc
7e40: 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20  tionName))) ){. 
7e50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7e60: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7e70: 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.  .#ifndef SQL
7e80: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
7e90: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
7ea0: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
7eb0: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
7ec0: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
7ed0: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
7ee0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
7ef0: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
7f00: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
7f10: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
7f20: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
7f30: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
7f40: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
7f50: 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ly..  **.  ** If
7f60: 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73   SQLITE_ANY is s
7f70: 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68  pecified, add th
7f80: 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
7f90: 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  the function.  *
7fa0: 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61  * to the hash ta
7fb0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
7fc0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
7fd0: 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53  6 ){.    enc = S
7fe0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
7ff0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  E;.  }else if( e
8000: 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29  nc==SQLITE_ANY )
8010: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
8020: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
8030: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
8040: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
8050: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
8060: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
8070: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
8080: 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75   xFinal, pDestru
8090: 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ctor);.    if( r
80a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
80b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
80c0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
80d0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
80e0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
80f0: 31 36 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20  16LE,.          
8100: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
8110: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
8120: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
8130: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
8140: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8150: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8160: 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53     }.    enc = S
8170: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
8180: 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d   }.#else.  enc =
8190: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
81a0: 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ndif.  .  /* Che
81b0: 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ck if an existin
81c0: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  g function is be
81d0: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f  ing overridden o
81e0: 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f  r deleted. If so
81f0: 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65  ,.  ** and there
8200: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
8210: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   then return SQL
8220: 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66  ITE_BUSY. If a f
8230: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
8240: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
8250: 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65  /deleted but the
8260: 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
8270: 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a   VMs, allow the.
8280: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74    ** operation t
8290: 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69  o continue but i
82a0: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
82b0: 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
82c0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  ents..  */.  p =
82d0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
82e0: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
82f0: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
8300: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29  Arg, (u8)enc, 0)
8310: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
8320: 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26  iPrefEnc==enc &&
8330: 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29   p->nArg==nArg )
8340: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63  {.    if( db->ac
8350: 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20  tiveVdbeCnt ){. 
8360: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8370: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
8380: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
8390: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
83a0: 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69  dify user-functi
83b0: 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  on due to active
83c0: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
83d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
83e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
83f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
8400: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
8410: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8420: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
8430: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
8440: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
8450: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
8460: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
8470: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
8480: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
8490: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c  1);.  assert(p |
84a0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
84b0: 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  ed);.  if( !p ){
84c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
84d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
84e0: 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20   /* If an older 
84f0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66  version of the f
8500: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63  unction with a c
8510: 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75  onfigured destru
8520: 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69  ctor is.  ** bei
8530: 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f  ng replaced invo
8540: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
8550: 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e  r function here.
8560: 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65   */.  functionDe
8570: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20  stroy(db, p);.. 
8580: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
8590: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63   ){.    pDestruc
85a0: 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  tor->nRef++;.  }
85b0: 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f  .  p->pDestructo
85c0: 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b  r = pDestructor;
85d0: 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  .  p->flags = 0;
85e0: 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46  .  p->xFunc = xF
85f0: 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20  unc;.  p->xStep 
8600: 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46  = xStep;.  p->xF
8610: 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c  inalize = xFinal
8620: 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61  ;.  p->pUserData
8630: 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20   = pUserData;.  
8640: 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e  p->nArg = (u16)n
8650: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Arg;.  return SQ
8660: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8670: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65  * Create new use
8680: 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  r functions..*/.
8690: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
86a0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  te_function(.  s
86b0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
86c0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
86d0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
86e0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
86f0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
8700: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
8710: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8720: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
8730: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
8740: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
8750: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8760: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
8770: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
8780: 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72  ext*).){.  retur
8790: 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
87a0: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c  _function_v2(db,
87b0: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
87c0: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
87d0: 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ep,.            
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20          xFinal, 
8800: 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  0);.}..int sqlit
8810: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8820: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
8830: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
8840: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
8850: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
8860: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
8870: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
8880: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
8890: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
88a0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
88b0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
88c0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
88d0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
88e0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
88f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
8900: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
8910: 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20  oy)(void *).){. 
8920: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8930: 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65  _ERROR;.  FuncDe
8940: 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d  structor *pArg =
8950: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
8960: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
8970: 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73  tex);.  if( xDes
8980: 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67  troy ){.    pArg
8990: 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74   = (FuncDestruct
89a0: 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  or *)sqlite3DbMa
89b0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
89c0: 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63 74  eof(FuncDestruct
89d0: 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  or));.    if( !p
89e0: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65  Arg ){.      xDe
89f0: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20  stroy(p);.      
8a00: 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a  goto out;.    }.
8a10: 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72      pArg->xDestr
8a20: 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20  oy = xDestroy;. 
8a30: 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61     pArg->pUserDa
8a40: 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63  ta = p;.  }.  rc
8a50: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
8a60: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20  Func(db, zFunc, 
8a70: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
8a80: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
8a90: 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28  al, pArg);.  if(
8aa0: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e   pArg && pArg->n
8ab0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Ref==0 ){.    as
8ac0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
8ad0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74  _OK );.    xDest
8ae0: 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  roy(p);.    sqli
8af0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41  te3DbFree(db, pA
8b00: 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a  rg);.  }.. out:.
8b10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
8b20: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
8b30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
8b40: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
8b50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8b60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8b70: 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73  OMIT_UTF16.int s
8b80: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8b90: 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  nction16(.  sqli
8ba0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
8bb0: 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e   void *zFunction
8bc0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
8bd0: 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70  ,.  int eTextRep
8be0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
8bf0: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
8c00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
8c10: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
8c20: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
8c30: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
8c40: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
8c50: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
8c60: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
8c70: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
8c80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
8c90: 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c  r *zFunc8;.  sql
8ca0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8cb0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
8cc0: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
8cd0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46  ocFailed );.  zF
8ce0: 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74  unc8 = sqlite3Ut
8cf0: 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63  f16to8(db, zFunc
8d00: 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  tionName, -1, SQ
8d10: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
8d20: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8d30: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
8d40: 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54  zFunc8, nArg, eT
8d50: 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e 63  extRep, p, xFunc
8d60: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
8d70: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  0);.  sqlite3DbF
8d80: 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b  ree(db, zFunc8);
8d90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
8da0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
8db0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8dc0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
8dd0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
8de0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
8df0: 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66  Declare that a f
8e00: 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
8e10: 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61   overloaded by a
8e20: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
8e30: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e  **.** If the fun
8e40: 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78  ction already ex
8e50: 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61  ists as a regula
8e60: 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  r global functio
8e70: 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  n, then.** this 
8e80: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
8e90: 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63  op.  If the func
8ea0: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  tion does not ex
8eb0: 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ist, then create
8ec0: 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68  .** a new one th
8ed0: 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73  at always throws
8ee0: 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f   a run-time erro
8ef0: 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  r.  .**.** When 
8f00: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69  virtual tables i
8f10: 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65  ntend to provide
8f20: 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66   an overloaded f
8f30: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a  unction, they.**
8f40: 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69   should call thi
8f50: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b  s routine to mak
8f60: 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61  e sure the globa
8f70: 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  l function exist
8f80: 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66  s..** A global f
8f90: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69  unction must exi
8fa0: 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  st in order for 
8fb0: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
8fc0: 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65  to work.** prope
8fd0: 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rly..*/.int sqli
8fe0: 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
8ff0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
9000: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
9010: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  ar *zName,.  int
9020: 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e   nArg.){.  int n
9030: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
9040: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
9050: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9060: 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  _OK;.  sqlite3_m
9070: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9080: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
9090: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
90a0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  (db, zName, nNam
90b0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
90c0: 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  UTF8, 0)==0 ){. 
90d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
90e0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e  reateFunc(db, zN
90f0: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
9100: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9120: 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76     0, sqlite3Inv
9130: 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  alidFunction, 0,
9140: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63   0, 0);.  }.  rc
9150: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
9160: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
9170: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9180: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9190: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
91a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
91b0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67  _TRACE./*.** Reg
91c0: 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75  ister a trace fu
91d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
91e0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
91f0: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
9200: 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74   trace.** is ret
9210: 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
9220: 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63   NULL trace func
9230: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
9240: 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78  no tracing is ex
9250: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
9260: 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20  ULL.** trace is 
9270: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
9280: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
9290: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73  invoked at the s
92a0: 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  tart of each.** 
92b0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
92c0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
92d0: 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64  trace(sqlite3 *d
92e0: 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65  b, void (*xTrace
92f0: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
9300: 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  ar*), void *pArg
9310: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
9320: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9330: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9340: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
9350: 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d  pTraceArg;.  db-
9360: 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65  >xTrace = xTrace
9370: 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72  ;.  db->pTraceAr
9380: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
9390: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
93a0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
93b0: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a  turn pOld;.}./*.
93c0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72  ** Register a pr
93d0: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20  ofile function. 
93e0: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
93f0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
9400: 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f  gistered .** pro
9410: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  file function is
9420: 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
9430: 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c  ** A NULL profil
9440: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
9450: 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69   that no profili
9460: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
9470: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70   A non-NULL.** p
9480: 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e  rofile is a poin
9490: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
94a0: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
94b0: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
94c0: 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53  ion of.** each S
94d0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  QL statement tha
94e0: 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  t is run..*/.voi
94f0: 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69  d *sqlite3_profi
9500: 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le(.  sqlite3 *d
9510: 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f  b,.  void (*xPro
9520: 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  file)(void*,cons
9530: 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75  t char*,sqlite_u
9540: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
9550: 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  pArg.){.  void *
9560: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
9570: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
9580: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
9590: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
95a0: 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65  ;.  db->xProfile
95b0: 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64   = xProfile;.  d
95c0: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d  b->pProfileArg =
95d0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
95e0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
95f0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
9600: 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
9610: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9620: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45  TRACE */../*** E
9630: 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a  XPERIMENTAL ***.
9640: 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  **.** Register a
9650: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
9660: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
9670: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65  ransaction comme
9680: 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nts..** If the i
9690: 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
96a0: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
96b0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
96c0: 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
96d0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
96e0: 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
96f0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
9700: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
9710: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
9720: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
9730: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
9740: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
9750: 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
9760: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
9770: 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
9780: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
9790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
97a0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
97b0: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
97c0: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
97d0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
97e0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
97f0: 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
9800: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
9810: 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
9820: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
9830: 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
9840: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9850: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9860: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
9870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
9880: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
9890: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
98a0: 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
98b0: 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
98c0: 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
98d0: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
98e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
98f0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
9900: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  _update_hook(.  
9910: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
9920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
9930: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
9940: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
9950: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
9960: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
9970: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72  har const *,char
9980: 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f   const *,sqlite_
9990: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
99a0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
99b0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
99c0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
99d0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
99e0: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
99f0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
9a00: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
9a10: 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20  b->pUpdateArg;. 
9a20: 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
9a30: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
9a40: 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41  ;.  db->pUpdateA
9a50: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
9a60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9a70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9a80: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
9a90: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
9aa0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
9ab0: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
9ac0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
9ad0: 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  s rolled.** back
9ae0: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
9af0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
9b00: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72  .void *sqlite3_r
9b10: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20  ollback_hook(.  
9b20: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
9b30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
9b40: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
9b50: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
9b60: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
9b70: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20  ack)(void*), /* 
9b80: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
9b90: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  n */.  void *pAr
9ba0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
9bb0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
9bc0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
9bd0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
9be0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9bf0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9c00: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
9c10: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20  pRollbackArg;.  
9c20: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
9c30: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
9c40: 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  k;.  db->pRollba
9c50: 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ckArg = pArg;.  
9c60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9c70: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9c80: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
9c90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9ca0: 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
9cb0: 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69  _HOOK./*.** Regi
9cc0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
9cd0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
9ce0: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
9cf0: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
9d00: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
9d10: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
9d20: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
9d30: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
9d40: 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b  3_preupdate_hook
9d50: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d70: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
9d80: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
9d90: 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61  e */.  void(*xCa
9da0: 6c 6c 62 61 63 6b 29 28 20 20 20 20 20 20 20 20  llback)(        
9db0: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
9dc0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69  ction */.    voi
9dd0: 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c  d*,sqlite3*,int,
9de0: 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72  char const*,char
9df0: 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f   const*,sqlite3_
9e00: 69 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e  int64,sqlite3_in
9e10: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
9e20: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
9e30: 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62    /* First callb
9e40: 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ack argument */.
9e50: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
9e60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9e70: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9e80: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
9e90: 70 50 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20  pPreUpdateArg;. 
9ea0: 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
9eb0: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
9ec0: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  ack;.  db->pPreU
9ed0: 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b  pdateArg = pArg;
9ee0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9ef0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9f00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
9f10: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9f20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
9f30: 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
9f40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9f50: 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65  IT_WAL./*.** The
9f60: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
9f70: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  k() callback reg
9f80: 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74  istered by sqlit
9f90: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
9fa0: 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f  point()..** Invo
9fb0: 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  ke sqlite3_wal_c
9fc0: 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
9fd0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
9fe0: 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
9ff0: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
a000: 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61  than sqlite3.pWa
a010: 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20  lArg cast to an 
a020: 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c  integer (the val
a030: 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ue configured by
a040: 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  .** wal_autochec
a050: 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69  kpoint())..*/ .i
a060: 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  nt sqlite3WalDef
a070: 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64  aultHook(.  void
a080: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20   *pClientData,  
a090: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a     /* Argument *
a0a0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
a0b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
a0c0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
a0d0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
a0e0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
a0f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65   */.  int nFrame
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a110: 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29  Size of WAL */.)
a120: 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d  {.  if( nFrame>=
a130: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
a140: 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29  T(pClientData) )
a150: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
a160: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
a170: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  ;.    sqlite3_wa
a180: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  l_checkpoint(db,
a190: 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   zDb);.    sqlit
a1a0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
a1b0: 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c();.  }.  retur
a1c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
a1d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a1e0: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
a1f0: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20  ** Configure an 
a200: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
a210: 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  () callback to a
a220: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
a230: 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74  ckpoint.** a dat
a240: 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d  abase after comm
a250: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
a260: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
a270: 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d  e nFrame or.** m
a280: 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68  ore frames in th
a290: 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73  e log file. Pass
a2a0: 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65  ing zero or a ne
a2b0: 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20  gative value as 
a2c0: 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61  the.** nFrame pa
a2d0: 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73  rameter disables
a2e0: 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
a2f0: 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e  points entirely.
a300: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  .**.** The callb
a310: 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
a320: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
a330: 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69  replaces any exi
a340: 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a  sting callback.*
a350: 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69  * registered usi
a360: 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
a370: 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c  ook(). Likewise,
a380: 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63   registering a c
a390: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  allback.** using
a3a0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
a3b0: 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65  k() disables the
a3c0: 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
a3d0: 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a  point mechanism.
a3e0: 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
a3f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
a400: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
a410: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
a420: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
a430: 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64  nt nFrame){.#ifd
a440: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
a450: 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  AL.  UNUSED_PARA
a460: 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
a470: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
a480: 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69  rame);.#else.  i
a490: 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20  f( nFrame>0 ){. 
a4a0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
a4b0: 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57  ook(db, sqlite3W
a4c0: 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53  alDefaultHook, S
a4d0: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
a4e0: 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c  (nFrame));.  }el
a4f0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
a500: 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20  wal_hook(db, 0, 
a510: 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
a520: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a530: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
a540: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
a550: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
a560: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
a570: 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e  ction is written
a580: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69  .** into the wri
a590: 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20  te-ahead-log by 
a5a0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
a5b0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
a5c0: 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  d *sqlite3_wal_h
a5d0: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
a5e0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
a5f0: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
a600: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
a610: 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  s db handle */. 
a620: 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29   int(*xCallback)
a630: 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33  (void *, sqlite3
a640: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
a650: 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
a660: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
a670: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
a680: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
a690: 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20   to xCallback() 
a6a0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
a6b0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
a6c0: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
a6d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a6e0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
a6f0: 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41  pRet = db->pWalA
a700: 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61  rg;.  db->xWalCa
a710: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
a720: 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72  ck;.  db->pWalAr
a730: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
a740: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a750: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
a760: 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65  turn pRet;.#else
a770: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
a780: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  dif.}../*.** Che
a790: 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
a7a0: 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   zDb..*/.int sql
a7b0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
a7c0: 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  int_v2(.  sqlite
a7d0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
a7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
a7f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
a800: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
a810: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
a820: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74    /* Name of att
a830: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28  ached database (
a840: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e  or NULL) */.  in
a850: 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20  t eMode,        
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a870: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
a880: 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20  NT_* value */.  
a890: 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20  int *pnLog,     
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
a8c0: 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65  WAL log in frame
a8d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b  s */.  int *pnCk
a8e0: 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  pt              
a8f0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
a900: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66  otal number of f
a910: 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74  rames checkpoint
a920: 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  ed */.){.#ifdef 
a930: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
a940: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a950: 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  OK;.#else.  int 
a960: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
a970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a980: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
a990: 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45  int iDb = SQLITE
a9a0: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20  _MAX_ATTACHED;  
a9b0: 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  /* sqlite3.aDb[]
a9c0: 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20   index of db to 
a9d0: 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20  checkpoint */.. 
a9e0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
a9f0: 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
aa00: 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73  les to -1 in cas
aa10: 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
aa20: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f  s. */.  if( pnLo
aa30: 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b  g ) *pnLog = -1;
aa40: 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20  .  if( pnCkpt ) 
aa50: 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20  *pnCkpt = -1;.. 
aa60: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
aa70: 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e  CHECKPOINT_FULL>
aa80: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
aa90: 54 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20 61  T_PASSIVE );.  a
aaa0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
aab0: 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51  ECKPOINT_FULL<SQ
aac0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
aad0: 52 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73 73  RESTART );.  ass
aae0: 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
aaf0: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b 32  KPOINT_PASSIVE+2
ab00: 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ==SQLITE_CHECKPO
ab10: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20  INT_RESTART );. 
ab20: 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54   if( eMode<SQLIT
ab30: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
ab40: 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51  SIVE || eMode>SQ
ab50: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
ab60: 52 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20 72  RESTART ){.    r
ab70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
ab80: 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  USE;.  }..  sqli
ab90: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
aba0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
abb0: 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20  ( zDb && zDb[0] 
abc0: 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  ){.    iDb = sql
abd0: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
abe0: 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69  b, zDb);.  }.  i
abf0: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
ac00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
ac10: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  R;.    sqlite3Er
ac20: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45  ror(db, SQLITE_E
ac30: 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  RROR, "unknown d
ac40: 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44  atabase: %s", zD
ac50: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
ac60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65   rc = sqlite3Che
ac70: 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c  ckpoint(db, iDb,
ac80: 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70   eMode, pnLog, p
ac90: 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69  nCkpt);.    sqli
aca0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
acb0: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   0);.  }.  rc = 
acc0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
acd0: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
ace0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
acf0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
ad00: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
ad10: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
ad20: 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
ad30: 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c   If zDb is NULL,
ad40: 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65   or if the buffe
ad50: 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20  r zDb points.** 
ad60: 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65  to contains a ze
ad70: 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67  ro-length string
ad80: 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  , all attached d
ad90: 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a  atabases are .**
ada0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a   checkpointed..*
adb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
adc0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  l_checkpoint(sql
add0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
ade0: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65  char *zDb){.  re
adf0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  turn sqlite3_wal
ae00: 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
ae10: 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43  b, zDb, SQLITE_C
ae20: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
ae30: 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  E, 0, 0);.}..#if
ae40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ae50: 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  _WAL./*.** Run a
ae60: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64   checkpoint on d
ae70: 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69  atabase iDb. Thi
ae80: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
ae90: 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a  database iDb is.
aea0: 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ** not currently
aeb0: 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64   open in WAL mod
aec0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  e..**.** If a tr
aed0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
aee0: 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
aef0: 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
af00: 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66  nted, this .** f
af10: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
af20: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e  SQLITE_LOCKED an
af30: 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  d a checkpoint i
af40: 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e  s not attempted.
af50: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
af60: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75   occurs while ru
af70: 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70  nning the checkp
af80: 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20  oint, an SQLite 
af90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
afa0: 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e  * returned (i.e.
afb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20   SQLITE_IOERR). 
afc0: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
afd0: 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
afe0: 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73  mutex on databas
aff0: 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75  e handle db shou
b000: 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68  ld be held by th
b010: 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75  e caller. The mu
b020: 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  tex.** associate
b030: 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
b040: 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67  fic b-tree being
b050: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73   checkpointed is
b060: 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69   taken by.** thi
b070: 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  s function while
b080: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
b090: 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a  is running..**.*
b0a0: 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73  * If iDb is pass
b0b0: 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ed SQLITE_MAX_AT
b0c0: 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c  TACHED, then all
b0d0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
b0e0: 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b  ses are.** check
b0f0: 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65  pointed. If an e
b100: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
b110: 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e  red it is return
b120: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d  ed immediately -
b130: 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69  .** no attempt i
b140: 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70  s made to checkp
b150: 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69  oint any remaini
b160: 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ng databases..**
b170: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d  .** Parameter eM
b180: 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51  ode is one of SQ
b190: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
b1a0: 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72  PASSIVE, FULL or
b1b0: 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74   RESTART..*/.int
b1c0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69   sqlite3Checkpoi
b1d0: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
b1e0: 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f  int iDb, int eMo
b1f0: 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  de, int *pnLog, 
b200: 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20  int *pnCkpt){.  
b210: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b220: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
b230: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
b240: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
b270: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
b280: 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20  ttached dbs */. 
b290: 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20   int bBusy = 0; 
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49   /* True if SQLI
b2c0: 54 45 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e  TE_BUSY has been
b2d0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
b2e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b2f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
b300: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
b310: 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20  sert( !pnLog || 
b320: 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20  *pnLog==-1 );.  
b330: 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20  assert( !pnCkpt 
b340: 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29  || *pnCkpt==-1 )
b350: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
b360: 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53  db->nDb && rc==S
b370: 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
b380: 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c      if( i==iDb |
b390: 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41  | iDb==SQLITE_MA
b3a0: 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20  X_ATTACHED ){.  
b3b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b3c0: 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28  BtreeCheckpoint(
b3d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20  db->aDb[i].pBt, 
b3e0: 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
b3f0: 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c  Ckpt);.      pnL
b400: 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e  og = 0;.      pn
b410: 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Ckpt = 0;.      
b420: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
b430: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62  USY ){.        b
b440: 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Busy = 1;.      
b450: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
b460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b470: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
b480: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b490: 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f  bBusy) ? SQLITE_
b4a0: 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e  BUSY : rc;.}.#en
b4b0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b4c0: 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
b4d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
b4e0: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d  eturns true if m
b4f0: 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c  ain-memory shoul
b500: 64 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  d be used instea
b510: 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72  d of.** a tempor
b520: 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61  ary file for tra
b530: 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c  nsient pager fil
b540: 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  es and statement
b550: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
b560: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
b570: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
b580: 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d  value of db->tem
b590: 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65  p_store (runtime
b5a0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61  .** parameter) a
b5b0: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74  nd the compile t
b5c0: 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c  ime value of SQL
b5d0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20  ITE_TEMP_STORE. 
b5e0: 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
b5f0: 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
b600: 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
b610: 70 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20  p between these 
b620: 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e  two values.** an
b630: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73  d this functions
b640: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a   return value..*
b650: 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45  *.**   SQLITE_TE
b660: 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d  MP_STORE     db-
b670: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20  >temp_store     
b680: 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70  Location of temp
b690: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  orary database.*
b6a0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
b6b0: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
b6c0: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
b6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
b6f0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
b700: 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20         any      
b710: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
b720: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
b730: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
b740: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
b760: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
b770: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
b7b0: 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 1).**   1     
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
b7e0: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
b7f0: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
b820: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
b830: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
b840: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
b850: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
b860: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
b870: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
b880: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
b890: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
b8b0: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
b8c0: 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20  .**   3         
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
b8f0: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
b900: 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1).*/.int sqlit
b910: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63  e3TempInMemory(c
b920: 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62  onst sqlite3 *db
b930: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  ){.#if SQLITE_TE
b940: 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65  MP_STORE==1.  re
b950: 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
b960: 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64  store==2 );.#end
b970: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
b980: 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65  MP_STORE==2.  re
b990: 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
b9a0: 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64  store!=1 );.#end
b9b0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
b9c0: 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65  MP_STORE==3.  re
b9d0: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23  turn 1;.#endif.#
b9e0: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
b9f0: 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45  TORE<1 || SQLITE
ba00: 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20  _TEMP_STORE>3.  
ba10: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
ba20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ba30: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45   UTF-8 encoded E
ba40: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
ba50: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
ba60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
ba70: 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
ba80: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
ba90: 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a  errmsg(sqlite3 *
baa0: 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  db){.  const cha
bab0: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  r *z;.  if( !db 
bac0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
bad0: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
bae0: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20  TE_NOMEM);.  }. 
baf0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
bb00: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
bb10: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
bb20: 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
bb30: 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  (SQLITE_MISUSE_B
bb40: 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  KPT);.  }.  sqli
bb50: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
bb60: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
bb70: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
bb80: 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71  ed ){.    z = sq
bb90: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
bba0: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c  TE_NOMEM);.  }el
bbb0: 73 65 7b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61  se{.    z = (cha
bbc0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
bbd0: 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b  _text(db->pErr);
bbe0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
bbf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bc00: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
bc10: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
bc20: 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
bc30: 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rCode);.    }.  
bc40: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
bc50: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
bc60: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
bc70: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
bc80: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
bc90: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36  ** Return UTF-16
bca0: 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
bcb0: 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
bcc0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
bcd0: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
bce0: 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  r..*/.const void
bcf0: 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
bd00: 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  16(sqlite3 *db){
bd10: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
bd20: 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d  u16 outOfMem[] =
bd30: 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c   {.    'o', 'u',
bd40: 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   't', ' ', 'o', 
bd50: 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27  'f', ' ', 'm', '
bd60: 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72  e', 'm', 'o', 'r
bd70: 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20  ', 'y', 0.  };. 
bd80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
bd90: 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20  6 misuse[] = {. 
bda0: 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27     'l', 'i', 'b'
bdb0: 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c  , 'r', 'a', 'r',
bdc0: 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'y', ' ', .    
bdd0: 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27  'r', 'o', 'u', '
bde0: 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65  t', 'i', 'n', 'e
bdf0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27  ', ' ', .    'c'
be00: 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c  , 'a', 'l', 'l',
be10: 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20   'e', 'd', ' ', 
be20: 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27  .    'o', 'u', '
be30: 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  t', ' ', .    'o
be40: 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'f', ' ', .  
be50: 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c    's', 'e', 'q',
be60: 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20   'u', 'e', 'n', 
be70: 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b  'c', 'e', 0.  };
be80: 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ..  const void *
be90: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
bea0: 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
beb0: 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d   *)outOfMem;.  }
bec0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
bed0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
bee0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
bef0: 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73  turn (void *)mis
bf00: 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  use;.  }.  sqlit
bf10: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
bf20: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
bf30: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
bf40: 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f  d ){.    z = (vo
bf50: 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
bf60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
bf70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
bf80: 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
bf90: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
bfa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
bfb0: 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
bfc0: 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 45 72  r, -1, sqlite3Er
bfd0: 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
bfe0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 53 51  ),.           SQ
bff0: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
c000: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
c010: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
c020: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
c030: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rr);.    }.    /
c040: 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79  * A malloc() may
c050: 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74   have failed wit
c060: 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hin the call to 
c070: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
c080: 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62  xt16().    ** ab
c090: 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ove. If this is 
c0a0: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
c0b0: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
c0c0: 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74  led flag needs t
c0d0: 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61  o.    ** be clea
c0e0: 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  red before retur
c0f0: 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69  ning. Do this di
c100: 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
c110: 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71  of via.    ** sq
c120: 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20  lite3ApiExit(), 
c130: 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67  to avoid setting
c140: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
c150: 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  ndle error messa
c160: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ge..    */.    d
c170: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c180: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
c190: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
c1a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
c1b0: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
c1c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
c1d0: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
c1e0: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
c1f0: 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ecent error code
c200: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e   generated by an
c210: 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e   SQLite routine.
c220: 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70   If NULL is.** p
c230: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
c240: 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d  nction, we assum
c250: 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  e a malloc() fai
c260: 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74  led during sqlit
c270: 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  e3_open()..*/.in
c280: 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  t sqlite3_errcod
c290: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
c2a0: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
c2b0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
c2c0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
c2d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c2e0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
c2f0: 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
c300: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c310: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c320: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
c330: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
c340: 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61  Code & db->errMa
c350: 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  sk;.}.int sqlite
c360: 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
c370: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
c380: 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
c390: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
c3a0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
c3b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c3c0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
c3d0: 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
c3e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c3f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c400: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
c410: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
c420: 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rCode;.}../*.** 
c430: 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c  Create a new col
c440: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
c450: 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62  for database "db
c460: 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20  ".  The name is 
c470: 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65  zName.** and the
c480: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63   encoding is enc
c490: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c4a0: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
c4b0: 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a  .  sqlite3* db,.
c4c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
c4d0: 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a  ame, .  u8 enc,.
c4e0: 20 20 75 38 20 63 6f 6c 6c 54 79 70 65 2c 0a 20    u8 collType,. 
c4f0: 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
c500: 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
c510: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
c520: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
c530: 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
c540: 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
c550: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
c560: 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e    int enc2;.  in
c570: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
c580: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
c590: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
c5a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
c5b0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
c5c0: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
c5d0: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
c5e0: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
c5f0: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
c600: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
c610: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
c620: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
c630: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
c640: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
c650: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
c660: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
c670: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
c680: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63  ally..  */.  enc
c690: 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63  2 = enc;.  testc
c6a0: 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
c6b0: 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73  E_UTF16 );.  tes
c6c0: 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
c6d0: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
c6e0: 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  D );.  if( enc2=
c6f0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c  =SQLITE_UTF16 ||
c700: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
c710: 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20  F16_ALIGNED ){. 
c720: 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45     enc2 = SQLITE
c730: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
c740: 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c  }.  if( enc2<SQL
c750: 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32  ITE_UTF8 || enc2
c760: 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  >SQLITE_UTF16BE 
c770: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c780: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
c790: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
c7a0: 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
c7b0: 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
c7c0: 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
c7d0: 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
c7e0: 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
c7f0: 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
c800: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
c810: 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
c820: 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
c830: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
c840: 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
c850: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
c860: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
c870: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
c880: 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
c890: 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  nc2, zName, 0);.
c8a0: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
c8b0: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
c8c0: 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65    if( db->active
c8d0: 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20  VdbeCnt ){.     
c8e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
c8f0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
c900: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
c910: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
c920: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
c930: 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76  nce due to activ
c940: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
c950: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c960: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
c970: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
c980: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
c990: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nts(db);..    /*
c9a0: 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
c9b0: 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
c9c0: 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
c9d0: 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
c9e0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
c9f0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
ca00: 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
ca10: 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
ca20: 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
ca30: 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
ca40: 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
ca50: 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
ca60: 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
ca70: 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
ca80: 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
ca90: 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
caa0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
cab0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
cac0: 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
cad0: 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
cae0: 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
caf0: 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
cb00: 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
cb10: 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
cb20: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
cb30: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
cb40: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
cb50: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
cb60: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
cb70: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
cb80: 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
cb90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
cba0: 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
cbb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
cbc0: 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
cbd0: 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
cbe0: 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
cbf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cc00: 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
cc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cc20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
cc30: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
cc40: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
cc50: 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
cc60: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
cc70: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
cc80: 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  NOMEM;.  pColl->
cc90: 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
cca0: 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
ccb0: 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d  = pCtx;.  pColl-
ccc0: 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
ccd0: 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38  pColl->enc = (u8
cce0: 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  )(enc2 | (enc & 
ccf0: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
cd00: 47 4e 45 44 29 29 3b 0a 20 20 70 43 6f 6c 6c 2d  GNED));.  pColl-
cd10: 3e 74 79 70 65 20 3d 20 63 6f 6c 6c 54 79 70 65  >type = collType
cd20: 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
cd30: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
cd40: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
cd50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
cd60: 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66  * This array def
cd70: 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20  ines hard upper 
cd80: 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20  bounds on limit 
cd90: 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20  values.  The.** 
cda0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74  initializer must
cdb0: 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63   be kept in sync
cdc0: 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
cdd0: 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66  _LIMIT_*.** #def
cde0: 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e  ines in sqlite3.
cdf0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  h..*/.static con
ce00: 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69  st int aHardLimi
ce10: 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45  t[] = {.  SQLITE
ce20: 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _MAX_LENGTH,.  S
ce30: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
ce40: 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
ce50: 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c  AX_COLUMN,.  SQL
ce60: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
ce70: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
ce80: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
ce90: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
cea0: 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45  DBE_OP,.  SQLITE
ceb0: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
cec0: 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  G,.  SQLITE_MAX_
ced0: 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49  ATTACHED,.  SQLI
cee0: 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
cef0: 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  ERN_LENGTH,.  SQ
cf00: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
cf10: 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49  E_NUMBER,.  SQLI
cf20: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
cf30: 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  EPTH,.};../*.** 
cf40: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61  Make sure the ha
cf50: 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65  rd limits are se
cf60: 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20  t to reasonable 
cf70: 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51  values.*/.#if SQ
cf80: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c  LITE_MAX_LENGTH<
cf90: 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
cfa0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75  TE_MAX_LENGTH mu
cfb0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
cfc0: 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
cfd0: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
cfe0: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
cff0: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
d000: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
d010: 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
d020: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d030: 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49  _SQL_LENGTH>SQLI
d040: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20  TE_MAX_LENGTH.# 
d050: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
d060: 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
d070: 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20   not be greater 
d080: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
d090: 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69  LENGTH.#endif.#i
d0a0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  f SQLITE_MAX_COM
d0b0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23  POUND_SELECT<2.#
d0c0: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
d0d0: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
d0e0: 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  T must be at lea
d0f0: 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 2.#endif.#if 
d100: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
d110: 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51  OP<40.# error SQ
d120: 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
d130: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
d140: 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  t 40.#endif.#if 
d150: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
d160: 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c  ION_ARG<0 || SQL
d170: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
d180: 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f  _ARG>1000.# erro
d190: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
d1a0: 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
d1b0: 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
d1c0: 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  1000.#endif.#if 
d1d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
d1e0: 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  HED<0 || SQLITE_
d1f0: 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 36 32 0a  MAX_ATTACHED>62.
d200: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
d210: 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
d220: 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
d230: 64 20 36 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  d 62.#endif.#if 
d240: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
d250: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
d260: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
d270: 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
d280: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
d290: 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
d2a0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d2b0: 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20  _COLUMN>32767.# 
d2c0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
d2d0: 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74  _COLUMN must not
d2e0: 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65   exceed 32767.#e
d2f0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
d300: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
d310: 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
d320: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
d330: 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  EPTH must be at 
d340: 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a  least 1.#endif..
d350: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
d360: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
d370: 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
d380: 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
d390: 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
d3a0: 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
d3b0: 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
d3c0: 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
d3d0: 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
d3e0: 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
d3f0: 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
d400: 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
d410: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
d420: 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
d430: 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
d440: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
d450: 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
d460: 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
d470: 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
d480: 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
d490: 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
d4a0: 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
d4b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
d4c0: 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
d4d0: 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
d4e0: 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a  oldLimit;...  /*
d4f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d500: 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20  30189-54097 For 
d510: 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67  each limit categ
d520: 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  ory SQLITE_LIMIT
d530: 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65  _NAME.  ** there
d540: 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72   is a hard upper
d550: 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f   bound set at co
d560: 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20  mpile-time by a 
d570: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20  C preprocessor. 
d580: 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64   ** macro called
d590: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45   SQLITE_MAX_NAME
d5a0: 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22  . (The "_LIMIT_"
d5b0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20   in the name is 
d5c0: 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20  changed to.  ** 
d5d0: 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20  "_MAX_".).  */. 
d5e0: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
d5f0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
d600: 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
d610: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
d620: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
d630: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
d640: 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  _SQL_LENGTH]==SQ
d650: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
d660: 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
d670: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d680: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
d690: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  ==SQLITE_MAX_COL
d6a0: 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UMN );.  assert(
d6b0: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d6c0: 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
d6d0: 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
d6e0: 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20  _EXPR_DEPTH );. 
d6f0: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
d700: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
d710: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d720: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  ]==SQLITE_MAX_CO
d730: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a  MPOUND_SELECT);.
d740: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
d750: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
d760: 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49  T_VDBE_OP]==SQLI
d770: 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29  TE_MAX_VDBE_OP )
d780: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d790: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d7a0: 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
d7b0: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  ]==SQLITE_MAX_FU
d7c0: 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20  NCTION_ARG );.  
d7d0: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
d7e0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
d7f0: 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54  ATTACHED]==SQLIT
d800: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
d810: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d820: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d830: 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
d840: 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20  _LENGTH]==.     
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
d880: 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
d890: 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  N_LENGTH );.  as
d8a0: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
d8b0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
d8c0: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d  RIABLE_NUMBER]==
d8d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
d8e0: 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61  BLE_NUMBER);.  a
d8f0: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
d900: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  t[SQLITE_LIMIT_T
d910: 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53  RIGGER_DEPTH]==S
d920: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
d930: 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
d940: 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ert( SQLITE_LIMI
d950: 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3d  T_TRIGGER_DEPTH=
d960: 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  =(SQLITE_N_LIMIT
d970: 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c  -1) );...  if( l
d980: 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
d990: 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
d9a0: 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
d9b0: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
d9c0: 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
d9d0: 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
d9e0: 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34     /* IMP: R-524
da10: 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20  76-28732 */.    
da20: 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61  if( newLimit>aHa
da30: 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
da40: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d   ){.      newLim
da50: 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b  it = aHardLimit[
da60: 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d  limitId];  /* IM
da70: 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34  P: R-51463-25634
da80: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   */.    }.    db
da90: 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
daa0: 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  ] = newLimit;.  
dab0: 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69  }.  return oldLi
dac0: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
dad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
dae0: 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a   R-53341-35419 *
daf0: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  /.}../*.** This 
db00: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
db10: 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55   to parse both U
db20: 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20  RIs and non-URI 
db30: 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64  filenames passed
db40: 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20   by the.** user 
db50: 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  to API functions
db60: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
db70: 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
db80: 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61  v2(), and for da
db90: 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73  tabase.** URIs s
dba0: 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
dbb0: 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65   of ATTACH state
dbc0: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
dbd0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
dbe0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
dbf0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
dc00: 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28  the VFS to use (
dc10: 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20  or.** a NULL to 
dc20: 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61  signify the defa
dc30: 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20  ult VFS) if the 
dc40: 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  URI does not con
dc50: 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22  tain a "vfs=xxx"
dc60: 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
dc70: 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ter. The second 
dc80: 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  argument contain
dc90: 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f  s the URI (or no
dca0: 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a  n-URI filename).
dcb0: 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20  ** itself. When 
dcc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
dcd0: 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c   called the *pFl
dce0: 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f  ags variable sho
dcf0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74  uld contain.** t
dd00: 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73  he default flags
dd10: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
dd20: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74  abase handle wit
dd30: 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f  h. The value sto
dd40: 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67  red in.** *pFlag
dd50: 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64  s may be updated
dd60: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
dd70: 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c  g if the URI fil
dd80: 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a  ename contains .
dd90: 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f  ** "cache=xxx" o
dda0: 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65  r "mode=xxx" que
ddb0: 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ry parameters..*
ddc0: 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
ddd0: 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
dde0: 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
ddf0: 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69  is case *ppVfs i
de00: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
de10: 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61  o.** the VFS tha
de20: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
de30: 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
de40: 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46  abase file. *pzF
de50: 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  ile is set to.**
de60: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
de70: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
de80: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
de90: 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69  le to open. It i
dea0: 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
deb0: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
dec0: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
ded0: 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65  ally call sqlite
dee0: 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65  3_free() to rele
def0: 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
df00: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  er..**.** If an 
df10: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
df20: 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  en an SQLite err
df30: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
df40: 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73  ned and *pzErrMs
df50: 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20  g.** may be set 
df60: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
df70: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
df80: 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
df90: 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65  age error .** me
dfa0: 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
dfb0: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
dfc0: 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
dfd0: 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
dfe0: 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
dff0: 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  er by calling sq
e000: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
e010: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73  .int sqlite3Pars
e020: 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68  eUri(.  const ch
e030: 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c  ar *zDefaultVfs,
e040: 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
e050: 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73  o use if no "vfs
e060: 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69  =xxx" query opti
e070: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
e080: 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20  ar *zUri,       
e090: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
e0a0: 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f  erminated URI to
e0b0: 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69   parse */.  unsi
e0c0: 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73  gned int *pFlags
e0d0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
e0e0: 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50  N/OUT: SQLITE_OP
e0f0: 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EN_XXX flags */.
e100: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a    sqlite3_vfs **
e110: 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  ppVfs,          
e120: 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f    /* OUT: VFS to
e130: 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20   use */ .  char 
e140: 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  **pzFile,       
e150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
e160: 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70  T: Filename comp
e170: 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a  onent of URI */.
e180: 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
e190: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
e1a0: 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
e1b0: 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d  message (if rc!=
e1c0: 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b  SQLITE_OK) */.){
e1d0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e1e0: 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65  TE_OK;.  unsigne
e1f0: 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70  d int flags = *p
e200: 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63  Flags;.  const c
e210: 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66  har *zVfs = zDef
e220: 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20  aultVfs;.  char 
e230: 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63  *zFile;.  char c
e240: 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73  ;.  int nUri = s
e250: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
e260: 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Uri);..  assert(
e270: 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b   *pzErrMsg==0 );
e280: 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20  ..  if( ((flags 
e290: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
e2a0: 49 29 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  I) || sqlite3Glo
e2b0: 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
e2c0: 72 69 29 20 0a 20 20 20 26 26 20 6e 55 72 69 3e  ri) .   && nUri>
e2d0: 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72  =5 && memcmp(zUr
e2e0: 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d  i, "file:", 5)==
e2f0: 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  0 .  ){.    char
e300: 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20   *zOpt;.    int 
e310: 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  eState;         
e320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
e330: 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70  ser state when p
e340: 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20  arsing URI */.  
e350: 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20    int iIn;      
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74  /* Input charact
e380: 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
e390: 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20  int iOut = 0;   
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e3b0: 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65   Output characte
e3c0: 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
e3d0: 6e 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b  nt nByte = nUri+
e3e0: 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2;           /* 
e3f0: 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
e400: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20  o allocate */.. 
e410: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
e420: 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  the SQLITE_OPEN_
e430: 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20  URI flag is set 
e440: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74  to indicate to t
e450: 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20  he VFS xOpen .  
e460: 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74    ** method that
e470: 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78   there may be ex
e480: 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66  tra parameters f
e490: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c  ollowing the fil
e4a0: 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20  e-name.  */.    
e4b0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
e4c0: 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66  OPEN_URI;..    f
e4d0: 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55  or(iIn=0; iIn<nU
e4e0: 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65  ri; iIn++) nByte
e4f0: 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d   += (zUri[iIn]==
e500: 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  '&');.    zFile 
e510: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
e520: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
e530: 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
e540: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
e550: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
e560: 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75  he scheme and au
e570: 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73  thority segments
e580: 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a   of the URI. */.
e590: 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d      if( zUri[5]=
e5a0: 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d  ='/' && zUri[6]=
e5b0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='/' ){.      iI
e5c0: 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69  n = 7;.      whi
e5d0: 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
e5e0: 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20   zUri[iIn]!='/' 
e5f0: 29 20 69 49 6e 2b 2b 3b 0a 0a 20 20 20 20 20 20  ) iIn++;..      
e600: 69 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69  if( iIn!=7 && (i
e610: 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70  In!=16 || memcmp
e620: 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a  ("localhost", &z
e630: 55 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20  Uri[7], 9)) ){. 
e640: 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
e650: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
e660: 74 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20  tf("invalid uri 
e670: 61 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22  authority: %.*s"
e680: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
e690: 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b  In-7, &zUri[7]);
e6a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
e6b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
e6c0: 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
e6d0: 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ri_out;.      }.
e6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e6f0: 20 69 49 6e 20 3d 20 35 3b 0a 20 20 20 20 7d 0a   iIn = 5;.    }.
e700: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
e710: 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e   filename and an
e720: 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  y query paramete
e730: 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c  rs into the zFil
e740: 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a  e buffer. .    *
e750: 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73 63  * Decode %HH esc
e760: 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20  ape codes along 
e770: 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a  the way. .    **
e780: 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74  .    ** Within t
e790: 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62  his loop, variab
e7a0: 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62 65  le eState may be
e7b0: 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20   set to 0, 1 or 
e7c0: 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20  2, depending.   
e7d0: 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69   ** on the parsi
e7e0: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66  ng context. As f
e7f0: 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20  ollows:.    **. 
e800: 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69     **   0: Parsi
e810: 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20  ng file-name..  
e820: 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e    **   1: Parsin
e830: 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f  g name section o
e840: 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
e850: 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
e860: 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73      **   2: Pars
e870: 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f  ing value sectio
e880: 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
e890: 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
e8a0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53  r..    */.    eS
e8b0: 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68  tate = 0;.    wh
e8c0: 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
e8d0: 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
e8e0: 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b  ' ){.      iIn++
e8f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
e900: 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  %' .       && sq
e910: 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
e920: 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20  ri[iIn]) .      
e930: 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
e940: 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29  git(zUri[iIn+1])
e950: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
e960: 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28     int octet = (
e970: 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
e980: 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20  zUri[iIn++]) << 
e990: 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65  4);.        octe
e9a0: 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54  t += sqlite3HexT
e9b0: 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
e9c0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
e9d0: 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20  rt( octet>=0 && 
e9e0: 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20  octet<256 );.   
e9f0: 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d       if( octet==
ea00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
ea10: 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
ea20: 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30   taken when "%00
ea30: 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69 6e  " appears within
ea40: 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69   the URI. In thi
ea50: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
ea60: 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c  ase we ignore al
ea70: 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72 65  l text in the re
ea80: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70  mainder of the p
ea90: 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20  ath, name or.   
eaa0: 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
eab0: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
eac0: 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72  parsed. So ignor
ead0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
eae0: 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20 20  aracter.        
eaf0: 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f    ** and skip to
eb00: 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22   the next "?", "
eb10: 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70  =" or "&", as ap
eb20: 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20  propriate. */.  
eb30: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
eb40: 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
eb50: 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20  0 && c!='#' .   
eb60: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
eb70: 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27  State!=0 || c!='
eb80: 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ?').            
eb90: 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31 20    && (eState!=1 
eba0: 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21  || (c!='=' && c!
ebb0: 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20 20  ='&')).         
ebc0: 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
ebd0: 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20  =2 || c!='&').  
ebe0: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
ebf0: 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20         iIn++;.  
ec00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ec10: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
ec20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ec30: 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20  c = octet;.     
ec40: 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
ec50: 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20  e==1 && (c=='&' 
ec60: 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20  || c=='=') ){.  
ec70: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
ec80: 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  iOut-1]==0 ){.  
ec90: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d          /* An em
eca0: 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e  pty option name.
ecb0: 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74   Ignore this opt
ecc0: 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  ion altogether. 
ecd0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
ece0: 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
ecf0: 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20   zUri[iIn]!='#' 
ed00: 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d  && zUri[iIn-1]!=
ed10: 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '&' ) iIn++;.   
ed20: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
ed30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ed40: 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b     if( c=='&' ){
ed50: 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65  .          zFile
ed60: 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
ed70: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ed80: 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
ed90: 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 2;.        }.
eda0: 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
edb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
edc0: 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d  eState==0 && c==
edd0: 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d  '?') || (eState=
ede0: 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b  =2 && c=='&') ){
edf0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
ee00: 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
ee10: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
ee20: 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
ee30: 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = c;.    }.    i
ee40: 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a  f( eState==1 ) z
ee50: 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
ee60: 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
ee70: 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
ee80: 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
ee90: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a   = '\0';..    /*
eea0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   Check if there 
eeb0: 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73  were any options
eec0: 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74 20   specified that 
eed0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70  should be interp
eee0: 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65  reted .    ** he
eef0: 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74  re. Options that
ef00: 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64   are interpreted
ef10: 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76   here include "v
ef20: 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68  fs" and those th
ef30: 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  at.    ** corres
ef40: 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68  pond to flags th
ef50: 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  at may be passed
ef60: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
ef70: 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a  open_v2().    **
ef80: 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20   method. */.    
ef90: 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71  zOpt = &zFile[sq
efa0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
efb0: 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ile)+1];.    whi
efc0: 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20  le( zOpt[0] ){. 
efd0: 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20       int nOpt = 
efe0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
eff0: 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61  zOpt);.      cha
f000: 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b  r *zVal = &zOpt[
f010: 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69  nOpt+1];.      i
f020: 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
f030: 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b  3Strlen30(zVal);
f040: 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74  ..      if( nOpt
f050: 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76  ==3 && memcmp("v
f060: 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30  fs", zOpt, 3)==0
f070: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73   ){.        zVfs
f080: 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = zVal;.      }
f090: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
f0a0: 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a  ruct OpenMode {.
f0b0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
f0c0: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20  char *z;.       
f0d0: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
f0e0: 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20       } *aMode = 
f0f0: 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
f100: 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a  *zModeType = 0;.
f110: 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b          int mask
f120: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
f130: 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  t limit = 0;..  
f140: 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
f150: 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63  5 && memcmp("cac
f160: 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30  he", zOpt, 5)==0
f170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
f180: 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
f190: 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b  Mode aCacheMode[
f1a0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
f1b0: 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53    { "shared",  S
f1c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
f1d0: 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
f1e0: 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74 65        { "private
f1f0: 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
f200: 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
f210: 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
f220: 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
f230: 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
f240: 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   = SQLITE_OPEN_S
f250: 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54  HAREDCACHE|SQLIT
f260: 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
f270: 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61  CHE;.          a
f280: 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64  Mode = aCacheMod
f290: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
f2a0: 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  it = mask;.     
f2b0: 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
f2c0: 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20   "cache";.      
f2d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
f2e0: 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d  nOpt==4 && memcm
f2f0: 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20  p("mode", zOpt, 
f300: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
f310: 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
f320: 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d   OpenMode aOpenM
f330: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
f340: 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53        { "ro",  S
f350: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
f360: 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  NLY },.         
f370: 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49     { "rw",  SQLI
f380: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
f390: 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  E }, .          
f3a0: 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54    { "rwc", SQLIT
f3b0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
f3c0: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
f3d0: 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20  REATE },.       
f3e0: 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
f3f0: 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
f400: 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
f410: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
f420: 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  Y|SQLITE_OPEN_RE
f430: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
f440: 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
f450: 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f        aMode = aO
f460: 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  penMode;.       
f470: 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20     limit = mask 
f480: 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  & flags;.       
f490: 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
f4a0: 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20  access";.       
f4b0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
f4c0: 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  aMode ){.       
f4d0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
f4e0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30      int mode = 0
f4f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
f500: 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  i=0; aMode[i].z;
f510: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
f520: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f530: 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20   = aMode[i].z;. 
f540: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
f550: 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  Val==sqlite3Strl
f560: 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65  en30(z) && 0==me
f570: 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56  mcmp(zVal, z, nV
f580: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
f590: 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64       mode = aMod
f5a0: 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20  e[i].mode;.     
f5b0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
f5d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f5e0: 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20      if( mode==0 
f5f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
f600: 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
f610: 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
f620: 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22  uch %s mode: %s"
f630: 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61  , zModeType, zVa
f640: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
f650: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
f660: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  R;.            g
f670: 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
f680: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
f690: 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64           if( mod
f6a0: 65 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  e>limit ){.     
f6b0: 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
f6c0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
f6d0: 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20  tf("%s mode not 
f6e0: 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20  allowed: %s",.  
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c        zModeType,
f720: 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
f730: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f740: 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  PERM;.          
f750: 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
f760: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
f770: 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  }.          flag
f780: 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61  s = (flags & ~ma
f790: 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20  sk) | mode;.    
f7a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
f7b0: 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61       zOpt = &zVa
f7c0: 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d  l[nVal+1];.    }
f7d0: 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ..  }else{.    z
f7e0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
f7f0: 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20  alloc(nUri+2);. 
f800: 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
f810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
f820: 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  MEM;.    memcpy(
f830: 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72  zFile, zUri, nUr
f840: 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55  i);.    zFile[nU
f850: 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ri] = '\0';.    
f860: 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20  zFile[nUri+1] = 
f870: 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  '\0';.  }..  *pp
f880: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
f890: 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20  s_find(zVfs);.  
f8a0: 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b  if( *ppVfs==0 ){
f8b0: 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
f8c0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
f8d0: 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25  ("no such vfs: %
f8e0: 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72  s", zVfs);.    r
f8f0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
f900: 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69  ;.  }. parse_uri
f910: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
f920: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f930: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
f940: 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  ile);.    zFile 
f950: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61  = 0;.  }.  *pFla
f960: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70  gs = flags;.  *p
f970: 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20  zFile = zFile;. 
f980: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
f990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
f9a0: 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  ne does the work
f9b0: 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61   of opening a da
f9c0: 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66  tabase on behalf
f9d0: 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   of.** sqlite3_o
f9e0: 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65  pen() and sqlite
f9f0: 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20  3_open16(). The 
fa00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
fa10: 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a  e "zFilename"  .
fa20: 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f  ** is UTF-8 enco
fa30: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
fa40: 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  nt openDatabase(
fa50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fa60: 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74  Filename, /* Dat
fa70: 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55  abase filename U
fa80: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a  TF-8 encoded */.
fa90: 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
faa0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  ,        /* OUT:
fab0: 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61   Returned databa
fac0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75  se handle */.  u
fad0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
fae0: 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69  s,    /* Operati
faf0: 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20  onal flags */.  
fb00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
fb10: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
fb20: 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
fb30: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
fb40: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
fb50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
fb60: 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64  e allocated hand
fb70: 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
fb80: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fba0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
fbb0: 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66   int isThreadsaf
fbc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
fbd0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72   /* True for thr
fbe0: 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69  eadsafe connecti
fbf0: 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
fc00: 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Open = 0;       
fc10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
fc20: 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  name argument to
fc30: 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70   pass to BtreeOp
fc40: 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  en() */.  char *
fc50: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
fc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
fc70: 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
fc80: 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
fc90: 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62 20 3d 20  ) */..  *ppDb = 
fca0: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
fcb0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
fcc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
fcd0: 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
fce0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
fcf0: 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  c;.#endif..  /* 
fd00: 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69  Only allow sensi
fd10: 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
fd20: 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
fd30: 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20  flags argument. 
fd40: 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20   .  ** Throw an 
fd50: 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e  error if any non
fd60: 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69  -sense combinati
fd70: 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  on is used.  If 
fd80: 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62  we.  ** do not b
fd90: 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d  lock illegal com
fda0: 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20  binations here, 
fdb0: 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72  it could trigger
fdc0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73  .  ** assert() s
fdd0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65  tatements in dee
fde0: 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e  per layers.  Sen
fdf0: 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
fe00: 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a  ns.  ** are:.  *
fe10: 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49  *.  **  1:  SQLI
fe20: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
fe30: 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54  .  **  2:  SQLIT
fe40: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
fe50: 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54  .  **  6:  SQLIT
fe60: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
fe70: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
fe80: 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73  REATE.  */.  ass
fe90: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
fea0: 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78  _READONLY  == 0x
feb0: 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  01 );.  assert( 
fec0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
fed0: 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b  WRITE == 0x02 );
fee0: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
fef0: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20  E_OPEN_CREATE   
ff00: 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65   == 0x04 );.  te
ff10: 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
ff20: 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20  gs&7))==0x02 ); 
ff30: 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20  /* READONLY */. 
ff40: 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
ff50: 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20  flags&7))==0x04 
ff60: 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
ff70: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
ff80: 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
ff90: 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x40 ); /* READWR
ffa0: 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a  ITE | CREATE */.
ffb0: 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67    if( ((1<<(flag
ffc0: 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30  s&7)) & 0x46)==0
ffd0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ffe0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20  _MISUSE_BKPT;.. 
fff0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
10000 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
10010 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
10020 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
10030 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
10040 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
10050 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
10060 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
10070 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
10080 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
10090 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
100a0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
100b0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
100c0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
100d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
100e0 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
100f0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
10100 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  & SQLITE_OPEN_PR
10110 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20  IVATECACHE ){.  
10120 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
10130 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
10140 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CHE;.  }else if(
10150 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
10160 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
10170 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66  Enabled ){.    f
10180 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
10190 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
101a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
101b0 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66  e harmful bits f
101c0 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61  rom the flags pa
101d0 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a  rameter.  **.  *
101e0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  * The SQLITE_OPE
101f0 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51  N_NOMUTEX and SQ
10200 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
10210 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20  TEX flags were. 
10220 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69   ** dealt with i
10230 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
10240 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69  ode block.  Besi
10250 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f  des these, the o
10260 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69  nly.  ** valid i
10270 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73  nput flags for s
10280 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
10290 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   are SQLITE_OPEN
102a0 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20  _READONLY,.  ** 
102b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
102c0 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  WRITE, SQLITE_OP
102d0 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54  EN_CREATE, SQLIT
102e0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
102f0 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  HE,.  ** SQLITE_
10300 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
10310 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65  E, and some rese
10320 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65  rved bits.  Sile
10330 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
10340 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
10350 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
10360 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
10370 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
10380 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
10390 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
103a0 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
103b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
103c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
103e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
103f0 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
10400 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10410 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
10420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10430 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
10440 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
10450 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
10460 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
10470 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
10480 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
10490 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
104b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
104c0 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
104d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
104e0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
104f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10500 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
10510 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
10520 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
10530 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
10540 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
10550 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
10560 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
10570 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
10580 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
10590 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
105a0 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
105b0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
105c0 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
105d0 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74  e ){.    db->mut
105e0 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
105f0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
10600 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
10610 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65      if( db->mute
10620 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x==0 ){.      sq
10630 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
10640 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20        db = 0;.  
10650 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
10660 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
10670 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10680 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10690 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
106a0 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62   0xff;.  db->nDb
106b0 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69   = 2;.  db->magi
106c0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
106d0 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62  _BUSY;.  db->aDb
106e0 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
106f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ;..  assert( siz
10700 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d  eof(db->aLimit)=
10710 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d  =sizeof(aHardLim
10720 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  it) );.  memcpy(
10730 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72  db->aLimit, aHar
10740 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64  dLimit, sizeof(d
10750 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64  b->aLimit));.  d
10760 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
10770 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74  1;.  db->nextAut
10780 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d  ovac = -1;.  db-
10790 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
107a0 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  0;.  db->flags |
107b0 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
107c0 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
107d0 41 75 74 6f 49 6e 64 65 78 20 7c 20 53 51 4c 49  AutoIndex | SQLI
107e0 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
107f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
10800 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c  ULT_FILE_FORMAT<
10810 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4.              
10820 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61     | SQLITE_Lega
10830 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66  cyFileFmt.#endif
10840 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10850 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
10860 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  SION.           
10870 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
10880 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e  oadExtension.#en
10890 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  dif.#if SQLITE_D
108a0 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45  EFAULT_RECURSIVE
108b0 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20  _TRIGGERS.      
108c0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
108d0 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a  ITE_RecTriggers.
108e0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
108f0 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
10900 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20  T_FOREIGN_KEYS) 
10910 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  && SQLITE_DEFAUL
10920 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20  T_FOREIGN_KEYS. 
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  | SQLITE_Foreign
10950 4b 65 79 73 0a 23 65 6e 64 69 66 0a 20 20 20 20  Keys.#endif.    
10960 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73    ;.  sqlite3Has
10970 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  hInit(&db->aColl
10980 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
10990 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
109a0 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
109b0 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d  HashInit(&db->aM
109c0 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
109d0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66    /* Add the def
109e0 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
109f0 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20  equence BINARY. 
10a00 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72  BINARY works for
10a10 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a   both UTF-8.  **
10a20 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20   and UTF-16, so 
10a30 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f  add a version fo
10a40 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20  r each to avoid 
10a50 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a  any unnecessary.
10a60 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
10a70 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72  . The only error
10a80 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20   that can occur 
10a90 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63  here is a malloc
10aa0 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f  () failure..  */
10ab0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
10ac0 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
10ad0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
10ae0 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
10af0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
10b00 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75         binCollFu
10b10 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
10b20 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
10b30 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
10b40 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f 43  TF16BE, SQLITE_C
10b50 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20  OLL_BINARY, 0,. 
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
10b80 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
10b90 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
10ba0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
10bb0 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49  , SQLITE_COLL_BI
10bc0 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20  NARY, 0,.       
10bd0 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f             binCo
10be0 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
10bf0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
10c00 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54  , "RTRIM", SQLIT
10c10 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 43  E_UTF8, SQLITE_C
10c20 4f 4c 4c 5f 55 53 45 52 2c 20 28 76 6f 69 64 2a  OLL_USER, (void*
10c30 29 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )1,.            
10c40 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e        binCollFun
10c50 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
10c60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10c70 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
10c80 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
10c90 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
10ca0 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
10cb0 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
10cc0 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20  "BINARY", 0);.  
10cd0 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
10ce0 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
10cf0 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46  * Also add a UTF
10d00 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74  -8 case-insensit
10d10 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ive collation se
10d20 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65  quence. */.  cre
10d30 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
10d40 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54   "NOCASE", SQLIT
10d50 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 43  E_UTF8, SQLITE_C
10d60 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30 2c 0a 20  OLL_NOCASE, 0,. 
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
10d90 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  Func, 0);..  /* 
10da0 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61  Parse the filena
10db0 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e  me/URI argument.
10dc0 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
10dd0 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
10de0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  c = sqlite3Parse
10df0 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e  Uri(zVfs, zFilen
10e00 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62  ame, &flags, &db
10e10 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20  ->pVfs, &zOpen, 
10e20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
10e30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10e40 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
10e50 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d  LITE_NOMEM ) db-
10e60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
10e70 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  1;.    sqlite3Er
10e80 72 6f 72 28 64 62 2c 20 72 63 2c 20 7a 45 72 72  ror(db, rc, zErr
10e90 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
10ea0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
10eb0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
10ec0 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  sg);.    goto op
10ed0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
10ee0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63   /* Open the bac
10ef0 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72  kend database dr
10f00 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73  iver */.  rc = s
10f10 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
10f20 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c  db->pVfs, zOpen,
10f30 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d   db, &db->aDb[0]
10f40 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20  .pBt, 0,.       
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
10f70 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20  OPEN_MAIN_DB);. 
10f80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10f90 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
10fa0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
10fb0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
10fc0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
10fd0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10fe0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
10ff0 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  0);.    goto ope
11000 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
11010 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
11020 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
11030 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
11040 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
11050 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
11060 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
11070 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a  t(db, 0);...  /*
11080 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66   The default saf
11090 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety_level for th
110a0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
110b0 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74  is 'full'; for t
110c0 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
110d0 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e  abase it is 'NON
110e0 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  E'. This matches
110f0 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
11100 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a   defaults.  .  *
11110 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a  /.  db->aDb[0].z
11120 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
11130 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
11140 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20  ty_level = 3;.  
11150 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65  db->aDb[1].zName
11160 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
11170 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
11180 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d  evel = 1;..  db-
11190 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
111a0 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
111b0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
111c0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
111d0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
111e0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
111f0 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
11200 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
11210 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
11220 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
11230 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
11240 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
11250 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
11260 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
11270 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
11280 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
11290 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
112a0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
112b0 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
112c0 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
112d0 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
112e0 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
112f0 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
11300 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
11310 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
11320 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
11330 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
11340 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
11350 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
11360 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
11370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
11380 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66  rrcode(db);.  if
11390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
113a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
113b0 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66  db_out;.  }..#if
113c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
113d0 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
113e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
113f0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
11400 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
11410 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
11420 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
11430 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
11440 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
11450 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
11460 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
11470 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
11480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11490 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
114a0 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
114b0 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
114c0 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
114d0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
114e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
114f0 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20  ABLE_FTS3.  if( 
11500 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
11510 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
11520 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
11530 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64  qlite3Fts3Init(d
11540 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
11550 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11560 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21  ABLE_ICU.  if( !
11570 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11580 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
11590 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
115a0 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
115b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
115c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
115d0 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
115e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
115f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
11600 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
11610 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
11620 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
11630 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
11640 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  , rc, 0);..  /* 
11650 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
11660 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
11670 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
11680 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
11690 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
116a0 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
116b0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
116c0 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
116d0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
116e0 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
116f0 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
11700 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
11710 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
11720 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
11730 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
11740 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
11750 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
11760 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
11770 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
11780 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
11790 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
117a0 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
117b0 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
117e0 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
117f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62  endif..  /* Enab
11800 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
11810 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
11820 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
11830 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
11840 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
11850 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
11880 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
11890 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  side);..  sqlite
118a0 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
118b0 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  oint(db, SQLITE_
118c0 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f  DEFAULT_WAL_AUTO
118d0 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70  CHECKPOINT);..op
118e0 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  endb_out:.  sqli
118f0 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b  te3_free(zOpen);
11900 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
11910 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
11920 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
11930 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  dsafe==0 || sqli
11940 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11950 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
11960 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
11970 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11980 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
11990 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
119a0 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
119b0 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  b!=0 || rc==SQLI
119c0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66  TE_NOMEM );.  if
119d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
119e0 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
119f0 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
11a00 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
11a10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11a20 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
11a30 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
11a40 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a  IC_SICK;.  }.  *
11a50 70 70 44 62 20 3d 20 64 62 3b 0a 20 20 72 65 74  ppDb = db;.  ret
11a60 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78  urn sqlite3ApiEx
11a70 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  it(0, rc);.}../*
11a80 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
11a90 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
11aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
11ab0 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
11ac0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  r *zFilename, . 
11ad0 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20   sqlite3 **ppDb 
11ae0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
11af0 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
11b00 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  ame, ppDb,.     
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
11b30 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
11b40 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
11b50 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
11b60 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20  pen_v2(.  const 
11b70 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
11b80 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
11b90 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a  lename (UTF-8) *
11ba0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
11bb0 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Db,         /* O
11bc0 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61  UT: SQLite db ha
11bd0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ndle */.  int fl
11be0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
11bf0 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20    /* Flags */.  
11c00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
11c10 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
11c20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f  of VFS module to
11c30 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   use */.){.  ret
11c40 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
11c50 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  (filename, ppDb,
11c60 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66   (unsigned int)f
11c70 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
11c80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11c90 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
11ca0 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
11cb0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
11cc0 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
11cd0 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
11ce0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
11cf0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
11d00 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
11d10 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
11d20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
11d30 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
11d40 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
11d50 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
11d60 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
11d70 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  ..  assert( zFil
11d80 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  ename );.  asser
11d90 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70  t( ppDb );.  *pp
11da0 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
11db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11dc0 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
11dd0 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
11de0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
11df0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
11e00 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
11e10 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
11e20 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
11e30 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65  (pVal, -1, zFile
11e40 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  name, SQLITE_UTF
11e50 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45  16NATIVE, SQLITE
11e60 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c  _STATIC);.  zFil
11e70 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  ename8 = sqlite3
11e80 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
11e90 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
11ea0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29  if( zFilename8 )
11eb0 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  {.    rc = openD
11ec0 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
11ed0 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  e8, ppDb,.      
11ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ef0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11f00 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
11f10 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
11f20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44      assert( *ppD
11f30 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b || rc==SQLITE_
11f40 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28  NOMEM );.    if(
11f50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11f60 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  & !DbHasProperty
11f70 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63  (*ppDb, 0, DB_Sc
11f80 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20  hemaLoaded) ){. 
11f90 20 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20       ENC(*ppDb) 
11fa0 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
11fb0 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  TIVE;.    }.  }e
11fc0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
11fd0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
11fe0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
11ff0 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
12000 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78  urn sqlite3ApiEx
12010 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e  it(0, rc);.}.#en
12020 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
12030 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
12040 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
12050 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
12060 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
12070 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
12080 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12090 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
120a0 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
120b0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
120c0 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
120d0 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
120e0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
120f0 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
12100 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
12110 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
12120 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
12130 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
12140 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
12150 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
12160 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
12170 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
12180 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
12190 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  nc, SQLITE_COLL_
121a0 55 53 45 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d  USER, pCtx, xCom
121b0 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d  pare, 0);.  rc =
121c0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
121d0 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
121e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
121f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
12200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12210 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
12220 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
12230 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
12240 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
12250 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
12260 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
12270 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  v2(.  sqlite3* d
12280 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
12290 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
122a0 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
122b0 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
122c0 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
122d0 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
122e0 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
122f0 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
12300 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
12310 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12320 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12330 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
12340 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
12350 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
12360 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
12370 2c 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54  , (u8)enc, SQLIT
12380 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74  E_COLL_USER, pCt
12390 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65  x, xCompare, xDe
123a0 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
123b0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
123c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
123d0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
123e0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
123f0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
12400 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
12410 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
12420 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
12430 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
12440 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12450 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
12460 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
12470 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
12480 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76  * db, .  const v
12490 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  oid *zName,.  in
124a0 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
124b0 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
124c0 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
124d0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
124e0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
124f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12500 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
12510 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33  Name8;.  sqlite3
12520 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
12530 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
12540 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
12550 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38  iled );.  zName8
12560 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
12570 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  o8(db, zName, -1
12580 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
12590 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61  TIVE);.  if( zNa
125a0 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
125b0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
125c0 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29  db, zName8, (u8)
125d0 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c  enc, SQLITE_COLL
125e0 5f 55 53 45 52 2c 20 70 43 74 78 2c 20 78 43 6f  _USER, pCtx, xCo
125f0 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73  mpare, 0);.    s
12600 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
12610 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20   zName8);.  }.  
12620 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
12630 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
12640 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12650 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
12660 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
12670 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12680 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
12690 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
126a0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
126b0 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
126c0 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
126d0 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
126e0 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
126f0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
12700 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
12710 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
12720 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
12730 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28  ollation_needed(
12740 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
12750 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
12760 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
12770 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76  (*xCollNeeded)(v
12780 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
12790 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
127a0 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c   char*).){.  sql
127b0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
127c0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
127d0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
127e0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
127f0 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
12800 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
12810 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
12820 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
12830 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12840 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12860 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
12870 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
12880 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
12890 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
128a0 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
128b0 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
128c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
128d0 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
128e0 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
128f0 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
12900 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
12910 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
12920 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
12930 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
12940 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
12950 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
12960 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
12970 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
12980 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
12990 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
129a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
129b0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
129c0 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
129d0 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
129e0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
129f0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
12a00 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
12a10 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
12a20 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
12a30 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12a40 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
12a50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
12a60 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12a70 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
12a80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12a90 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
12aa0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12ab0 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
12ac0 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
12ad0 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
12ae0 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
12af0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
12b00 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
12b10 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
12b20 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
12b30 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
12b40 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
12b50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12b60 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
12b70 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
12b80 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
12b90 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
12ba0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
12bb0 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
12bc0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
12bd0 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
12be0 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
12bf0 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
12c00 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
12c10 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
12c20 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
12c30 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
12c40 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
12c50 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
12c60 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a  or ROLLBACK..**.
12c70 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20  ******* THIS IS 
12c80 41 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20  AN EXPERIMENTAL 
12c90 41 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45  API AND IS SUBJE
12ca0 43 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a  CT TO CHANGE ***
12cb0 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ***.*/.int sqlit
12cc0 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
12cd0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
12ce0 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
12cf0 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
12d00 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
12d10 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
12d20 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
12d30 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
12d40 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
12d50 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
12d60 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
12d70 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62  IOERR and possib
12d80 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
12d90 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
12da0 65 79 20 73 65 72 76 65 72 20 74 77 6f 20 70 75  ey server two pu
12db0 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
12dc0 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
12dd0 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
12de0 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
12df0 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
12e00 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
12e10 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
12e20 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
12e30 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
12e40 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
12e50 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
12e60 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
12e70 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
12e80 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
12e90 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
12ea0 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
12eb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12ec0 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
12ed0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
12ee0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
12ef0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
12f00 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
12f10 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
12f20 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
12f30 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
12f40 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
12f50 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
12f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
12f70 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
12f80 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
12f90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12fa0 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
12fb0 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
12fc0 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
12fd0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
12fe0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
12ff0 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
13000 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
13010 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
13020 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
13030 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
13040 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
13050 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
13060 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
13070 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13080 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
13090 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
130a0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
130b0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
130c0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
130d0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
130e0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
130f0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
13100 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
13110 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
13120 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
13130 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
13140 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
13150 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
13160 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
13170 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
13180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13190 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
131a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
131b0 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
131c0 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
131d0 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
131e0 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
131f0 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
13200 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
13210 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
13220 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
13230 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
13240 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
13250 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
13260 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
13270 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
13280 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
13290 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
132a0 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
132b0 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
132c0 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
132d0 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
132e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
132f0 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
13300 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
13310 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
13320 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
13330 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
13340 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
13350 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
13360 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
13370 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74  TADATA.int sqlit
13380 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
13390 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
133a0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
133b0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
133c0 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
133d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
133e0 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
133f0 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
13400 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
13410 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
13420 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
13430 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
13440 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
13450 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
13460 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
13470 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
13480 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
13490 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
134a0 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
134b0 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
134c0 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
134d0 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
134e0 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
134f0 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
13500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
13510 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
13520 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
13530 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
13540 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
13550 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
13560 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
13570 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
13580 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
135a0 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
135b0 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
135c0 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
135d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
135e0 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
135f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
13600 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
13610 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
13620 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  l;..  char const
13630 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
13640 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
13650 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
13660 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
13670 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
13680 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
13690 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45  inc = 0;..  /* E
136a0 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
136b0 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
136c0 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
136d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
136e0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
136f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13700 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
13710 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
13720 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
13730 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
13740 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
13750 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
13760 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
13770 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
13780 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
13790 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
137a0 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
137b0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
137c0 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
137d0 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
137e0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
137f0 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
13800 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
13810 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
13820 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
13830 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
13840 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
13850 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
13860 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
13870 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
13880 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
13890 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
138a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
138b0 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
138c0 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
138d0 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
138e0 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
138f0 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
13900 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
13910 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
13920 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
13930 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
13940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13950 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
13960 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
13970 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
13980 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
13990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
139a0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
139b0 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
139c0 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
139d0 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
139e0 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
139f0 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
13a00 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
13a10 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
13a20 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
13a30 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
13a40 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
13a50 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
13a60 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
13a70 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
13a80 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
13a90 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
13aa0 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
13ab0 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
13ac0 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
13ad0 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
13ae0 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
13af0 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
13b00 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
13b10 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
13b20 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
13b30 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
13b40 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
13b50 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
13b60 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
13b70 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
13b80 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
13b90 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
13ba0 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
13bb0 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
13bc0 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
13bd0 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
13be0 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
13bf0 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
13c00 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
13c10 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65  = pCol->isPrimKe
13c20 79 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  y!=0;.    autoin
13c30 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
13c40 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
13c50 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
13c60 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
13c70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
13c80 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
13c90 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
13ca0 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
13cb0 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
13cc0 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22      zCollSeq = "
13cd0 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72  BINARY";.  }..er
13ce0 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
13cf0 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
13d00 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68  db);..  /* Wheth
13d10 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  er the function 
13d20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f  call succeeded o
13d30 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68  r failed, set th
13d40 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
13d50 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74  ers.  ** to what
13d60 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c  ever their local
13d70 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f   counterparts co
13d80 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72  ntain. If an err
13d90 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20  or did occur,.  
13da0 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20  ** this has the 
13db0 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e  effect of zeroin
13dc0 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72  g all output par
13dd0 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
13de0 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29  if( pzDataType )
13df0 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a   *pzDataType = z
13e00 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20  DataType;.  if( 
13e10 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43  pzCollSeq ) *pzC
13e20 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65  ollSeq = zCollSe
13e30 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c  q;.  if( pNotNul
13e40 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20  l ) *pNotNull = 
13e50 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70  notnull;.  if( p
13e60 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50  PrimaryKey ) *pP
13e70 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d  rimaryKey = prim
13e80 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41  arykey;.  if( pA
13e90 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69  utoinc ) *pAutoi
13ea0 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20  nc = autoinc;.. 
13eb0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
13ec0 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  rc && !pTab ){. 
13ed0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13ee0 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
13ef0 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
13f00 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
13f10 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
13f20 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a  olumn: %s.%s", z
13f30 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
13f40 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b     zColumnName);
13f50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13f60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
13f70 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
13f80 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22  c, (zErrMsg?"%s"
13f90 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  :0), zErrMsg);. 
13fa0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13fb0 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  b, zErrMsg);.  r
13fc0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
13fd0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
13fe0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13ff0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
14000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
14010 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  dif../*.** Sleep
14020 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
14030 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
14040 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
14050 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  slept..*/.int sq
14060 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20  lite3_sleep(int 
14070 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ms){.  sqlite3_v
14080 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20  fs *pVfs;.  int 
14090 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c  rc;.  pVfs = sql
140a0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
140b0 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20  ;.  if( pVfs==0 
140c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
140d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
140e0 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65  works in millise
140f0 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75  conds, but the u
14100 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65  nderlying OsSlee
14110 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73  p() .  ** API us
14120 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e  es microseconds.
14130 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27   Hence the 1000'
14140 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28  s..  */.  rc = (
14150 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70  sqlite3OsSleep(p
14160 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30  Vfs, 1000*ms)/10
14170 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  00);.  return rc
14180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ;.}../*.** Enabl
14190 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
141a0 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74   extended result
141b0 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   codes..*/.int s
141c0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
141d0 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c  result_codes(sql
141e0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e  ite3 *db, int on
141f0 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  off){.  sqlite3_
14200 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
14210 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
14220 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20  rMask = onoff ? 
14230 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66  0xffffffff : 0xf
14240 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
14250 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
14260 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
14270 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14280 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69  * Invoke the xFi
14290 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  leControl method
142a0 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
142b0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
142c0 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  t sqlite3_file_c
142d0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a  ontrol(sqlite3 *
142e0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
142f0 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c  zDbName, int op,
14300 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
14310 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14320 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62  ERROR;.  int iDb
14330 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
14340 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
14350 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d  x);.  if( zDbNam
14360 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 44 62 20  e==0 ){.    iDb 
14370 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
14380 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62    for(iDb=0; iDb
14390 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29  <db->nDb; iDb++)
143a0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
143b0 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  mp(db->aDb[iDb].
143c0 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3d  zName, zDbName)=
143d0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
143e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c  }.  }.  if( iDb<
143f0 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20 20 20 42  db->nDb ){.    B
14400 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 64  tree *pBtree = d
14410 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
14420 0a 20 20 20 20 69 66 28 20 70 42 74 72 65 65 20  .    if( pBtree 
14430 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  ){.      Pager *
14440 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 73 71  pPager;.      sq
14450 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
14460 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14470 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
14480 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20  .      pPager = 
14490 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
144a0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20  r(pBtree);.     
144b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
144c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 64 20 3d  =0 );.      fd =
144d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
144e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
144f0 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29   assert( fd!=0 )
14500 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d  ;.      if( op==
14510 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
14520 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  E_POINTER ){.   
14530 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66       *(sqlite3_f
14540 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b  ile**)pArg = fd;
14550 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
14560 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
14570 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65  else if( fd->pMe
14580 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20  thods ){.       
14590 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
145a0 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f  ileControl(fd, o
145b0 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20  p, pArg);.      
145c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
145d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
145e0 55 4e 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UND;.      }.   
145f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
14600 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
14610 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
14620 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
14630 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
14640 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a  rn rc;   .}../*.
14650 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
14660 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
14670 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
14680 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
14690 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
146a0 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64  nt rc = 0;.#ifnd
146b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
146c0 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61  UILTIN_TEST.  va
146d0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
146e0 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
146f0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
14700 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76     /*.    ** Sav
14710 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  e the current st
14720 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e  ate of the PRNG.
14730 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
14740 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
14750 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20  _PRNG_SAVE: {.  
14760 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53      sqlite3PrngS
14770 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  aveState();.    
14780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
14790 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
147a0 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20  store the state 
147b0 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74  of the PRNG to t
147c0 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61  he last state sa
147d0 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  ved using.    **
147e0 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20   PRNG_SAVE.  If 
147f0 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65  PRNG_SAVE has ne
14800 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
14810 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  called, then.   
14820 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63   ** this verb ac
14830 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53  ts like PRNG_RES
14840 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ET..    */.    c
14850 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
14860 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
14870 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
14880 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74  3PrngRestoreStat
14890 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
148a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
148b0 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65      ** Reset the
148c0 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74   PRNG back to it
148d0 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
148e0 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74  state.  The next
148f0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
14900 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
14910 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64  ss() will reseed
14920 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20   the PRNG using 
14930 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20  a single call.  
14940 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e    ** to the xRan
14950 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f  domness method o
14960 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  f the default VF
14970 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  S..    */.    ca
14980 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
14990 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b  RL_PRNG_RESET: {
149a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
149b0 6e 67 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a  ngResetState();.
149c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
149d0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
149e0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
149f0 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54  control(BITVEC_T
14a00 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72  EST, size, progr
14a10 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  am).    **.    *
14a20 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61  * Run a test aga
14a30 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62  inst a Bitvec ob
14a40 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54  ject of size.  T
14a50 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d  he program argum
14a60 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e  ent.    ** is an
14a70 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
14a80 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  rs that defines 
14a90 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72  the test.  Retur
14aa0 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a  n -1 on a.    **
14ab0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
14ac0 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73  on error, 0 on s
14ad0 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a  uccess, or non-z
14ae0 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72  ero for an error
14af0 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65  ..    ** See the
14b00 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
14b10 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20  iltinTest() for 
14b20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
14b30 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
14b40 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
14b50 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54  ESTCTRL_BITVEC_T
14b60 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EST: {.      int
14b70 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
14b80 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74   int);.      int
14b90 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67   *aProg = va_arg
14ba0 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
14bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
14bc0 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
14bd0 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20  sz, aProg);.    
14be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
14bf0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
14c00 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
14c10 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
14c20 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
14c30 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
14c40 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
14c50 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
14c60 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
14c70 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
14c80 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
14c90 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
14ca0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
14cb0 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
14cc0 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
14cd0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
14ce0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
14cf0 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
14d00 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
14d10 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
14d20 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
14d30 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
14d40 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
14d50 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
14d60 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
14d70 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
14d80 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
14d90 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
14da0 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
14db0 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
14dc0 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
14dd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14de0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
14df0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
14e00 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
14e10 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
14e20 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
14e30 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
14e40 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
14e50 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
14e60 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
14e70 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
14e80 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
14e90 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
14ea0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
14eb0 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
14ec0 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
14ed0 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
14ee0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
14ef0 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
14f00 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
14f10 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
14f20 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
14f30 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
14f40 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
14f50 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
14f60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
14f70 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
14f80 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
14f90 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
14fa0 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
14fb0 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
14fc0 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
14fd0 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
14fe0 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  ileterious behav
14ff0 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
15000 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
15010 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
15020 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
15030 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
15040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15050 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
15060 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
15070 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
15080 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
15090 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
150a0 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
150b0 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
150c0 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
150d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
150e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
150f0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
15100 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
15110 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
15120 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
15130 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
15140 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
15150 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
15160 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
15170 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
15180 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
15190 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
151a0 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
151b0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
151c0 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
151d0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
151e0 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
151f0 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
15200 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
15210 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
15220 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
15230 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
15240 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
15250 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
15260 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
15270 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
15280 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
15290 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
152a0 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
152b0 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
152c0 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
152d0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
152e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
152f0 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
15300 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
15310 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
15320 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
15330 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
15340 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61  ssert( (x = va_a
15350 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
15360 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
15370 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15380 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
15390 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
153a0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
153b0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
153c0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
153d0 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
153e0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
153f0 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
15400 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
15410 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
15420 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
15430 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
15440 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
15450 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
15460 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
15470 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
15480 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
15490 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
154a0 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
154b0 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
154c0 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
154d0 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
154e0 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
154f0 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
15500 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
15510 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
15520 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
15530 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
15540 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
15550 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
15560 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
15570 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
15580 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
15590 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
155a0 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
155b0 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
155c0 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
155d0 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
155e0 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
155f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
15600 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
15610 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
15620 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
15630 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
15640 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
15650 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
15660 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
15670 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
15680 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
15690 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
156a0 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
156b0 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
156c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
156d0 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
156e0 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
156f0 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
15700 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
15710 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
15720 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
15730 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
15740 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
15750 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
15760 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
15770 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
15780 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
15790 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
157a0 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
157b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
157c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
157d0 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
157e0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
157f0 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
15800 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
15810 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
15820 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
15830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
15840 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
15850 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
15860 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
15870 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
15880 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
15890 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
158a0 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
158b0 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
158c0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
158d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
158e0 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
158f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
15900 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
15910 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
15920 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
15930 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
15940 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
15950 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
15960 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
15970 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
15980 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
15990 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
159a0 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
159b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
159c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
159d0 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
159e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
159f0 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
15a00 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
15a10 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
15a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
15a30 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
15a40 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
15a50 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
15a60 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
15a70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
15a80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
15a90 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
15aa0 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
15ab0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
15ac0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
15ad0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
15ae0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
15af0 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
15b00 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
15b10 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
15b20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
15b30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
15b40 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
15b50 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
15b60 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
15b70 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
15b80 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
15b90 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
15ba0 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
15bb0 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
15bc0 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
15bd0 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
15be0 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
15bf0 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
15c00 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
15c10 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
15c20 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
15c30 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
15c40 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
15c50 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
15c60 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
15c70 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
15c80 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
15c90 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
15ca0 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
15cb0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
15cc0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
15cd0 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
15ce0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15cf0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
15d00 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
15d10 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
15d20 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  t);.      db->fl
15d30 61 67 73 20 3d 20 28 78 20 26 20 53 51 4c 49 54  ags = (x & SQLIT
15d40 45 5f 4f 70 74 4d 61 73 6b 29 20 7c 20 28 64 62  E_OptMask) | (db
15d50 2d 3e 66 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  ->flags & ~SQLIT
15d60 45 5f 4f 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20  E_OptMask);.    
15d70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
15d80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f  #ifdef SQLITE_N_
15d90 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73  KEYWORD.    /* s
15da0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
15db0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
15dc0 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63  TRL_ISKEYWORD, c
15dd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
15de0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
15df0 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65  If zWord is a ke
15e00 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64  yword recognized
15e10 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20   by the parser, 
15e20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
15e30 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
15e40 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69   keywords.  Or i
15e50 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61  f zWord is not a
15e60 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e   keyword, return
15e70 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20   0..    ** .    
15e80 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61  ** This test fea
15e90 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  ture is only ava
15ea0 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d  ilable in the am
15eb0 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65  algamation since
15ec0 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  .    ** the SQLI
15ed0 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63  TE_N_KEYWORD mac
15ee0 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ro is not define
15ef0 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69  d in this file i
15f00 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20  f SQLite.    ** 
15f10 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73  is built using s
15f20 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66  eparate source f
15f30 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iles..    */.   
15f40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
15f50 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a  TCTRL_ISKEYWORD:
15f60 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
15f70 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f  har *zWord = va_
15f80 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
15f90 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ar*);.      int 
15fa0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
15fb0 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20  n30(zWord);.    
15fc0 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b    rc = (sqlite3K
15fd0 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29  eywordCode((u8*)
15fe0 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44  zWord, n)!=TK_ID
15ff0 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  ) ? SQLITE_N_KEY
16000 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20  WORD : 0;.      
16010 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
16020 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c  dif ..    /* sql
16030 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
16040 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
16050 4c 5f 50 47 48 44 52 53 5a 29 0a 20 20 20 20 2a  L_PGHDRSZ).    *
16060 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20  *.    ** Return 
16070 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 63  the size of a pc
16080 61 63 68 65 20 68 65 61 64 65 72 20 69 6e 20 62  ache header in b
16090 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ytes..    */.   
160a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
160b0 54 43 54 52 4c 5f 50 47 48 44 52 53 5a 3a 20 7b  TCTRL_PGHDRSZ: {
160c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 69 7a 65  .      rc = size
160d0 6f 66 28 50 67 48 64 72 29 3b 0a 20 20 20 20 20  of(PgHdr);.     
160e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
160f0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
16100 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
16110 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
16120 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70  CHMALLOC, sz, &p
16130 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  New, pFree);.   
16140 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20   **.    ** Pass 
16150 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74  pFree into sqlit
16160 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29 2e  e3ScratchFree().
16170 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30   .    ** If sz>0
16180 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61   then allocate a
16190 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20   scratch buffer 
161a0 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20  into pNew.  .   
161b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
161c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52  ITE_TESTCTRL_SCR
161d0 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  ATCHMALLOC: {.  
161e0 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c      void *pFree,
161f0 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20   **ppNew;.      
16200 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a  int sz;.      sz
16210 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
16220 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20  t);.      ppNew 
16230 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
16240 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65  d**);.      pFre
16250 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  e = va_arg(ap, v
16260 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28  oid*);.      if(
16270 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73   sz ) *ppNew = s
16280 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
16290 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73  loc(sz);.      s
162a0 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
162b0 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  e(pFree);.      
162c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
162d0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
162e0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
162f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
16300 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74  LTIME_FAULT, int
16310 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a   onoff);.    **.
16320 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65      ** If parame
16330 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e  ter onoff is non
16340 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65  -zero, configure
16350 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73 6f   the wrappers so
16360 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a   that all.    **
16370 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
16380 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29  s to localtime()
16390 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61   and variants fa
163a0 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20  il. If onoff is 
163b0 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64  zero,.    ** und
163c0 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a  o this setting..
163d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
163e0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
163f0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
16400 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
16410 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f  GlobalConfig.bLo
16420 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76  caltimeFault = v
16430 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
16440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16450 20 7d 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64   }..  }.  va_end
16460 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
16470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
16480 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65  TIN_TEST */.  re
16490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
164a0 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
164b0 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65  ity routine, use
164c0 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65  ful to VFS imple
164d0 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74  mentations, that
164e0 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65   checks.** to se
164f0 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  e if a database 
16500 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74  file was a URI t
16510 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20  hat contained a 
16520 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a  specific query .
16530 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e  ** parameter, an
16540 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20  d if so obtains 
16550 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
16560 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
16570 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
16580 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
16590 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70  s the filename p
165a0 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e  ointer passed in
165b0 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a  to the xOpen().*
165c0 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46  * method of a VF
165d0 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
165e0 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72  .  The zParam ar
165f0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
16600 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65  me of the.** que
16610 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20  ry parameter we 
16620 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74  seek.  This rout
16630 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
16640 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61  value of the zPa
16650 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ram.** parameter
16660 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
16670 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
16680 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
16690 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
166a0 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20   returns a NULL 
166b0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
166c0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
166d0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f  uri_parameter(co
166e0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
166f0 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
16700 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 7a 46 69 6c  *zParam){.  zFil
16710 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
16720 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
16730 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  me) + 1;.  while
16740 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ( zFilename[0] )
16750 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74  {.    int x = st
16760 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
16770 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69  zParam);.    zFi
16780 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
16790 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
167a0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66  ame) + 1;.    if
167b0 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( x==0 ) return 
167c0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a  zFilename;.    z
167d0 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
167e0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
167f0 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a  ename) + 1;.  }.
16800 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a          return 0;.}.