/ Hex Artifact Content
Login

Artifact 93d49bc6abf4ccea97721d016b9f45228cff7057:


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 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
31b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
31c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
31d0: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
31e0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
31f0: 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  w an error */.  
3200: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3210: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
3220: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3230: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3240: 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  G_PCACHE2: {.   
3250: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
3260: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
3270: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
3280: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3290: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
32a0: 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76  fig.pcache2 = *v
32b0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
32c0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
32d0: 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  2*);.      break
32e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
32f0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
3300: 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  ETPCACHE2: {.   
3310: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3320: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3330: 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  e2.xInit==0 ){. 
3340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43         sqlite3PC
3350: 61 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29  acheSetDefault()
3360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3370: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3380: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
3390: 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ds2*) = sqlite3G
33a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
33b0: 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  he2;.      break
33c0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66  ;.    }..#if def
33d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
33e0: 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64  LE_MEMSYS3) || d
33f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
3400: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20  ABLE_MEMSYS5).  
3410: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3420: 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20  NFIG_HEAP: {.   
3430: 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20     /* Designate 
3440: 61 20 62 75 66 66 65 72 20 66 6f 72 20 68 65 61  a buffer for hea
3450: 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  p memory space *
3460: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3470: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61  lobalConfig.pHea
3480: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  p = va_arg(ap, v
3490: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
34a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
34b0: 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .nHeap = va_arg(
34c0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
34d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
34e0: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61  fig.mnReq = va_a
34f0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20  rg(ap, int);..  
3500: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
3510: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
3520: 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  q<1 ){.        s
3530: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3540: 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20  ig.mnReq = 1;.  
3550: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
3560: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3570: 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20  g.mnReq>(1<<12) 
3580: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61  ){.        /* ca
3590: 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69  p min request si
35a0: 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20  ze at 2^12 */.  
35b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
35c0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
35d0: 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20  = (1<<12);.     
35e0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71   }..      if( sq
35f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3600: 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
3610: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
3620: 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20  heap pointer is 
3630: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f  NULL, then resto
3640: 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d  re the malloc im
3650: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20  plementation.   
3660: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
3670: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f  NULL pointers to
3680: 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  o.  This will ca
3690: 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74  use the malloc t
36a0: 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  o go.        ** 
36b0: 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61  back to its defa
36c0: 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ult implementati
36d0: 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f  on when sqlite3_
36e0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a  initialize() is.
36f0: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a          ** run..
3700: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
3710: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
3720: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3730: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
3740: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3750: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
3760: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
3770: 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73   heap pointer is
3780: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
3790: 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74  install one of t
37a0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65  he.        ** me
37b0: 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68  m5.c/mem3.c meth
37c0: 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65 72 20  ods. If neither 
37d0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6e  ENABLE_MEMSYS3 n
37e0: 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 4e  or.        ** EN
37f0: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69 73 20  ABLE_MEMSYS5 is 
3800: 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72 6e 20  defined, return 
3810: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20  an error..      
3820: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
3830: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
3840: 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  3.        sqlite
3850: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
3860: 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  = *sqlite3MemGet
3870: 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69  Memsys3();.#endi
3880: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
3890: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20  ENABLE_MEMSYS5. 
38a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
38b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a  obalConfig.m = *
38c0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d  sqlite3MemGetMem
38d0: 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20  sys5();.#endif. 
38e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
38f0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3900: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3910: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49  E_CONFIG_LOOKASI
3920: 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  DE: {.      sqli
3930: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3940: 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61  szLookaside = va
3950: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3960: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3970: 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
3980: 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ide = va_arg(ap,
3990: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
39a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20  ak;.    }.    . 
39b0: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61 20 70     /* Record a p
39c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 6f  ointer to the lo
39d0: 67 67 65 72 20 66 75 6e 63 63 74 69 6f 6e 20 61  gger funcction a
39e0: 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72 67  nd its first arg
39f0: 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ument..    ** Th
3a00: 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55 4c  e default is NUL
3a10: 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20 64  L.  Logging is d
3a20: 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20 66  isabled if the f
3a30: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
3a40: 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a  is.    ** NULL..
3a50: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3a60: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
3a70: 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53  G: {.      /* MS
3a80: 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75  VC is picky abou
3a90: 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70  t pulling func p
3aa0: 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74  trs from va list
3ab0: 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70  s..      ** http
3ac0: 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f  ://support.micro
3ad0: 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36  soft.com/kb/4796
3ae0: 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  1.      ** sqlit
3af0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
3b00: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
3b10: 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69   void(*)(void*,i
3b20: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  nt,const char*))
3b30: 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
3b40: 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a 4c   typedef void(*L
3b50: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
3b60: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
3b70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
3b80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
3b90: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f   = va_arg(ap, LO
3ba0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
3bb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3bc0: 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61  fig.pLogArg = va
3bd0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
3be0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3bf0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51    }..    case SQ
3c00: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a  LITE_CONFIG_URI:
3c10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3c20: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
3c30: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
3c40: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3c50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3c60: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
3c70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3c80: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
3c90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
3ca0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
3cb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3cc0: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
3cd0: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
3ce0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
3cf0: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
3d00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
3d10: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
3d20: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
3d30: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
3d40: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
3d50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
3d60: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
3d70: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
3d80: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
3d90: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
3da0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
3db0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
3dc0: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
3dd0: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
3de0: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
3df0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
3e00: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3e10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
3e20: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
3e30: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
3e40: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
3e50: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
3e60: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
3e70: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
3e80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
3e90: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
3ea0: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
3eb0: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
3ec0: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
3ed0: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
3ee0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
3ef0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
3f00: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
3f10: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
3f20: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
3f30: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
3f40: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
3f50: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
3f60: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
3f70: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
3f80: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
3f90: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
3fa0: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
3fb0: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
3fc0: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
3fd0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
3fe0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
3ff0: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
4000: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
4010: 6b 61 73 69 64 65 20 73 6c 6f 74 20 6e 65 65 64  kaside slot need
4020: 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74  s to be larger t
4030: 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 0a 20 20  han a pointer.  
4040: 2a 2a 20 74 6f 20 62 65 20 75 73 65 66 75 6c 2e  ** to be useful.
4050: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d  .  */.  if( sz<=
4060: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
4070: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a  asideSlot*) ) sz
4080: 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c   = 0;.  if( cnt<
4090: 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  0 ) cnt = 0;.  i
40a0: 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d  f( sz==0 || cnt=
40b0: 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30  =0 ){.    sz = 0
40c0: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 30  ;.    pStart = 0
40d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
40e0: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20  uf==0 ){.    sz 
40f0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
4100: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33  ; /* IMP: R-3303
4110: 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 20 20 73  8-09382 */.    s
4120: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
4130: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
4140: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
4150: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
4160: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34    /* IMP: R-6194
4170: 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73  9-35727 */.    s
4180: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4190: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 65 6c 73 65  alloc();.  }else
41a0: 7b 0a 20 20 20 20 73 7a 20 3d 20 52 4f 55 4e 44  {.    sz = ROUND
41b0: 44 4f 57 4e 38 28 73 7a 29 3b 20 2f 2a 20 49 4d  DOWN8(sz); /* IM
41c0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
41d0: 20 2a 2f 0a 20 20 20 20 70 53 74 61 72 74 20 3d   */.    pStart =
41e0: 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d   pBuf;.  }.  db-
41f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
4200: 74 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62  t = pStart;.  db
4210: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
4220: 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f  e = 0;.  db->loo
4230: 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36  kaside.sz = (u16
4240: 29 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72  )sz;.  if( pStar
4250: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
4260: 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f      LookasideSlo
4270: 74 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74  t *p;.    assert
4280: 28 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65  ( sz > (int)size
4290: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
42a0: 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c  *) );.    p = (L
42b0: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53  ookasideSlot*)pS
42c0: 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tart;.    for(i=
42d0: 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  cnt-1; i>=0; i--
42e0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  ){.      p->pNex
42f0: 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  t = db->lookasid
4300: 65 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64  e.pFree;.      d
4310: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72  b->lookaside.pFr
4320: 65 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20  ee = p;.      p 
4330: 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  = (LookasideSlot
4340: 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b  *)&((u8*)p)[sz];
4350: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c  .    }.    db->l
4360: 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20  ookaside.pEnd = 
4370: 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  p;.    db->looka
4380: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
4390: 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
43a0: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
43b0: 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20   pBuf==0 ?1:0;. 
43c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
43d0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d  lookaside.pEnd =
43e0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   0;.    db->look
43f0: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
4400: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   0;.    db->look
4410: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
4420: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4430: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4440: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4450: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
4460: 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
4470: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
4480: 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a  .sqlite3_mutex *
4490: 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78  sqlite3_db_mutex
44a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
44b0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65   return db->mute
44c0: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  x;.}../*.** Conf
44d0: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e  iguration settin
44e0: 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69  gs for an indivi
44f0: 64 75 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f  dual database co
4500: 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20  nnection.*/.int 
4510: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
4520: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  g(sqlite3 *db, i
4530: 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76  nt op, ...){.  v
4540: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
4550: 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   rc;.  va_start(
4560: 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
4570: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
4580: 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  e SQLITE_DBCONFI
4590: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
45a0: 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20       void *pBuf 
45b0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
45c0: 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  d*); /* IMP: R-2
45d0: 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20  6835-10964 */.  
45e0: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
45f0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
4600: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37      /* IMP: R-47
4610: 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20  871-25994 */.   
4620: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f     int cnt = va_
4630: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
4640: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34     /* IMP: R-044
4650: 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20  60-53386 */.    
4660: 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b    rc = setupLook
4670: 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20  aside(db, pBuf, 
4680: 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20  sz, cnt);.      
4690: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
46a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
46b0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
46c0: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20  truct {.        
46d0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20  int op;      /* 
46e0: 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  The opcode */.  
46f0: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20        u32 mask; 
4700: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68     /* Mask of th
4710: 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33  e bit in sqlite3
4720: 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c  .flags to set/cl
4730: 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61  ear */.      } a
4740: 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  FlagOp[] = {.   
4750: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
4760: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
4770: 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 6f  EY,    SQLITE_Fo
4780: 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a  reignKeys    },.
4790: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
47a0: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
47b0: 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49 54 45  _TRIGGER, SQLITE
47c0: 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20  _EnableTrigger  
47d0: 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
47e0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
47f0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
4800: 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d  ITE_ERROR; /* IM
4810: 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32  P: R-42790-23372
4820: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
4830: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
4840: 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  FlagOp); i++){. 
4850: 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61 67         if( aFlag
4860: 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a  Op[i].op==op ){.
4870: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e            int on
4880: 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  off = va_arg(ap,
4890: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20   int);.         
48a0: 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f   int *pRes = va_
48b0: 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
48c0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64           int old
48d0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
48e0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
48f0: 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20   onoff>0 ){.    
4900: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
4910: 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e  s |= aFlagOp[i].
4920: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
4930: 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d  }else if( onoff=
4940: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4950: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
4960: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
4970: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4980: 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c         if( oldFl
4990: 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29  ags!=db->flags )
49a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
49b0: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
49c0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
49d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
49e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
49f0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
4a00: 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c   *pRes = (db->fl
4a10: 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d  ags & aFlagOp[i]
4a20: 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20  .mask)!=0;.     
4a30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4a40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4a50: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4a60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4a70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
4a90: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
4aa0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
4ab0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
4ac0: 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e  he buffer z[0..n
4ad0: 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  -1] contains all
4ae0: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
4af0: 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73  ic int allSpaces
4b00: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
4b10: 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28  int n){.  while(
4b20: 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
4b30: 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ' ' ){ n--; }.  
4b40: 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a  return n==0;.}..
4b50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
4b60: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
4b70: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ing function nam
4b80: 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63  ed "BINARY" whic
4b90: 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61  h is always.** a
4ba0: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
4bb0: 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61  If the padFlag a
4bc0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
4bd0: 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70  ULL then space p
4be0: 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e  adding at the en
4bf0: 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20  d.** of strings 
4c00: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  is ignored.  Thi
4c10: 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  s implements the
4c20: 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e   RTRIM collation
4c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4c40: 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  binCollFunc(.  v
4c50: 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20  oid *padFlag,.  
4c60: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
4c70: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
4c80: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
4c90: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
4ca0: 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e    int rc, n;.  n
4cb0: 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f   = nKey1<nKey2 ?
4cc0: 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a   nKey1 : nKey2;.
4cd0: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
4ce0: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
4cf0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
4d00: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
4d10: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
4d20: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
4d30: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
4d40: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
4d50: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
4d60: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
4d70: 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72        /* Leave r
4d80: 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30  c unchanged at 0
4d90: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
4da0: 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20       rc = nKey1 
4db0: 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20  - nKey2;.    }. 
4dc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72  }../*.** Another
4de0: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
4df0: 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f  ing sequence: NO
4e00: 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  CASE. .**.** Thi
4e10: 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  s collating sequ
4e20: 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64  ence is intended
4e30: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
4e40: 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64 61 6e  "case independan
4e50: 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22  t.** comparison"
4e60: 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c  . SQLite's knowl
4e70: 65 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e  edge of upper an
4e80: 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75  d lower case equ
4e90: 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65  ivalents.** exte
4ea0: 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20  nds only to the 
4eb0: 32 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73  26 characters us
4ec0: 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73  ed in the Englis
4ed0: 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a  h language..**.*
4ee0: 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20  * At the moment 
4ef0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
4f00: 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61  UTF-8 implementa
4f10: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4f20: 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74  int nocaseCollat
4f30: 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20  ingFunc(.  void 
4f40: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20  *NotUsed,.  int 
4f50: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
4f60: 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
4f70: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
4f80: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
4f90: 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t r = sqlite3Str
4fa0: 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f  NICmp(.      (co
4fb0: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31  nst char *)pKey1
4fc0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
4fd0: 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b  pKey2, (nKey1<nK
4fe0: 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32  ey2)?nKey1:nKey2
4ff0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
5000: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
5010: 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20    if( 0==r ){.  
5020: 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79    r = nKey1-nKey
5030: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
5040: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
5050: 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  rn the ROWID of 
5060: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
5070: 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65  insert.*/.sqlite
5080: 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c  _int64 sqlite3_l
5090: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
50a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
50b0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74   return db->last
50c0: 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
50d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
50e0: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20  r of changes in 
50f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
5100: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
5110: 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  exec()..*/.int s
5120: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73  qlite3_changes(s
5130: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
5140: 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67  eturn db->nChang
5150: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
5160: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
5170: 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74   changes since t
5180: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
5190: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a  le was opened..*
51a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  /.int sqlite3_to
51b0: 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  tal_changes(sqli
51c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
51d0: 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  rn db->nTotalCha
51e0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  nge;.}../*.** Cl
51f0: 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  ose all open sav
5200: 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75  epoints. This fu
5210: 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69  nction only mani
5220: 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f  pulates fields o
5230: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
5240: 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c  e handle object,
5250: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f   it does not clo
5260: 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  se any savepoint
5270: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70  s that may be op
5280: 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74  en.** at the b-t
5290: 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e  ree/pager level.
52a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
52b0: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
52c0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
52d0: 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65  while( db->pSave
52e0: 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76  point ){.    Sav
52f0: 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64  epoint *pTmp = d
5300: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20  b->pSavepoint;. 
5310: 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
5320: 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b  t = pTmp->pNext;
5330: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5340: 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20  ee(db, pTmp);.  
5350: 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69  }.  db->nSavepoi
5360: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53  nt = 0;.  db->nS
5370: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
5380: 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
5390: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
53a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
53b0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
53c0: 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  unction associat
53d0: 65 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20  ed with FuncDef 
53e0: 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70  p, if any. Excep
53f0: 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  t,.** if this is
5400: 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f   not the last co
5410: 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  py of the functi
5420: 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b  on, do not invok
5430: 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a  e it. Multiple.*
5440: 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69  * copies of a si
5450: 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72  ngle function ar
5460: 65 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63  e created when c
5470: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
5480: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69   is called.** wi
5490: 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73  th SQLITE_ANY as
54a0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a   the encoding..*
54b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75  /.static void fu
54c0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71  nctionDestroy(sq
54d0: 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44  lite3 *db, FuncD
54e0: 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65  ef *p){.  FuncDe
54f0: 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72  structor *pDestr
5500: 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74  uctor = p->pDest
5510: 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44  ructor;.  if( pD
5520: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
5530: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
5540: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44  ef--;.    if( pD
5550: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d  estructor->nRef=
5560: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73  =0 ){.      pDes
5570: 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f  tructor->xDestro
5580: 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70  y(pDestructor->p
5590: 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20  UserData);.     
55a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
55b0: 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  b, pDestructor);
55c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
55d0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
55e0: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
55f0: 61 62 61 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c  abase.*/.int sql
5600: 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74  ite3_close(sqlit
5610: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
5620: 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20  lem *i;         
5630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
5640: 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f  sh table iterato
5650: 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  r */.  int j;.. 
5660: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
5670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5680: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
5690: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
56a0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
56b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
56c0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
56d0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
56e0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
56f0: 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20  x);..  /* Force 
5700: 78 44 65 73 74 72 6f 79 20 63 61 6c 6c 73 20 6f  xDestroy calls o
5710: 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  n all virtual ta
5720: 62 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  bles */.  sqlite
5730: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
5740: 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 0a 20  hema(db, -1);.. 
5750: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
5760: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
5770: 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e ResetInternalS
5780: 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f  chema() call abo
5790: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
57a0: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
57b0: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
57c0: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
57d0: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
57e0: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
57f0: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
5800: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
5810: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
5820: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
5830: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
5840: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
5850: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
5860: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
5870: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
5880: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
5890: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
58a0: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
58b0: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
58c0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
58d0: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
58e0: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
58f0: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ck(db);..  /* If
5900: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
5910: 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20  utstanding VMs, 
5920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5930: 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  SY. */.  if( db-
5940: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71  >pVdbe ){.    sq
5950: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
5960: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
5970: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
5980: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
5990: 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65 6d 65  inalised stateme
59a0: 6e 74 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  nts");.    sqlit
59b0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
59c0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
59d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
59e0: 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  Y;.  }.  assert(
59f0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68   sqlite3SafetyCh
5a00: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
5a10: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
5a20: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
5a30: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
5a40: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b   db->aDb[j].pBt;
5a50: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
5a60: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
5a70: 42 61 63 6b 75 70 28 70 42 74 29 20 29 7b 0a 20  Backup(pBt) ){. 
5a80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5a90: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
5aa0: 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  Y, .          "u
5ab0: 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64  nable to close d
5ac0: 75 65 20 74 6f 20 75 6e 66 69 6e 69 73 68 65 64  ue to unfinished
5ad0: 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f   backup operatio
5ae0: 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n");.      sqlit
5af0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
5b00: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
5b10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
5b20: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  USY;.    }.  }..
5b30: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75    /* Free any ou
5b40: 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f  tstanding Savepo
5b50: 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20  int structures. 
5b60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  */.  sqlite3Clos
5b70: 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
5b80: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ..  for(j=0; j<d
5b90: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
5ba0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
5bb0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a   = &db->aDb[j];.
5bc0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
5bd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5be0: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d  3BtreeClose(pDb-
5bf0: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62  >pBt);.      pDb
5c00: 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->pBt = 0;.     
5c10: 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20   if( j!=1 ){.   
5c20: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
5c30: 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 0;.      }. 
5c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
5c50: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
5c60: 63 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 0a  chema(db, -1);..
5c70: 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f    /* Tell the co
5c80: 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74  de in notify.c t
5c90: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  hat the connecti
5ca0: 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c  on no longer hol
5cb0: 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ds any.  ** lock
5cc0: 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72  s and does not r
5cd0: 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68  equire any furth
5ce0: 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  er unlock-notify
5cf0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
5d00: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  .  sqlite3Connec
5d10: 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a  tionClosed(db);.
5d20: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
5d30: 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  Db<=2 );.  asser
5d40: 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e  t( db->aDb==db->
5d50: 61 44 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66  aDbStatic );.  f
5d60: 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53  or(j=0; j<ArrayS
5d70: 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29  ize(db->aFunc.a)
5d80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63  ; j++){.    Func
5d90: 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61  Def *pNext, *pHa
5da0: 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  sh, *p;.    for(
5db0: 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d  p=db->aFunc.a[j]
5dc0: 3b 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20  ; p; p=pHash){. 
5dd0: 20 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e       pHash = p->
5de0: 70 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69  pHash;.      whi
5df0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20  le( p ){.       
5e00: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
5e10: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
5e20: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
5e30: 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
5e40: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
5e50: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65  .        p = pNe
5e60: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
5e70: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71  }.  }.  for(i=sq
5e80: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
5e90: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b  b->aCollSeq); i;
5ea0: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
5eb0: 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53  t(i)){.    CollS
5ec0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
5ed0: 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73  lSeq *)sqliteHas
5ee0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a  hData(i);.    /*
5ef0: 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74   Invoke any dest
5f00: 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72  ructors register
5f10: 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  ed for collation
5f20: 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64   sequence user d
5f30: 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ata. */.    for(
5f40: 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a  j=0; j<3; j++){.
5f50: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b        if( pColl[
5f60: 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20  j].xDel ){.     
5f70: 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c     pColl[j].xDel
5f80: 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29  (pColl[j].pUser)
5f90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5fa0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5fb0: 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  e(db, pColl);.  
5fc0: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
5fd0: 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  lear(&db->aCollS
5fe0: 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eq);.#ifndef SQL
5ff0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
6000: 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71  TABLE.  for(i=sq
6010: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
6020: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20  b->aModule); i; 
6030: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
6040: 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65  (i)){.    Module
6050: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
6060: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
6070: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  a(i);.    if( pM
6080: 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a  od->xDestroy ){.
6090: 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73        pMod->xDes
60a0: 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29  troy(pMod->pAux)
60b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
60c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d  te3DbFree(db, pM
60d0: 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  od);.  }.  sqlit
60e0: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
60f0: 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
6100: 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  f..  sqlite3Erro
6110: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
6120: 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61   0); /* Dealloca
6130: 74 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65  tes any cached e
6140: 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f  rror strings. */
6150: 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20  .  if( db->pErr 
6160: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
6170: 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72  lueFree(db->pErr
6180: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
6190: 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28  CloseExtensions(
61a0: 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  db);..  db->magi
61b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
61c0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68  _ERROR;..  /* Th
61d0: 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20  e temp-database 
61e0: 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61  schema is alloca
61f0: 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  ted differently 
6200: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73  from the other s
6210: 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63  chema.  ** objec
6220: 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65  ts (using sqlite
6230: 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c  Malloc() directl
6240: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71  y, instead of sq
6250: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
6260: 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20  ())..  ** So it 
6270: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
6280: 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68  d here. Todo: Wh
6290: 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74  y not roll the t
62a0: 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a  emp schema into.
62b0: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71    ** the same sq
62c0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20  liteMalloc() as 
62d0: 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c  the one that all
62e0: 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62  ocates the datab
62f0: 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74  ase .  ** struct
6300: 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ure?.  */.  sqli
6310: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62  te3DbFree(db, db
6320: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
6330: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6340: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6350: 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  ex);.  db->magic
6360: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
6370: 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65  CLOSED;.  sqlite
6380: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d  3_mutex_free(db-
6390: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
63a0: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
63b0: 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  .nOut==0 );  /* 
63c0: 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61  Fails on a looka
63d0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  side memory leak
63e0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f   */.  if( db->lo
63f0: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
6400: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
6410: 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73  _free(db->lookas
6420: 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d  ide.pStart);.  }
6430: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6440: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
6450: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6460: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64  * Rollback all d
6470: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
6480: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
6490: 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65  llbackAll(sqlite
64a0: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
64b0: 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d  .  int inTrans =
64c0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
64d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
64e0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
64f0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
6500: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66  ignMalloc();.  f
6510: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
6520: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
6530: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20   db->aDb[i].pBt 
6540: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
6550: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6560: 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  ns(db->aDb[i].pB
6570: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  t) ){.        in
6580: 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  Trans = 1;.     
6590: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
65a0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62  BtreeRollback(db
65b0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  ->aDb[i].pBt);. 
65c0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e       db->aDb[i].
65d0: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20  inTrans = 0;.   
65e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
65f0: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
6600: 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
6610: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
6620: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53   if( db->flags&S
6630: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
6640: 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ges ){.    sqlit
6650: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
6660: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
6670: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
6680: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
6690: 62 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  b, -1);.  }..  /
66a0: 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63  * Any deferred c
66b0: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
66c0: 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65  ions have now be
66d0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
66e0: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
66f0: 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ons = 0;..  /* I
6700: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
6710: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
6720: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
6730: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
6740: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
6750: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
6760: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
6770: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
6780: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
6790: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
67a0: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
67b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
67c0: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
67d0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
67e0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
67f0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
6800: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
6810: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
6820: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
6830: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
6840: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
6850: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
6860: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
6870: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
6880: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
6890: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
68a0: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
68b0: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
68c0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
68d0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
68e0: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
68f0: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
6900: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
6910: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
6920: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
6930: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
6940: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
6950: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
6960: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
6970: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
6980: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
6990: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
69a0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
69b0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
69c0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
69d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
69e0: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
69f0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
6a00: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
6a10: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
6a20: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
6a30: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
6a40: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6a50: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
6a60: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
6a70: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
6a80: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
6a90: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
6aa0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
6ab0: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
6ac0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
6ad0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
6ae0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
6af0: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
6b00: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
6b10: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
6b20: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
6b30: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
6b40: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
6b50: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
6b60: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
6b70: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
6b80: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
6b90: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
6ba0: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
6bb0: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
6bc0: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
6bd0: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
6be0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
6bf0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
6c00: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
6c10: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
6c20: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
6c30: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
6c40: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
6c50: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
6c60: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6c70: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
6c80: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
6c90: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
6ca0: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
6cb0: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
6cc0: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
6cd0: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
6ce0: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
6cf0: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
6d00: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
6d10: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
6d20: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
6d30: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
6d40: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
6d50: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
6d60: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
6d70: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
6d80: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
6d90: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
6da0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
6db0: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
6dc0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
6dd0: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
6de0: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
6df0: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
6e00: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6e10: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
6e20: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
6e30: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
6e40: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
6e50: 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 69   rc &= 0xff;.  i
6e60: 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29  f( ALWAYS(rc>=0)
6e70: 20 26 26 20 72 63 3c 28 69 6e 74 29 28 73 69 7a   && rc<(int)(siz
6e80: 65 6f 66 28 61 4d 73 67 29 2f 73 69 7a 65 6f 66  eof(aMsg)/sizeof
6e90: 28 61 4d 73 67 5b 30 5d 29 29 20 26 26 20 61 4d  (aMsg[0])) && aM
6ea0: 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20  sg[rc]!=0 ){.   
6eb0: 20 72 65 74 75 72 6e 20 61 4d 73 67 5b 72 63 5d   return aMsg[rc]
6ec0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6ed0: 65 74 75 72 6e 20 22 75 6e 6b 6e 6f 77 6e 20 65  eturn "unknown e
6ee0: 72 72 6f 72 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rror";.  }.}../*
6ef0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6f00: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75   implements a bu
6f10: 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74  sy callback that
6f20: 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65   sleeps and trie
6f30: 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c  s.** again until
6f40: 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65   a timeout value
6f50: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68   is reached.  Th
6f60: 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  e timeout value 
6f70: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
6f80: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
6f90: 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69  seconds passed i
6fa0: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n as the first.*
6fb0: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
6fc0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6fd0: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
6fe0: 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c  ack(. void *ptr,
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7000: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
7010: 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f  ction */. int co
7020: 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  unt             
7030: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7040: 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20  times table has 
7050: 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a  been busy */.){.
7060: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7070: 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41  N || (defined(HA
7080: 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
7090: 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61  VE_USLEEP).  sta
70a0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c  tic const u8 del
70b0: 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31  ays[] =.     { 1
70c0: 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20  , 2, 5, 10, 15, 
70d0: 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c  20, 25, 25,  25,
70e0: 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d    50,  50, 100 }
70f0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
7100: 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20   u8 totals[] =. 
7110: 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20      { 0, 1, 3,  
7120: 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37  8, 18, 33, 53, 7
7130: 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38  8, 103, 128, 178
7140: 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e  , 228 };.# defin
7150: 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69  e NDELAY ArraySi
7160: 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c  ze(delays).  sql
7170: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
7180: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
7190: 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62   timeout = db->b
71a0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e  usyTimeout;.  in
71b0: 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a  t delay, prior;.
71c0: 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
71d0: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75  >=0 );.  if( cou
71e0: 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20  nt < NDELAY ){. 
71f0: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
7200: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72  s[count];.    pr
7210: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75  ior = totals[cou
7220: 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt];.  }else{.  
7230: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
7240: 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20  [NDELAY-1];.    
7250: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e  prior = totals[N
7260: 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79  DELAY-1] + delay
7270: 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d  *(count-(NDELAY-
7280: 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1));.  }.  if( p
7290: 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74  rior + delay > t
72a0: 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65  imeout ){.    de
72b0: 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20  lay = timeout - 
72c0: 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64  prior;.    if( d
72d0: 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e  elay<=0 ) return
72e0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
72f0: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
7300: 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a  s, delay*1000);.
7310: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73    return 1;.#els
7320: 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  e.  sqlite3 *db 
7330: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72  = (sqlite3 *)ptr
7340: 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20  ;.  int timeout 
7350: 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74  = ((sqlite3 *)pt
7360: 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  r)->busyTimeout;
7370: 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29  .  if( (count+1)
7380: 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20  *1000 > timeout 
7390: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
73a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
73b0: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
73c0: 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75  1000000);.  retu
73d0: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
73e0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
73f0: 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64   given busy hand
7400: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ler..**.** This 
7410: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7420: 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74  d when an operat
7430: 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20  ion failed with 
7440: 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68  a lock..** If th
7450: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
7460: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
7470: 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64   lock is retried
7480: 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75  .  If it.** retu
7490: 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61  rns 0, the opera
74a0: 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68  tion aborts with
74b0: 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20   an SQLITE_BUSY 
74c0: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  error..*/.int sq
74d0: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
74e0: 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c  andler(BusyHandl
74f0: 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  er *p){.  int rc
7500: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
7510: 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d  =0) || p->xFunc=
7520: 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30  =0 || p->nBusy<0
7530: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
7540: 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e  c = p->xFunc(p->
7550: 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b  pArg, p->nBusy);
7560: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
7570: 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d      p->nBusy = -
7580: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
7590: 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a  p->nBusy++;.  }.
75a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a    return rc; .}.
75b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
75c0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73  ine sets the bus
75d0: 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  y callback for a
75e0: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
75f0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
7600: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
7610: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
7620: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  en argument..*/.
7630: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
7640: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
7650: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28  te3 *db,.  int (
7660: 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e  *xBusy)(void*,in
7670: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
7680: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
7690: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
76a0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79  tex);.  db->busy
76b0: 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20  Handler.xFunc = 
76c0: 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73  xBusy;.  db->bus
76d0: 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20  yHandler.pArg = 
76e0: 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79  pArg;.  db->busy
76f0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
7700: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
7710: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
7720: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
7730: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
7740: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7750: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
7760: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
7770: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
7780: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
7790: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
77a0: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
77b0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
77c0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
77d0: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
77e0: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
77f0: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
7800: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
7810: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
7820: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
7830: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
7840: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
7850: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
7860: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
7870: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
7880: 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74  *pArg.){.  sqlit
7890: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
78a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
78b0: 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64   nOps>0 ){.    d
78c0: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78  b->xProgress = x
78d0: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62  Progress;.    db
78e0: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
78f0: 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70   nOps;.    db->p
7900: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41  ProgressArg = pA
7910: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
7920: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
7930: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f   0;.    db->nPro
7940: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
7950: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
7960: 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  rg = 0;.  }.  sq
7970: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7980: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
7990: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
79a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74  his routine inst
79b0: 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62  alls a default b
79c0: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74  usy handler that
79d0: 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a   waits for the.*
79e0: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62  * specified numb
79f0: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
7a00: 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ds before return
7a10: 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ing 0..*/.int sq
7a20: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
7a30: 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ut(sqlite3 *db, 
7a40: 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d  int ms){.  if( m
7a50: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62  s>0 ){.    db->b
7a60: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b  usyTimeout = ms;
7a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
7a80: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
7a90: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
7aa0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
7ab0: 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  db);.  }else{.  
7ac0: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
7ad0: 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29  andler(db, 0, 0)
7ae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7af0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7b00: 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e  ** Cause any pen
7b10: 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74  ding operation t
7b20: 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61  o stop at its ea
7b30: 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69  rliest opportuni
7b40: 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
7b50: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71  te3_interrupt(sq
7b60: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
7b70: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
7b80: 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ed = 1;.}.../*.*
7b90: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7ba0: 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  is exactly the s
7bb0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63  ame as sqlite3_c
7bc0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
7bd0: 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
7be0: 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20   it is designed 
7bf0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20  to be called by 
7c00: 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54  internal code. T
7c10: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
7c20: 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61  .** that if a ma
7c30: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20  lloc() fails in 
7c40: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7c50: 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72  unction(), an er
7c60: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72  ror code.** is r
7c70: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
7c80: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
7c90: 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69  g cleared. .*/.i
7ca0: 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  nt sqlite3Create
7cb0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20  Func(.  sqlite3 
7cc0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
7cd0: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  r *zFunctionName
7ce0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
7cf0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
7d00: 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f  *pUserData,.  vo
7d10: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
7d20: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
7d30: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
7d40: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
7d50: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
7d60: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
7d70: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
7d80: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
7d90: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
7da0: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
7db0: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b   *pDestructor.){
7dc0: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
7dd0: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61   int nName;..  a
7de0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7df0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
7e00: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
7e10: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
7e20: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
7e30: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
7e40: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
7e50: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
7e60: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
7e70: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
7e80: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
7e90: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
7ea0: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
7eb0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
7ec0: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
7ed0: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
7ee0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7ef0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
7f00: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
7f10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
7f20: 50 54 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64  PT;.  }.  .#ifnd
7f30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
7f40: 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c  TF16.  /* If SQL
7f50: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
7f60: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
7f70: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
7f80: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
7f90: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
7fa0: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
7fb0: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
7fc0: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
7fd0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
7fe0: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
7ff0: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
8000: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20  ternally..  **. 
8010: 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e   ** If SQLITE_AN
8020: 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  Y is specified, 
8030: 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f  add three versio
8040: 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ns of the functi
8050: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68  on.  ** to the h
8060: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
8070: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
8080: 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65  E_UTF16 ){.    e
8090: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
80a0: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65  6NATIVE;.  }else
80b0: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
80c0: 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ANY ){.    int 
80d0: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
80e0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
80f0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
8100: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
8110: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 70 55  TF8,.         pU
8120: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
8130: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
8140: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
8150: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8160: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
8170: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
8180: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
8190: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
81a0: 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20 20  TE_UTF16LE,.    
81b0: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
81c0: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
81d0: 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74  Final, pDestruct
81e0: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  or);.    }.    i
81f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8200: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8210: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   rc;.    }.    e
8220: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
8230: 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  6BE;.  }.#else. 
8240: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
8250: 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  F8;.#endif.  .  
8260: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65  /* Check if an e
8270: 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  xisting function
8280: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
8290: 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e  dden or deleted.
82a0: 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64   If so,.  ** and
82b0: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
82c0: 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75  e VMs, then retu
82d0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
82e0: 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20  If a function.  
82f0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  ** is being over
8300: 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62  ridden/deleted b
8310: 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ut there are no 
8320: 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f  active VMs, allo
8330: 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  w the.  ** opera
8340: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
8350: 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20   but invalidate 
8360: 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  all precompiled 
8370: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
8380: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
8390: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
83a0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e  FunctionName, nN
83b0: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
83c0: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
83d0: 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d  && p->iPrefEnc==
83e0: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
83f0: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
8400: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
8410: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
8420: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
8430: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
8440: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
8450: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
8460: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
8470: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
8480: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
8490: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
84a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
84b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
84c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
84d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
84e0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
84f0: 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ts(db);.    }.  
8500: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
8510: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
8520: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
8530: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
8540: 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65  )enc, 1);.  asse
8550: 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  rt(p || db->mall
8560: 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28  ocFailed);.  if(
8570: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
8580: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8590: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
85a0: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66  older version of
85b0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
85c0: 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20  th a configured 
85d0: 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20  destructor is.  
85e0: 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ** being replace
85f0: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  d invoke the des
8600: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
8610: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63   here. */.  func
8620: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
8630: 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74  p);..  if( pDest
8640: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
8650: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b  estructor->nRef+
8660: 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65 73  +;.  }.  p->pDes
8670: 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72  tructor = pDestr
8680: 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c 61 67  uctor;.  p->flag
8690: 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e  s = 0;.  p->xFun
86a0: 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e  c = xFunc;.  p->
86b0: 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20  xStep = xStep;. 
86c0: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
86d0: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
86e0: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
86f0: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
8700: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
8710: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8720: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
8730: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
8740: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
8750: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8760: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
8770: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
8780: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
8790: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
87a0: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
87b0: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
87c0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
87d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
87e0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
87f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
8800: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
8810: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
8820: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
8830: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
8840: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
8850: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
8860: 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  v2(db, zFunc, nA
8870: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
8880: 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20  c, xStep,.      
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46                xF
88b0: 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74  inal, 0);.}..int
88c0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
88d0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73  function_v2(.  s
88e0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
88f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
8900: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
8910: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
8920: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
8930: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
8940: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8950: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
8960: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
8970: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
8980: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8990: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
89a0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
89b0: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
89c0: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
89d0: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
89e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
89f0: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
8a00: 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pArg = 0;.  sqli
8a10: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8a20: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
8a30: 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( xDestroy ){.  
8a40: 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65    pArg = (FuncDe
8a50: 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74  structor *)sqlit
8a60: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
8a70: 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  b, sizeof(FuncDe
8a80: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
8a90: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
8aa0: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
8ab0: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
8ac0: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
8ad0: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
8ae0: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
8af0: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
8b00: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
8b10: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
8b20: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
8b30: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
8b40: 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b  , xFinal, pArg);
8b50: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
8b60: 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  Arg->nRef==0 ){.
8b70: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
8b80: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
8b90: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
8ba0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8bb0: 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a  db, pArg);.  }..
8bc0: 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c   out:.  rc = sql
8bd0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
8be0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
8bf0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
8c00: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
8c10: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
8c20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
8c30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
8c40: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a  ate_function16(.
8c50: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
8c60: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75   const void *zFu
8c70: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
8c80: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54  t nArg,.  int eT
8c90: 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a  extRep,.  void *
8ca0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
8cb0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
8cc0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8cd0: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
8ce0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
8cf0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
8d00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
8d10: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
8d20: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
8d30: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
8d40: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b  .  char *zFunc8;
8d50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8d60: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8d70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
8d80: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8d90: 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c  ;.  zFunc8 = sql
8da0: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
8db0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
8dc0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
8dd0: 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20  NATIVE);.  rc = 
8de0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
8df0: 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
8e00: 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
8e10: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
8e20: 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69  Final,0);.  sqli
8e30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46  te3DbFree(db, zF
8e40: 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71  unc8);.  rc = sq
8e50: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
8e60: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
8e70: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8e80: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
8e90: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a   rc;.}.#endif...
8ea0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68  /*.** Declare th
8eb0: 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  at a function ha
8ec0: 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65  s been overloade
8ed0: 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74  d by a virtual t
8ee0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
8ef0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65  he function alre
8f00: 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20  ady exists as a 
8f10: 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66  regular global f
8f20: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a  unction, then.**
8f30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8f40: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68   a no-op.  If th
8f50: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
8f60: 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
8f70: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
8f80: 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20  one that always 
8f90: 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d  throws a run-tim
8fa0: 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a  e error.  .**.**
8fb0: 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61   When virtual ta
8fc0: 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70  bles intend to p
8fd0: 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f  rovide an overlo
8fe0: 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74  aded function, t
8ff0: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61  hey.** should ca
9000: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
9010: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
9020: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
9030: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c   exists..** A gl
9040: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75  obal function mu
9050: 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65  st exist in orde
9060: 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c  r for name resol
9070: 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a  ution to work.**
9080: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e   properly..*/.in
9090: 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  t sqlite3_overlo
90a0: 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ad_function(.  s
90b0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
90c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
90d0: 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20  .  int nArg.){. 
90e0: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
90f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
9100: 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  me);.  int rc = 
9110: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
9120: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9130: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
9140: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75  f( sqlite3FindFu
9150: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
9160: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , nName, nArg, S
9170: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d  QLITE_UTF8, 0)==
9180: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
9190: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
91a0: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c  db, zName, nArg,
91b0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
91e0: 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69  te3InvalidFuncti
91f0: 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  on, 0, 0, 0);.  
9200: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
9210: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
9220: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9230: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
9250: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
9260: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
9270: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72  ** Register a tr
9280: 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ace function.  T
9290: 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
92a0: 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
92b0: 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20  stered trace.** 
92c0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
92d0: 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63  *.** A NULL trac
92e0: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
92f0: 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67   that no tracing
9300: 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
9310: 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61   non-NULL.** tra
9320: 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ce is a pointer 
9330: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
9340: 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
9350: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
9360: 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  ch.** SQL statem
9370: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ent..*/.void *sq
9380: 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69  lite3_trace(sqli
9390: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a  te3 *db, void (*
93a0: 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f  xTrace)(void*,co
93b0: 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64  nst char*), void
93c0: 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20   *pArg){.  void 
93d0: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
93e0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
93f0: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
9400: 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b  = db->pTraceArg;
9410: 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
9420: 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
9430: 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
9440: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9450: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9460: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
9470: 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .}./*.** Registe
9480: 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  r a profile func
9490: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
94a0: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
94b0: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a  sly registered .
94c0: 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  ** profile funct
94d0: 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ion is returned.
94e0: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
94f0: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
9500: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70   means that no p
9510: 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63  rofiling is exec
9520: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
9530: 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20  L.** profile is 
9540: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
9550: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
9560: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
9570: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20  onclusion of.** 
9580: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
9590: 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a  nt that is run..
95a0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
95b0: 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69  _profile(.  sqli
95c0: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
95d0: 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64  (*xProfile)(void
95e0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
95f0: 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20  lite_uint64),.  
9600: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
9610: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
9620: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
9630: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
9640: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66  pOld = db->pProf
9650: 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ileArg;.  db->xP
9660: 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c  rofile = xProfil
9670: 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c  e;.  db->pProfil
9680: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
9690: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
96a0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
96b0: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
96c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
96d0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a  _OMIT_TRACE */..
96e0: 2f 2a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54 41  /*** EXPERIMENTA
96f0: 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69  L ***.**.** Regi
9700: 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  ster a function 
9710: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68  to be invoked wh
9720: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
9730: 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66   comments..** If
9740: 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e   the invoked fun
9750: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f  ction returns no
9760: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
9770: 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20   commit becomes 
9780: 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  a.** rollback..*
9790: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
97a0: 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73  commit_hook(.  s
97b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
97c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
97d0: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
97e0: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
97f0: 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
9800: 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46  k)(void*),  /* F
9810: 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b  unction to invok
9820: 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74  e on each commit
9830: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67   */.  void *pArg
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
9860: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
9870: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
9880: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9890: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
98a0: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
98b0: 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d  CommitArg;.  db-
98c0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
98d0: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
98e0: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d  db->pCommitArg =
98f0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
9900: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9910: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
9920: 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pOld;.}../*.**
9930: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
9940: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
9950: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72  ed each time a r
9960: 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  ow is updated,.*
9970: 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65  * inserted or de
9980: 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73  leted using this
9990: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
99a0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
99b0: 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
99c0: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
99d0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
99e0: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
99f0: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
9a00: 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ase */.  void (*
9a10: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
9a20: 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20  ,int,char const 
9a30: 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73  *,char const *,s
9a40: 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20  qlite_int64),.  
9a50: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
9a70: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
9a80: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
9a90: 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
9aa0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
9ab0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
9ac0: 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65  et = db->pUpdate
9ad0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61  Arg;.  db->xUpda
9ae0: 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  teCallback = xCa
9af0: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55  llback;.  db->pU
9b00: 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b  pdateArg = pArg;
9b10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9b20: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9b30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
9b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
9b50: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
9b60: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
9b70: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
9b80: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a  tion is rolled.*
9b90: 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20 64  * back by this d
9ba0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9bb0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
9bc0: 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f  ite3_rollback_ho
9bd0: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
9be0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
9bf0: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
9c00: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
9c10: 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ase */.  void (*
9c20: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
9c30: 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66  ), /* Callback f
9c40: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
9c50: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
9c60: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
9c70: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
9c80: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
9c90: 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
9ca0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
9cb0: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
9cc0: 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  = db->pRollbackA
9cd0: 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  rg;.  db->xRollb
9ce0: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ackCallback = xC
9cf0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
9d00: 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41  RollbackArg = pA
9d10: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
9d20: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9d30: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
9d40: 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Ret;.}..#ifndef 
9d50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
9d60: 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65  /*.** The sqlite
9d70: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
9d80: 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
9d90: 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   by sqlite3_wal_
9da0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
9db0: 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69  ..** Invoke sqli
9dc0: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
9dd0: 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72  nt if the number
9de0: 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
9df0: 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73  e log file.** is
9e00: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71   greater than sq
9e10: 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61  lite3.pWalArg ca
9e20: 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  st to an integer
9e30: 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66   (the value conf
9e40: 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c  igured by.** wal
9e50: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
9e60: 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  ))..*/ .int sqli
9e70: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
9e80: 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65  k(.  void *pClie
9e90: 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41  ntData,     /* A
9ea0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  rgument */.  sql
9eb0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
9ec0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
9ed0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
9ee0: 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a  r *zDb,       /*
9ef0: 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   Database */.  i
9f00: 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20  nt nFrame       
9f10: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9f20: 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28   WAL */.){.  if(
9f30: 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f   nFrame>=SQLITE_
9f40: 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65  PTR_TO_INT(pClie
9f50: 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73  ntData) ){.    s
9f60: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
9f70: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73  nMalloc();.    s
9f80: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
9f90: 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a  point(db, zDb);.
9fa0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
9fb0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
9fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9fd0: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
9fe0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
9ff0: 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  L */../*.** Conf
a000: 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33  igure an sqlite3
a010: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
a020: 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69  back to automati
a030: 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74  cally checkpoint
a040: 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
a050: 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fter committing 
a060: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  a transaction if
a070: 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d   there are nFram
a080: 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61  e or.** more fra
a090: 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
a0a0: 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72  ile. Passing zer
a0b0: 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20  o or a negative 
a0c0: 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20  value as the.** 
a0d0: 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72  nFrame parameter
a0e0: 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61   disables automa
a0f0: 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  tic checkpoints 
a100: 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  entirely..**.** 
a110: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  The callback reg
a120: 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20  istered by this 
a130: 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65  function replace
a140: 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63  s any existing c
a150: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73  allback.** regis
a160: 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69  tered using sqli
a170: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20  te3_wal_hook(). 
a180: 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74  Likewise, regist
a190: 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b  ering a callback
a1a0: 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65  .** using sqlite
a1b0: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73  3_wal_hook() dis
a1c0: 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61  ables the automa
a1d0: 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d  tic checkpoint m
a1e0: 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66  echanism.** conf
a1f0: 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66  igured by this f
a200: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
a210: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
a220: 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
a230: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61  e3 *db, int nFra
a240: 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  me){.#ifdef SQLI
a250: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e  TE_OMIT_WAL.  UN
a260: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
a270: 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  b);.  UNUSED_PAR
a280: 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a  AMETER(nFrame);.
a290: 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 46 72 61  #else.  if( nFra
a2a0: 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  me>0 ){.    sqli
a2b0: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
a2c0: 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
a2d0: 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49  ltHook, SQLITE_I
a2e0: 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65  NT_TO_PTR(nFrame
a2f0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
a300: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
a310: 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  k(db, 0, 0);.  }
a320: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
a330: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
a340: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
a350: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
a360: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
a370: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
a380: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
a390: 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61  o the write-ahea
a3a0: 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61  d-log by this da
a3b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a3c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
a3d0: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20  te3_wal_hook(.  
a3e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
a3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a400: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
a410: 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68 61  ok to this db ha
a420: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78  ndle */.  int(*x
a430: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a  Callback)(void *
a440: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
a450: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20  t char*, int),. 
a460: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
a490: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 61  nt passed to xCa
a4a0: 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23  llback() */.){.#
a4b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a4c0: 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70  IT_WAL.  void *p
a4d0: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
a4e0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
a4f0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
a500: 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64  db->pWalArg;.  d
a510: 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20  b->xWalCallback 
a520: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
a530: 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72  b->pWalArg = pAr
a540: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
a550: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
a560: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
a570: 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  et;.#else.  retu
a580: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
a590: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
a5a0: 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a   database zDb..*
a5b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
a5c0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
a5d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
a600: 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
a610: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
a620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
a630: 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20 64  me of attached d
a640: 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c  atabase (or NULL
a650: 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65  ) */.  int eMode
a660: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a670: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
a680: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61  _CHECKPOINT_* va
a690: 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  lue */.  int *pn
a6a0: 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Log,            
a6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
a6c0: 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67   Size of WAL log
a6d0: 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20   in frames */.  
a6e0: 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20  int *pnCkpt     
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75  /* OUT: Total nu
a710: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63  mber of frames c
a720: 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29  heckpointed */.)
a730: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
a740: 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72  OMIT_WAL.  retur
a750: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
a760: 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  se.  int rc;    
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
a790: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ode */.  int iDb
a7a0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54   = SQLITE_MAX_AT
a7b0: 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69  TACHED;  /* sqli
a7c0: 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20  te3.aDb[] index 
a7d0: 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f  of db to checkpo
a7e0: 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69  int */..  /* Ini
a7f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70  tialize the outp
a800: 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ut variables to 
a810: 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  -1 in case an er
a820: 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
a830: 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e   if( pnLog ) *pn
a840: 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Log = -1;.  if( 
a850: 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74  pnCkpt ) *pnCkpt
a860: 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74   = -1;..  assert
a870: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
a880: 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c 49 54 45 5f  INT_FULL>SQLITE_
a890: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
a8a0: 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
a8b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
a8c0: 54 5f 46 55 4c 4c 3c 53 51 4c 49 54 45 5f 43 48  T_FULL<SQLITE_CH
a8d0: 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
a8e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
a8f0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
a900: 50 41 53 53 49 56 45 2b 32 3d 3d 53 51 4c 49 54  PASSIVE+2==SQLIT
a910: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
a920: 54 41 52 54 20 29 3b 0a 20 20 69 66 28 20 65 4d  TART );.  if( eM
a930: 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode<SQLITE_CHECK
a940: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c  POINT_PASSIVE ||
a950: 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48   eMode>SQLITE_CH
a960: 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
a970: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a980: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
a990: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
a9a0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
a9b0: 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26  ex);.  if( zDb &
a9c0: 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20  & zDb[0] ){.    
a9d0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
a9e0: 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
a9f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c  ;.  }.  if( iDb<
aa00: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
aa10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
aa20: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
aa30: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22   SQLITE_ERROR, "
aa40: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
aa50: 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  : %s", zDb);.  }
aa60: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
aa70: 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
aa80: 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c  (db, iDb, eMode,
aa90: 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b   pnLog, pnCkpt);
aaa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
aab0: 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20  r(db, rc, 0);.  
aac0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
aad0: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
aae0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
aaf0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
ab00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ab10: 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
ab20: 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
ab30: 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62  base zDb. If zDb
ab40: 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20   is NULL, or if 
ab50: 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70  the buffer zDb p
ab60: 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74  oints.** to cont
ab70: 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  ains a zero-leng
ab80: 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61  th string, all a
ab90: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
aba0: 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70  s are .** checkp
abb0: 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ointed..*/.int s
abc0: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
abd0: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
abe0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
abf0: 44 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  Db){.  return sq
ac00: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
ac10: 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c  oint_v2(db, zDb,
ac20: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
ac30: 4e 54 5f 50 41 53 53 49 56 45 2c 20 30 2c 20 30  NT_PASSIVE, 0, 0
ac40: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
ac50: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
ac60: 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70  .** Run a checkp
ac70: 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65  oint on database
ac80: 20 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20   iDb. This is a 
ac90: 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73  no-op if databas
aca0: 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20  e iDb is.** not 
acb0: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69  currently open i
acc0: 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  n WAL mode..**.*
acd0: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
ace0: 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68  on is open on th
acf0: 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
ad00: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74   checkpointed, t
ad10: 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
ad20: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
ad30: 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65  LOCKED and a che
ad40: 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61  ckpoint is not a
ad50: 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a  ttempted. If .**
ad60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
ad70: 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74   while running t
ad80: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61  he checkpoint, a
ad90: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
ada0: 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
adb0: 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45  ned (i.e. SQLITE
adc0: 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69  _IOERR). Otherwi
add0: 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
ade0: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f  *.** The mutex o
adf0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
ae00: 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68  e db should be h
ae10: 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eld by the calle
ae20: 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20  r. The mutex.** 
ae30: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ae40: 74 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74  the specific b-t
ae50: 72 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70  ree being checkp
ae60: 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20  ointed is taken 
ae70: 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  by.** this funct
ae80: 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68  ion while the ch
ae90: 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e  eckpoint is runn
aea0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  ing..**.** If iD
aeb0: 62 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49  b is passed SQLI
aec0: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
aed0: 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68   then all attach
aee0: 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
aef0: 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
af00: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73  . If an error is
af10: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
af20: 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65  is returned imme
af30: 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20  diately -.** no 
af40: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
af50: 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  to checkpoint an
af60: 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61  y remaining data
af70: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  bases..**.** Par
af80: 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20  ameter eMode is 
af90: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48  one of SQLITE_CH
afa0: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
afb0: 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52  , FULL or RESTAR
afc0: 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
afd0: 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  3Checkpoint(sqli
afe0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
aff0: 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74  , int eMode, int
b000: 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e   *pnLog, int *pn
b010: 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Ckpt){.  int rc 
b020: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
b030: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
b040: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
b050: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
b060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b070: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
b080: 74 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64  through attached
b090: 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42   dbs */.  int bB
b0a0: 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  usy = 0;        
b0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
b0c0: 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  e if SQLITE_BUSY
b0d0: 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e   has been encoun
b0e0: 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  tered */..  asse
b0f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b100: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
b110: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
b120: 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d  pnLog || *pnLog=
b130: 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  =-1 );.  assert(
b140: 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43   !pnCkpt || *pnC
b150: 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f  kpt==-1 );..  fo
b160: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
b170: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
b180: 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  K; i++){.    if(
b190: 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d   i==iDb || iDb==
b1a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
b1b0: 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  HED ){.      rc 
b1c0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68  = sqlite3BtreeCh
b1d0: 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62  eckpoint(db->aDb
b1e0: 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20  [i].pBt, eMode, 
b1f0: 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
b200: 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b        pnLog = 0;
b210: 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20  .      pnCkpt = 
b220: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  0;.      if( rc=
b230: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
b240: 20 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20          bBusy = 
b250: 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
b260: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
b270: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
b280: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
b290: 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20  TE_OK && bBusy) 
b2a0: 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
b2b0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
b2c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
b2d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
b2e0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
b2f0: 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d  true if main-mem
b300: 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ory should be us
b310: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
b320: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
b330: 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20  e for transient 
b340: 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20  pager files and 
b350: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b360: 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ls..** The value
b370: 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64   returned depend
b380: 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
b390: 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  f db->temp_store
b3a0: 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72   (runtime.** par
b3b0: 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20  ameter) and the 
b3c0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c  compile time val
b3d0: 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d  ue of SQLITE_TEM
b3e0: 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20  P_STORE. The.** 
b3f0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
b400: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65  describes the re
b410: 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
b420: 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c  en these two val
b430: 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20  ues.** and this 
b440: 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
b450: 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   value..**.**   
b460: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
b470: 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73  E     db->temp_s
b480: 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f  tore     Locatio
b490: 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64  n of temporary d
b4a0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d  atabase.**   ---
b4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
b4c0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
b4d0: 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
b4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b4f0: 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20  ----.**   0     
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
b520: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
b530: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
b560: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
b570: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
b580: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
b590: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
b5a0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
b5b0: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
b5c0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
b5d0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
b5f0: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
b600: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
b610: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
b630: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
b640: 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
b680: 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20  urn 1).**   2   
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
b6b0: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
b6c0: 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33  return 1).**   3
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
b6f0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
b700: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a    (return 1).*/.
b710: 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49  int sqlite3TempI
b720: 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71  nMemory(const sq
b730: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20  lite3 *db){.#if 
b740: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
b750: 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20  E==1.  return ( 
b760: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d  db->temp_store==
b770: 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  2 );.#endif.#if 
b780: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
b790: 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20  E==2.  return ( 
b7a0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d  db->temp_store!=
b7b0: 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1 );.#endif.#if 
b7c0: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
b7d0: 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b  E==3.  return 1;
b7e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
b7f0: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20  TE_TEMP_STORE<1 
b800: 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  || SQLITE_TEMP_S
b810: 54 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20  TORE>3.  return 
b820: 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
b830: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
b840: 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
b850: 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
b860: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
b870: 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
b880: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
b890: 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
b8a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
b8b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
b8c0: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
b8d0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
b8e0: 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
b8f0: 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  M);.  }.  if( !s
b900: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
b910: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
b920: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
b930: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
b940: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20  _MISUSE_BKPT);. 
b950: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
b960: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
b970: 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
b980: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b990: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
b9a0: 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
b9b0: 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  M);.  }else{.   
b9c0: 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69   z = (char*)sqli
b9d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64  te3_value_text(d
b9e0: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73  b->pErr);.    as
b9f0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
ba00: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
ba10: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
ba20: 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
ba30: 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b  tr(db->errCode);
ba40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
ba50: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ba60: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ba70: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
ba80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ba90: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
baa0: 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
bab0: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
bac0: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
bad0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
bae0: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
baf0: 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
bb00: 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
bb10: 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
bb20: 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74  ic const u16 out
bb30: 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20  OfMem[] = {.    
bb40: 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
bb50: 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20   ', 'o', 'f', ' 
bb60: 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27  ', 'm', 'e', 'm'
bb70: 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'o', 'r', 'y',
bb80: 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63   0.  };.  static
bb90: 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73   const u16 misus
bba0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c  e[] = {.    'l',
bbb0: 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20   'i', 'b', 'r', 
bbc0: 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27  'a', 'r', 'y', '
bbd0: 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f   ', .    'r', 'o
bbe0: 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27  ', 'u', 't', 'i'
bbf0: 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c  , 'n', 'e', ' ',
bc00: 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20   .    'c', 'a', 
bc10: 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27  'l', 'l', 'e', '
bc20: 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  d', ' ', .    'o
bc30: 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
bc40: 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c  , .    'o', 'f',
bc50: 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20   ' ', .    's', 
bc60: 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27  'e', 'q', 'u', '
bc70: 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65  e', 'n', 'c', 'e
bc80: 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e  ', 0.  };..  con
bc90: 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66  st void *z;.  if
bca0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
bcb0: 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  urn (void *)outO
bcc0: 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fMem;.  }.  if( 
bcd0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
bce0: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
bcf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
bd00: 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20  oid *)misuse;.  
bd10: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
bd20: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
bd30: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
bd40: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
bd50: 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75    z = (void *)ou
bd60: 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b  tOfMem;.  }else{
bd70: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
bd80: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
bd90: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28  ->pErr);.    if(
bda0: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   z==0 ){.      s
bdb0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
bdc0: 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
bdd0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
bde0: 2d 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20  ->errCode),.    
bdf0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54         SQLITE_UT
be00: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
be10: 43 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  C);.      z = sq
be20: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
be30: 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
be40: 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c    }.    /* A mal
be50: 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66  loc() may have f
be60: 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65  ailed within the
be70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
be80: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a  _value_text16().
be90: 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66      ** above. If
bea0: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
beb0: 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e  e, then the db->
bec0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
bed0: 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  g needs to.    *
bee0: 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  * be cleared bef
bef0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44  ore returning. D
bf00: 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c  o this directly,
bf10: 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a   instead of via.
bf20: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70      ** sqlite3Ap
bf30: 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69  iExit(), to avoi
bf40: 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61  d setting the da
bf50: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72  tabase handle er
bf60: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20  ror message..   
bf70: 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
bf80: 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
bf90: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
bfa0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
bfb0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
bfc0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
bfd0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
bfe0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bff0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
c000: 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61  rror code genera
c010: 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65  ted by an SQLite
c020: 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c   routine. If NUL
c030: 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74  L is.** passed t
c040: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
c050: 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c   we assume a mal
c060: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72  loc() failed dur
c070: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ing sqlite3_open
c080: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
c090: 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  e3_errcode(sqlit
c0a0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
c0b0: 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
c0c0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
c0d0: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
c0e0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
c0f0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
c100: 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
c110: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c130: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
c140: 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20  n db->errCode & 
c150: 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69  db->errMask;.}.i
c160: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
c170: 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69  ded_errcode(sqli
c180: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
c190: 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61  db && !sqlite3Sa
c1a0: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
c1b0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
c1c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
c1d0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  E_BKPT;.  }.  if
c1e0: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
c1f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c200: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
c210: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
c220: 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a  rn db->errCode;.
c230: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
c240: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
c250: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
c260: 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
c270: 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
c280: 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
c290: 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
c2a0: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
c2b0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
c2c0: 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74  te3* db,.  const
c2d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
c2e0: 20 75 38 20 65 6e 63 2c 0a 20 20 75 38 20 63 6f   u8 enc,.  u8 co
c2f0: 6c 6c 54 79 70 65 2c 0a 20 20 76 6f 69 64 2a 20  llType,.  void* 
c300: 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
c310: 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
c320: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
c330: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
c340: 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
c350: 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
c360: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
c370: 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  nc2;.  int nName
c380: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c390: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20  30(zName);.  .  
c3a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c3b0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
c3c0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
c3d0: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
c3e0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
c3f0: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
c400: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
c410: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
c420: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
c430: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
c440: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
c450: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
c460: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
c470: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
c480: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
c490: 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63   */.  enc2 = enc
c4a0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
c4b0: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
c4c0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
c4d0: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
c4e0: 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20  16_ALIGNED );.  
c4f0: 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  if( enc2==SQLITE
c500: 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d  _UTF16 || enc2==
c510: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
c520: 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32  GNED ){.    enc2
c530: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
c540: 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28  ATIVE;.  }.  if(
c550: 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46   enc2<SQLITE_UTF
c560: 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45  8 || enc2>SQLITE
c570: 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20  _UTF16BE ){.    
c580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
c590: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
c5a0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
c5b0: 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76  is call is remov
c5c0: 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67  ing or replacing
c5d0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c   an existing col
c5e0: 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71  lation .  ** seq
c5f0: 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e  uence. If so, an
c600: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
c610: 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62  ve VMs, return b
c620: 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20  usy. If there.  
c630: 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
c640: 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65   VMs, invalidate
c650: 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65   any pre-compile
c660: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
c670: 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  */.  pColl = sql
c680: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
c690: 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
c6a0: 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ame, 0);.  if( p
c6b0: 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
c6c0: 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Cmp ){.    if( d
c6d0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
c6e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c6f0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
c700: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
c710: 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
c720: 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74  te/modify collat
c730: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65  ion sequence due
c740: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
c750: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72  ments");.      r
c760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
c770: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  Y;.    }.    sql
c780: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
c790: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
c7a0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c  ;..    /* If col
c7b0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
c7c0: 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65  pColl was create
c7d0: 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20  d directly by a 
c7e0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
c7f0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
c800: 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74  llation, and not
c810: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79   generated by sy
c820: 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20  nthCollSeq(),.  
c830: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f    ** then any co
c840: 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e  pies made by syn
c850: 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64  thCollSeq() need
c860: 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74   to be invalidat
c870: 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  ed..    ** Also,
c880: 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72   collation destr
c890: 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e  uctor - CollSeq.
c8a0: 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f  xDel() - functio
c8b0: 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  n may need.    *
c8c0: 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a  * to be called..
c8d0: 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20      */ .    if( 
c8e0: 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53  (pColl->enc & ~S
c8f0: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
c900: 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20  NED)==enc2 ){.  
c910: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f      CollSeq *aCo
c920: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ll = sqlite3Hash
c930: 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Find(&db->aCollS
c940: 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  eq, zName, nName
c950: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
c960: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
c970: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
c980: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
c990: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
c9a0: 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
c9b0: 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
c9c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
c9d0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
c9e0: 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
c9f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
ca00: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
ca10: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
ca20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ca30: 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
ca40: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
ca50: 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
ca60: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
ca70: 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
ca80: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ca90: 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
caa0: 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
cab0: 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
cac0: 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
cad0: 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
cae0: 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
caf0: 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
cb00: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
cb10: 0a 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d  .  pColl->type =
cb20: 20 63 6f 6c 6c 54 79 70 65 3b 0a 20 20 73 71 6c   collType;.  sql
cb30: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
cb40: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72  LITE_OK, 0);.  r
cb50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cb60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
cb70: 61 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61  array defines ha
cb80: 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20  rd upper bounds 
cb90: 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e  on limit values.
cba0: 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c    The.** initial
cbb0: 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70  izer must be kep
cbc0: 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74  t in sync with t
cbd0: 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
cbe0: 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e  *.** #defines in
cbf0: 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73   sqlite3.h..*/.s
cc00: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
cc10: 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b  aHardLimit[] = {
cc20: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  .  SQLITE_MAX_LE
cc30: 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
cc40: 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20  AX_SQL_LENGTH,. 
cc50: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
cc60: 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  MN,.  SQLITE_MAX
cc70: 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53  _EXPR_DEPTH,.  S
cc80: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
cc90: 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c  ND_SELECT,.  SQL
cca0: 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c  ITE_MAX_VDBE_OP,
ccb0: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  .  SQLITE_MAX_FU
ccc0: 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51  NCTION_ARG,.  SQ
ccd0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
cce0: 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  D,.  SQLITE_MAX_
ccf0: 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
cd00: 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
cd10: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
cd20: 52 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  R,.  SQLITE_MAX_
cd30: 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d  TRIGGER_DEPTH,.}
cd40: 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
cd50: 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69  re the hard limi
cd60: 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65  ts are set to re
cd70: 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a  asonable values.
cd80: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
cd90: 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  X_LENGTH<100.# e
cda0: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
cdb0: 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
cdc0: 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
cdd0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
cde0: 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30  X_SQL_LENGTH<100
cdf0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
ce00: 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
ce10: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
ce20: 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if 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 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  NGTH>SQLITE_MAX_
ce50: 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53  LENGTH.# error S
ce60: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
ce70: 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65  NGTH must not be
ce80: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
ce90: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
cea0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
ceb0: 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
cec0: 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20  ELECT<2.# error 
ced0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
cee0: 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20  UND_SELECT must 
cef0: 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65  be at least 2.#e
cf00: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
cf10: 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23  MAX_VDBE_OP<40.#
cf20: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
cf30: 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62  X_VDBE_OP must b
cf40: 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65  e at least 40.#e
cf50: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
cf60: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
cf70: 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
cf80: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30  _FUNCTION_ARG>10
cf90: 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
cfa0: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
cfb0: 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  RG must be betwe
cfc0: 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65  en 0 and 1000.#e
cfd0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
cfe0: 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c  MAX_ATTACHED<0 |
cff0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  | SQLITE_MAX_ATT
d000: 41 43 48 45 44 3e 36 32 0a 23 20 65 72 72 6f 72  ACHED>62.# error
d010: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
d020: 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74  CHED must be bet
d030: 77 65 65 6e 20 30 20 61 6e 64 20 36 32 0a 23 65  ween 0 and 62.#e
d040: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
d050: 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
d060: 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f  _LENGTH<1.# erro
d070: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  r SQLITE_MAX_LIK
d080: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
d090: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
d0a0: 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
d0b0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
d0c0: 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53  >32767.# error S
d0d0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
d0e0: 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64   must not exceed
d0f0: 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69   32767.#endif.#i
d100: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  f SQLITE_MAX_TRI
d110: 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65  GGER_DEPTH<1.# e
d120: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
d130: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75  TRIGGER_DEPTH mu
d140: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
d150: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
d160: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
d170: 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65   of a limit.  Re
d180: 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c  port the old val
d190: 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76  ue..** If an inv
d1a0: 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78  alid limit index
d1b0: 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65   is supplied, re
d1c0: 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65  port -1..** Make
d1d0: 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20   no changes but 
d1e0: 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65  still report the
d1f0: 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68   old value if th
d200: 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69  e.** new limit i
d210: 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  s negative..**.*
d220: 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69  * A new lower li
d230: 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72  mit does not shr
d240: 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e  ink existing con
d250: 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d  structs..** It m
d260: 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e  erely prevents n
d270: 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68  ew constructs th
d280: 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c 69  at exceed the li
d290: 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d  mit.** from form
d2a0: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
d2b0: 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65  te3_limit(sqlite
d2c0: 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74  3 *db, int limit
d2d0: 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74  Id, int newLimit
d2e0: 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69  ){.  int oldLimi
d2f0: 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e  t;...  /* EVIDEN
d300: 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35  CE-OF: R-30189-5
d310: 34 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69  4097 For each li
d320: 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c  mit category SQL
d330: 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20  ITE_LIMIT_NAME. 
d340: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68   ** there is a h
d350: 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20  ard upper bound 
d360: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
d370: 69 6d 65 20 62 79 20 61 20 43 20 70 72 65 70 72  ime by a C prepr
d380: 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63  ocessor.  ** mac
d390: 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45  ro called SQLITE
d3a0: 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20  _MAX_NAME. (The 
d3b0: 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65  "_LIMIT_" in the
d3c0: 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64   name is changed
d3d0: 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22   to.  ** "_MAX_"
d3e0: 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  .).  */.  assert
d3f0: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
d400: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
d410: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  ]==SQLITE_MAX_LE
d420: 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  NGTH );.  assert
d430: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
d440: 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
d450: 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
d460: 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a  X_SQL_LENGTH );.
d470: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
d480: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
d490: 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54  T_COLUMN]==SQLIT
d4a0: 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  E_MAX_COLUMN );.
d4b0: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
d4c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
d4d0: 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53  T_EXPR_DEPTH]==S
d4e0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
d4f0: 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
d500: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
d510: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
d520: 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49  ND_SELECT]==SQLI
d530: 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
d540: 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72  SELECT);.  asser
d550: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
d560: 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
d570: 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  OP]==SQLITE_MAX_
d580: 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73  VDBE_OP );.  ass
d590: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
d5a0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
d5b0: 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49  CTION_ARG]==SQLI
d5c0: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
d5d0: 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ARG );.  assert(
d5e0: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d5f0: 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
d600: 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  D]==SQLITE_MAX_A
d610: 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73  TTACHED );.  ass
d620: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
d630: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
d640: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
d650: 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]==.            
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49     SQLITE_MAX_LI
d690: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
d6a0: 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
d6b0: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d6c0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
d6d0: 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f  NUMBER]==SQLITE_
d6e0: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
d6f0: 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20  BER);.  assert( 
d700: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d710: 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
d720: 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  DEPTH]==SQLITE_M
d730: 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
d740: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
d750: 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
d760: 45 52 5f 44 45 50 54 48 3d 3d 28 53 51 4c 49 54  ER_DEPTH==(SQLIT
d770: 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a  E_N_LIMIT-1) );.
d780: 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c  ..  if( limitId<
d790: 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51  0 || limitId>=SQ
d7a0: 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a  LITE_N_LIMIT ){.
d7b0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
d7c0: 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20   }.  oldLimit = 
d7d0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74  db->aLimit[limit
d7e0: 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69  Id];.  if( newLi
d7f0: 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20  mit>=0 ){       
d800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d810: 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33  MP: R-52476-2873
d820: 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77  2 */.    if( new
d830: 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74  Limit>aHardLimit
d840: 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20  [limitId] ){.   
d850: 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48     newLimit = aH
d860: 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
d870: 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ];  /* IMP: R-51
d880: 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20  463-25634 */.   
d890: 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69   }.    db->aLimi
d8a0: 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77  t[limitId] = new
d8b0: 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Limit;.  }.  ret
d8c0: 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20  urn oldLimit;   
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34    /* IMP: R-5334
d8f0: 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a  1-35419 */.}../*
d900: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d910: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72  n is used to par
d920: 73 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64  se both URIs and
d930: 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d   non-URI filenam
d940: 65 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65  es passed by the
d950: 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20  .** user to API 
d960: 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65  functions sqlite
d970: 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  3_open() or sqli
d980: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61  te3_open_v2(), a
d990: 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a  nd for database.
d9a0: 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65  ** URIs specifie
d9b0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54  d as part of ATT
d9c0: 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ACH statements..
d9d0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
d9e0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
d9f0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
da00: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
da10: 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61   to use (or.** a
da20: 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79   NULL to signify
da30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
da40: 29 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65  ) if the URI doe
da50: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
da60: 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65  "vfs=xxx".** que
da70: 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  ry parameter. Th
da80: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
da90: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55  t contains the U
daa0: 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66  RI (or non-URI f
dab0: 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65  ilename).** itse
dac0: 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75  lf. When this fu
dad0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
dae0: 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72   the *pFlags var
daf0: 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  iable should con
db00: 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61  tain.** the defa
db10: 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  ult flags to ope
db20: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
db30: 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20  andle with. The 
db40: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
db50: 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62  ** *pFlags may b
db60: 65 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65  e updated before
db70: 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68   returning if th
db80: 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63  e URI filename c
db90: 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63  ontains .** "cac
dba0: 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65  he=xxx" or "mode
dbb0: 3d 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61  =xxx" query para
dbc0: 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  meters..**.** If
dbd0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
dbe0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
dbf0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
dc00: 20 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74   *ppVfs is set t
dc10: 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
dc20: 65 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c  e VFS that shoul
dc30: 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65  d be used to ope
dc40: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
dc50: 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20  ile. *pzFile is 
dc60: 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20  set to.** point 
dc70: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
dc80: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
dc90: 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f  of the file to o
dca0: 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  pen. It is the .
dcb0: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
dcc0: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
dcd0: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  to eventually ca
dce0: 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
dcf0: 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ) to release.** 
dd00: 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  this buffer..**.
dd10: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
dd20: 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53  ccurs, then an S
dd30: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
dd40: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
dd50: 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61   *pzErrMsg.** ma
dd60: 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e  y be set to poin
dd70: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
dd80: 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c  ntaining an Engl
dd90: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
dda0: 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20  or .** message. 
ddb0: 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
ddc0: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
ddd0: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
dde0: 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ally release.** 
ddf0: 74 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63  this buffer by c
de00: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  alling sqlite3_f
de10: 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
de20: 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20  lite3ParseUri(. 
de30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
de40: 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20  faultVfs,       
de50: 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69   /* VFS to use i
de60: 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71  f no "vfs=xxx" q
de70: 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  uery option */. 
de80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
de90: 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i,              
dea0: 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74   /* Nul-terminat
deb0: 65 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20  ed URI to parse 
dec0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
ded0: 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20  t *pFlags,      
dee0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
def0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
df00: 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
df10: 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20  e3_vfs **ppVfs, 
df20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
df30: 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  T: VFS to use */
df40: 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c   .  char **pzFil
df50: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
df60: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65      /* OUT: File
df70: 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  name component o
df80: 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20  f URI */.  char 
df90: 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
dfa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
dfb0: 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  T: Error message
dfc0: 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f   (if rc!=SQLITE_
dfd0: 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  OK) */.){.  int 
dfe0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
dff0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
e000: 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a  lags = *pFlags;.
e010: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
e020: 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73  fs = zDefaultVfs
e030: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  ;.  char *zFile;
e040: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74  .  char c;.  int
e050: 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53   nUri = sqlite3S
e060: 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a  trlen30(zUri);..
e070: 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72    assert( *pzErr
e080: 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  Msg==0 );..  if(
e090: 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
e0a0: 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73  E_OPEN_URI) || s
e0b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
e0c0: 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 0a 20 20  ig.bOpenUri) .  
e0d0: 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d   && nUri>=5 && m
e0e0: 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c  emcmp(zUri, "fil
e0f0: 65 3a 22 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b  e:", 5)==0 .  ){
e100: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b  .    char *zOpt;
e110: 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b  .    int eState;
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61     /* Parser sta
e140: 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  te when parsing 
e150: 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  URI */.    int i
e160: 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
e170: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
e180: 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
e190: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  x */.    int iOu
e1a0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
e1b0: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
e1c0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
e1d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
e1e0: 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20  e = nUri+2;     
e1f0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
e200: 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
e210: 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  ate */..    /* M
e220: 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c  ake sure the SQL
e230: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61  ITE_OPEN_URI fla
e240: 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69  g is set to indi
e250: 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20  cate to the VFS 
e260: 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65  xOpen .    ** me
e270: 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20  thod that there 
e280: 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72  may be extra par
e290: 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e  ameters followin
e2a0: 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e  g the file-name.
e2b0: 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c    */.    flags |
e2c0: 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  = SQLITE_OPEN_UR
e2d0: 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d  I;..    for(iIn=
e2e0: 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e  0; iIn<nUri; iIn
e2f0: 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55  ++) nByte += (zU
e300: 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20  ri[iIn]=='&');. 
e310: 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
e320: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
e330: 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65  ;.    if( !zFile
e340: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e350: 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f 2a 20  _NOMEM;..    /* 
e360: 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68 65  Discard the sche
e370: 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79  me and authority
e380: 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65   segments of the
e390: 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28   URI. */.    if(
e3a0: 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26   zUri[5]=='/' &&
e3b0: 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b   zUri[6]=='/' ){
e3c0: 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a  .      iIn = 7;.
e3d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
e3e0: 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
e3f0: 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b  In]!='/' ) iIn++
e400: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e  ;..      if( iIn
e410: 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20  !=7 && (iIn!=16 
e420: 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c  || memcmp("local
e430: 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c  host", &zUri[7],
e440: 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   9)) ){.        
e450: 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
e460: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
e470: 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69  alid uri authori
e480: 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20  ty: %.*s", .    
e490: 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26          iIn-7, &
e4a0: 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20  zUri[7]);.      
e4b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
e4c0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ROR;.        got
e4d0: 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
e4e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e4f0: 73 65 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20  se{.      iIn = 
e500: 35 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  5;.    }..    /*
e510: 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61   Copy the filena
e520: 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79  me and any query
e530: 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f   parameters into
e540: 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65   the zFile buffe
e550: 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64  r. .    ** Decod
e560: 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64  e %HH escape cod
e570: 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79  es along the way
e580: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
e590: 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   Within this loo
e5a0: 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61  p, variable eSta
e5b0: 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  te may be set to
e5c0: 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65   0, 1 or 2, depe
e5d0: 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  nding.    ** on 
e5e0: 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  the parsing cont
e5f0: 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  ext. As follows:
e600: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
e610: 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65   0: Parsing file
e620: 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20  -name..    **   
e630: 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20  1: Parsing name 
e640: 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
e650: 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
e660: 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20  rameter..    ** 
e670: 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c    2: Parsing val
e680: 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  ue section of a 
e690: 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
e6a0: 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
e6b0: 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20  */.    eState = 
e6c0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
e6d0: 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30   = zUri[iIn])!=0
e6e0: 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20   && c!='#' ){.  
e6f0: 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
e700: 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20   if( c=='%' .   
e710: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
e720: 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d  xdigit(zUri[iIn]
e730: 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ) .       && sql
e740: 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72  ite3Isxdigit(zUr
e750: 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20  i[iIn+1]) .     
e760: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
e770: 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33  octet = (sqlite3
e780: 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
e790: 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20  n++]) << 4);.   
e7a0: 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71       octet += sq
e7b0: 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55  lite3HexToInt(zU
e7c0: 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20  ri[iIn++]);..   
e7d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74       assert( oct
e7e0: 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32  et>=0 && octet<2
e7f0: 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  56 );.        if
e800: 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20  ( octet==0 ){.  
e810: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
e820: 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
e830: 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61  when "%00" appea
e840: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52  rs within the UR
e850: 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20  I. In this.     
e860: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20       ** case we 
e870: 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20  ignore all text 
e880: 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  in the remainder
e890: 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61   of the path, na
e8a0: 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  me or.          
e8b0: 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74  ** value current
e8c0: 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e  ly being parsed.
e8d0: 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   So ignore the c
e8e0: 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72  urrent character
e8f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
e900: 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65  d skip to the ne
e910: 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22  xt "?", "=" or "
e920: 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  &", as appropria
e930: 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
e940: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
e950: 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
e960: 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='#' .          
e970: 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
e980: 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20  0 || c!='?').   
e990: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
e9a0: 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d  State!=1 || (c!=
e9b0: 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a  '=' && c!='&')).
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
e9d0: 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63   (eState!=2 || c
e9e0: 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20  !='&').         
e9f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ea00: 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
ea10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
ea20: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
ea30: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74  .        c = oct
ea40: 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  et;.      }else 
ea50: 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26  if( eState==1 &&
ea60: 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27   (c=='&' || c=='
ea70: 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =') ){.        i
ea80: 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d  f( zFile[iOut-1]
ea90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
eaa0: 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74   /* An empty opt
eab0: 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65  ion name. Ignore
eac0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74   this option alt
ead0: 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  ogether. */.    
eae0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
eaf0: 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
eb00: 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69  In]!='#' && zUri
eb10: 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69  [iIn-1]!='&' ) i
eb20: 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
eb30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
eb40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
eb50: 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20  c=='&' ){.      
eb60: 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
eb70: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
eb80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
eb90: 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20     eState = 2;. 
eba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ebb0: 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   c = 0;.      }e
ebc0: 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d  lse if( (eState=
ebd0: 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c  =0 && c=='?') ||
ebe0: 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63   (eState==2 && c
ebf0: 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20  =='&') ){.      
ec00: 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
ec10: 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20   eState = 1;.   
ec20: 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65     }.      zFile
ec30: 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [iOut++] = c;.  
ec40: 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61    }.    if( eSta
ec50: 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f  te==1 ) zFile[iO
ec60: 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
ec70: 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
ec80: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
ec90: 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
eca0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
ecb0: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e  if there were an
ecc0: 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66  y options specif
ecd0: 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ied that should 
ece0: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a  be interpreted .
ecf0: 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74      ** here. Opt
ed00: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e  ions that are in
ed10: 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69  terpreted here i
ed20: 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64  nclude "vfs" and
ed30: 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20   those that.    
ed40: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ** correspond to
ed50: 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20   flags that may 
ed60: 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  be passed to the
ed70: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
ed80: 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ().    ** method
ed90: 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20  . */.    zOpt = 
eda0: 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74  &zFile[sqlite3St
edb0: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d  rlen30(zFile)+1]
edc0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70  ;.    while( zOp
edd0: 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  t[0] ){.      in
ede0: 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  t nOpt = sqlite3
edf0: 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a  Strlen30(zOpt);.
ee00: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c        char *zVal
ee10: 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d   = &zOpt[nOpt+1]
ee20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  ;.      int nVal
ee30: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
ee40: 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20  30(zVal);..     
ee50: 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20   if( nOpt==3 && 
ee60: 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f  memcmp("vfs", zO
ee70: 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 3)==0 ){.   
ee80: 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c       zVfs = zVal
ee90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
eea0: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70         struct Op
eeb0: 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20  enMode {.       
eec0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
eed0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
eee0: 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20  mode;.        } 
eef0: 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  *aMode = 0;.    
ef00: 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54      char *zModeT
ef10: 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ype = 0;.       
ef20: 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20   int mask = 0;. 
ef30: 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74         int limit
ef40: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69   = 0;..        i
ef50: 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65  f( nOpt==5 && me
ef60: 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f  mcmp("cache", zO
ef70: 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 5)==0 ){.   
ef80: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
ef90: 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43  ruct OpenMode aC
efa0: 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  acheMode[] = {. 
efb0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68             { "sh
efc0: 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f  ared",  SQLITE_O
efd0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
efe0: 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
eff0: 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49   "private", SQLI
f000: 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
f010: 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  ACHE },.        
f020: 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
f030: 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
f040: 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
f050: 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
f060: 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  CHE|SQLITE_OPEN_
f070: 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20  PRIVATECACHE;.  
f080: 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
f090: 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20  aCacheMode;.    
f0a0: 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
f0b0: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  sk;.          zM
f0c0: 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65  odeType = "cache
f0d0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
f0e0: 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34       if( nOpt==4
f0f0: 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65   && memcmp("mode
f100: 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29  ", zOpt, 4)==0 )
f110: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
f120: 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f  ic struct OpenMo
f130: 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d  de aOpenMode[] =
f140: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
f150: 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "ro",  SQLITE_O
f160: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a  PEN_READONLY },.
f170: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
f180: 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  w",  SQLITE_OPEN
f190: 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20  _READWRITE }, . 
f1a0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
f1b0: 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  c", SQLITE_OPEN_
f1c0: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
f1d0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
f1e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
f1f0: 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
f200: 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
f210: 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
f220: 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
f230: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
f240: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
f250: 41 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ATE;.          a
f260: 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65  Mode = aOpenMode
f270: 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69  ;.          limi
f280: 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73  t = mask & flags
f290: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
f2a0: 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73 22  eType = "access"
f2b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
f2c0: 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29       if( aMode )
f2d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
f2e0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  i;.          int
f2f0: 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20   mode = 0;.     
f300: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d       for(i=0; aM
f310: 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a  ode[i].z; i++){.
f320: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
f330: 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64  t char *z = aMod
f340: 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20  e[i].z;.        
f350: 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71      if( nVal==sq
f360: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
f370: 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56   && 0==memcmp(zV
f380: 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a  al, z, nVal) ){.
f390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f                mo
f3a0: 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f  de = aMode[i].mo
f3b0: 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  de;.            
f3c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f3d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f3e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
f3f0: 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20   mode==0 ){.    
f400: 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
f410: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
f420: 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20  ntf("no such %s 
f430: 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65  mode: %s", zMode
f440: 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
f450: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
f460: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
f470: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
f480: 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
f490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f4a0: 20 20 69 66 28 20 6d 6f 64 65 3e 6c 69 6d 69 74    if( mode>limit
f4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f4c0: 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
f4d0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
f4e0: 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  mode not allowed
f4f0: 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
f520: 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
f530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
f540: 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  = SQLITE_PERM;. 
f550: 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
f560: 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
f570: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f580: 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c       flags = (fl
f590: 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d  ags & ~mask) | m
f5a0: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ode;.        }. 
f5b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f       }..      zO
f5c0: 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b  pt = &zVal[nVal+
f5d0: 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  1];.    }..  }el
f5e0: 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  se{.    zFile = 
f5f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
f600: 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20  Uri+2);.    if( 
f610: 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
f620: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f630: 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20    memcpy(zFile, 
f640: 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
f650: 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27   zFile[nUri] = '
f660: 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e  \0';.    zFile[n
f670: 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Uri+1] = '\0';. 
f680: 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73   }..  *ppVfs = s
f690: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
f6a0: 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70  zVfs);.  if( *pp
f6b0: 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Vfs==0 ){.    *p
f6c0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
f6d0: 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
f6e0: 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66  ch vfs: %s", zVf
f6f0: 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  s);.    rc = SQL
f700: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
f710: 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20  parse_uri_out:. 
f720: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f730: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
f740: 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  3_free(zFile);. 
f750: 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20     zFile = 0;.  
f760: 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c  }.  *pFlags = fl
f770: 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d  ags;.  *pzFile =
f780: 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e   zFile;.  return
f790: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
f7a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
f7b0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
f7c0: 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
f7d0: 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
f7e0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
f7f0: 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
f800: 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
f810: 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
f820: 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
f830: 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
f840: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
f850: 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
f860: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
f870: 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
f880: 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
f890: 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
f8a0: 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
f8b0: 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
f8c0: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
f8d0: 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
f8e0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f   int flags,    /
f8f0: 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
f900: 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
f910: 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
f920: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
f930: 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
f940: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63    /* Store alloc
f970: 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65  ated handle here
f980: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
f9b0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
f9c0: 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20  Threadsafe;     
f9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
f9e0: 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65  e for threadsafe
f9f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
fa00: 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20    char *zOpen = 
fa10: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
fa20: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72    /* Filename ar
fa30: 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
fa40: 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f  o BtreeOpen() */
fa50: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
fa60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
fa70: 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
fa80: 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  age from sqlite3
fa90: 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20  ParseUri() */.. 
faa0: 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
fab0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fac0: 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
fad0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
fae0: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
faf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
fb00: 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c  if..  /* Only al
fb10: 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d  low sensible com
fb20: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74  binations of bit
fb30: 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61  s in the flags a
fb40: 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20  rgument.  .  ** 
fb50: 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
fb60: 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20  f any non-sense 
fb70: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75  combination is u
fb80: 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  sed.  If we.  **
fb90: 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c   do not block il
fba0: 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f  legal combinatio
fbb0: 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c  ns here, it coul
fbc0: 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61  d trigger.  ** a
fbd0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
fbe0: 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79  ts in deeper lay
fbf0: 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63  ers.  Sensible c
fc00: 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a  ombinations.  **
fc10: 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   are:.  **.  ** 
fc20: 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   1:  SQLITE_OPEN
fc30: 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20  _READONLY.  **  
fc40: 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  2:  SQLITE_OPEN_
fc50: 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20  READWRITE.  **  
fc60: 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  6:  SQLITE_OPEN_
fc70: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
fc80: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20  TE_OPEN_CREATE. 
fc90: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51   */.  assert( SQ
fca0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
fcb0: 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20  LY  == 0x01 );. 
fcc0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
fcd0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d  OPEN_READWRITE =
fce0: 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65  = 0x02 );.  asse
fcf0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
fd00: 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30  CREATE    == 0x0
fd10: 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  4 );.  testcase(
fd20: 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
fd30: 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44  =0x02 ); /* READ
fd40: 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61  ONLY */.  testca
fd50: 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
fd60: 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52  ))==0x04 ); /* R
fd70: 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65  EADWRITE */.  te
fd80: 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
fd90: 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20  gs&7))==0x40 ); 
fda0: 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20 43  /* READWRITE | C
fdb0: 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28  REATE */.  if( (
fdc0: 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26  (1<<(flags&7)) &
fdd0: 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65 74 75   0x46)==0 ) retu
fde0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
fdf0: 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28 20 73 71  _BKPT;..  if( sq
fe00: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
fe10: 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20  g.bCoreMutex==0 
fe20: 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
fe30: 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
fe40: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
fe50: 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
fe60: 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
fe70: 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
fe80: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
fe90: 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
fea0: 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72  TEX ){.    isThr
feb0: 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d  eadsafe = 1;.  }
fec0: 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65  else{.    isThre
fed0: 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33  adsafe = sqlite3
fee0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
fef0: 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69  llMutex;.  }.  i
ff00: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
ff10: 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
ff20: 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  CHE ){.    flags
ff30: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
ff40: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
ff50: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
ff60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68  3GlobalConfig.sh
ff70: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
ff80: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
ff90: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
ffa0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
ffb0: 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66   /* Remove harmf
ffc0: 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65  ul bits from the
ffd0: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
ffe0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53  .  **.  ** The S
fff0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
10000 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50  EX and SQLITE_OP
10010 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61  EN_FULLMUTEX fla
10020 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61  gs were.  ** dea
10030 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70  lt with in the p
10040 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f  revious code blo
10050 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65  ck.  Besides the
10060 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a  se, the only.  *
10070 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c  * valid input fl
10080 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
10090 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51  open_v2() are SQ
100a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
100b0 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  LY,.  ** SQLITE_
100c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20  OPEN_READWRITE, 
100d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
100e0 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  TE, SQLITE_OPEN_
100f0 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a  SHAREDCACHE,.  *
10100 2a 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 2c 20 61 6e 64 20  IVATECACHE, and 
10120 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69  some reserved bi
10130 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61  ts.  Silently ma
10140 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20  sk.  ** off all 
10150 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a  other flags..  *
10160 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28  /.  flags &=  ~(
10170 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
10180 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
10190 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
101a0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
101b0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
101c0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
101d0 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20  AIN_DB |.       
101e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
101f0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20  PEN_TEMP_DB | . 
10200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
10210 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
10220 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  ENT_DB | .      
10230 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10240 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
10250 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
10260 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
10270 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  TEMP_JOURNAL | .
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
10290 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
102a0 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
102b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
102c0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
102d0 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  AL |.           
102e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
102f0 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  NOMUTEX |.      
10300 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10310 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c  OPEN_FULLMUTEX |
10320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10330 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
10350 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
10360 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73  he sqlite data s
10370 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62  tructure */.  db
10380 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
10390 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c  Zero( sizeof(sql
103a0 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64  ite3) );.  if( d
103b0 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e  b==0 ) goto open
103c0 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73  db_out;.  if( is
103d0 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20  Threadsafe ){.  
103e0 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71    db->mutex = sq
103f0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10400 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
10410 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28  URSIVE);.    if(
10420 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b   db->mutex==0 ){
10430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
10440 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64  ree(db);.      d
10450 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74  b = 0;.      got
10460 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
10470 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
10480 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10490 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
104a0 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a  errMask = 0xff;.
104b0 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20    db->nDb = 2;. 
104c0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
104d0 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
104e0 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
104f0 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73  aDbStatic;..  as
10500 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d  sert( sizeof(db-
10510 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66  >aLimit)==sizeof
10520 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a  (aHardLimit) );.
10530 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69    memcpy(db->aLi
10540 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c  mit, aHardLimit,
10550 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
10560 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f  it));.  db->auto
10570 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62  Commit = 1;.  db
10580 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20  ->nextAutovac = 
10590 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61  -1;.  db->nextPa
105a0 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62  gesize = 0;.  db
105b0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
105c0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20  E_ShortColNames 
105d0 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  | SQLITE_AutoInd
105e0 65 78 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62  ex | SQLITE_Enab
105f0 6c 65 54 72 69 67 67 65 72 0a 23 69 66 20 53 51  leTrigger.#if SQ
10600 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
10610 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
10620 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
10630 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
10640 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
10650 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
10660 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10680 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
10690 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
106a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
106b0 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
106c0 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
106d0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
106e0 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
106f0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
10700 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
10710 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49  GN_KEYS) && SQLI
10720 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
10730 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20  GN_KEYS.        
10740 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
10750 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65  E_ForeignKeys.#e
10760 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
10770 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
10780 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
10790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
107a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
107b0 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
107c0 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
107d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
107e0 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
107f0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
10800 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
10810 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
10820 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
10830 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
10840 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
10850 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
10860 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
10870 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
10880 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
10890 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
108a0 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
108b0 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ure..  */.  crea
108c0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
108d0 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
108e0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 43 4f  _UTF8, SQLITE_CO
108f0 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20  LL_BINARY, 0,.  
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
10920 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
10930 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
10940 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
10950 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e   SQLITE_COLL_BIN
10960 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ARY, 0,.        
10970 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c            binCol
10980 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
10990 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
109a0 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
109b0 45 5f 55 54 46 31 36 4c 45 2c 20 53 51 4c 49 54  E_UTF16LE, SQLIT
109c0 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30  E_COLL_BINARY, 0
109d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
109e0 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c      binCollFunc,
109f0 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
10a00 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49  lation(db, "RTRI
10a10 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  M", SQLITE_UTF8,
10a20 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45   SQLITE_COLL_USE
10a30 52 2c 20 28 76 6f 69 64 2a 29 31 2c 0a 20 20 20  R, (void*)1,.   
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
10a50 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
10a60 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
10a70 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
10a80 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
10a90 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f   }.  db->pDfltCo
10aa0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
10ab0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
10ac0 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59  TE_UTF8, "BINARY
10ad0 22 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  ", 0);.  assert(
10ae0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d   db->pDfltColl!=
10af0 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  0 );..  /* Also 
10b00 61 64 64 20 61 20 55 54 46 2d 38 20 63 61 73 65  add a UTF-8 case
10b10 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6c  -insensitive col
10b20 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
10b30 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
10b40 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53  ation(db, "NOCAS
10b50 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  E", SQLITE_UTF8,
10b60 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43   SQLITE_COLL_NOC
10b70 41 53 45 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ASE, 0,.        
10b80 20 20 20 20 20 20 20 20 20 20 6e 6f 63 61 73 65            nocase
10b90 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30  CollatingFunc, 0
10ba0 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74  );..  /* Parse t
10bb0 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20  he filename/URI 
10bc0 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64  argument. */.  d
10bd0 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  b->openFlags = f
10be0 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c  lags;.  rc = sql
10bf0 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66  ite3ParseUri(zVf
10c00 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  s, zFilename, &f
10c10 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c  lags, &db->pVfs,
10c20 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73   &zOpen, &zErrMs
10c30 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
10c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
10c50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
10c60 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63  MEM ) db->malloc
10c70 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
10c80 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
10c90 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22   rc, zErrMsg ? "
10ca0 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67  %s" : 0, zErrMsg
10cb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10cc0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
10cd0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
10ce0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  t;.  }..  /* Ope
10cf0 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
10d00 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
10d10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
10d20 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
10d30 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64  s, zOpen, db, &d
10d40 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
10d50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10d60 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
10d70 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
10d80 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
10d90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10da0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10db0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
10dc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10dd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
10de0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10df0 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  (db, rc, 0);.   
10e00 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
10e10 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b  ;.  }.  db->aDb[
10e20 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  0].pSchema = sql
10e30 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
10e40 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  , db->aDb[0].pBt
10e50 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
10e60 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
10e70 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
10e80 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  );...  /* The de
10e90 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76  fault safety_lev
10ea0 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  el for the main 
10eb0 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c  database is 'ful
10ec0 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70  l'; for the temp
10ed0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69  .  ** database i
10ee0 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69  t is 'NONE'. Thi
10ef0 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  s matches the pa
10f00 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c  ger layer defaul
10f10 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ts.  .  */.  db-
10f20 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[0].zName = 
10f30 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44  "main";.  db->aD
10f40 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[0].safety_leve
10f50 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62  l = 3;.  db->aDb
10f60 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
10f70 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
10f80 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
10f90 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  1;..  db->magic 
10fa0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
10fb0 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
10fc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
10fd0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
10fe0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
10ff0 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
11000 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
11010 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
11020 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
11030 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
11040 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
11050 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
11060 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
11070 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
11080 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
11090 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
110a0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
110b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
110c0 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74  sterBuiltinFunct
110d0 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ions(db);..  /* 
110e0 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65  Load automatic e
110f0 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65  xtensions - exte
11100 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  nsions that have
11110 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
11120 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
11130 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69  sqlite3_automati
11140 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50  c_extension() AP
11150 49 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  I..  */.  sqlite
11160 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69  3AutoLoadExtensi
11170 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  ons(db);.  rc = 
11180 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
11190 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  db);.  if( rc!=S
111a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
111b0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
111c0 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
111d0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
111e0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
111f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
11200 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
11210 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
11220 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
11230 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
11240 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
11250 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11260 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
11270 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11280 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
11290 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
112a0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
112b0 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
112c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
112d0 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
112e0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
112f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
11300 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S3.  if( !db->ma
11310 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
11320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
11340 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
11350 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
11360 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
11370 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
11380 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
11390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
113a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
113b0 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
113c0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
113d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
113e0 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
113f0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
11400 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
11410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
11420 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
11430 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
11440 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
11450 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  );..  /* -DSQLIT
11460 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
11470 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
11480 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
11490 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
114a0 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
114b0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
114c0 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
114d0 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
114e0 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
114f0 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
11500 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
11510 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
11520 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
11530 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
11540 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
11550 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
11560 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
11570 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
11580 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
11590 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
115a0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
115b0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
115e0 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
115f0 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
11600 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20    /* Enable the 
11610 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63  lookaside-malloc
11620 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20   subsystem */.  
11630 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
11640 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f  b, 0, sqlite3Glo
11650 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
11660 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  aside,.         
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11680 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
11690 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a  ig.nLookaside);.
116a0 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  .  sqlite3_wal_a
116b0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
116c0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
116d0 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
116e0 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75  INT);..opendb_ou
116f0 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
11700 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20  e(zOpen);.  if( 
11710 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  db ){.    assert
11720 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c  ( db->mutex!=0 |
11730 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d  | isThreadsafe==
11740 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  0 || sqlite3Glob
11750 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
11760 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
11770 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11780 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
11790 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
117a0 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
117b0 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c  assert( db!=0 ||
117c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
117d0 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  M );.  if( rc==S
117e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
117f0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
11800 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
11810 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
11820 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11830 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
11840 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
11850 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20  ;.  }.  *ppDb = 
11860 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  db;.  return sql
11870 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
11880 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  c);.}../*.** Ope
11890 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
118a0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
118b0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20  sqlite3_open(.  
118c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
118d0 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
118e0 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72  3 **ppDb .){.  r
118f0 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
11900 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70  se(zFilename, pp
11910 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
11920 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11930 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
11940 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
11950 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  EATE, 0);.}.int 
11960 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
11970 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
11980 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61  ilename,   /* Da
11990 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
119a0 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
119b0 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
119c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
119d0 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  ite db handle */
119e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
119f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
11a00 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
11a10 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
11a20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
11a30 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f  module to use */
11a40 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
11a50 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61  nDatabase(filena
11a60 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67  me, ppDb, (unsig
11a70 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a  ned int)flags, z
11a80 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Vfs);.}..#ifndef
11a90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
11aa0 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  16./*.** Open a 
11ab0 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
11ac0 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
11ad0 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f  te3_open16(.  co
11ae0 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
11af0 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
11b00 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72  **ppDb.){.  char
11b10 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d   const *zFilenam
11b20 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61  e8;   /* zFilena
11b30 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  me encoded in UT
11b40 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55  F-8 instead of U
11b50 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-16 */.  sqlit
11b60 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
11b70 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
11b80 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29  ert( zFilename )
11b90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44 62  ;.  assert( ppDb
11ba0 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b   );.  *ppDb = 0;
11bb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11bc0 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
11bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
11be0 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
11bf0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
11c00 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d  .#endif.  pVal =
11c10 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
11c20 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
11c30 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
11c40 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53  -1, zFilename, S
11c50 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
11c60 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
11c70 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20  );.  zFilename8 
11c80 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
11c90 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
11ca0 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69  UTF8);.  if( zFi
11cb0 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72  lename8 ){.    r
11cc0 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65  c = openDatabase
11cd0 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44  (zFilename8, ppD
11ce0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
11cf0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
11d00 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
11d10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
11d20 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  ATE, 0);.    ass
11d30 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63  ert( *ppDb || rc
11d40 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11d50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
11d60 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61  LITE_OK && !DbHa
11d70 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c  sProperty(*ppDb,
11d80 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
11d90 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45 4e  ded) ){.      EN
11da0 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54  C(*ppDb) = SQLIT
11db0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
11dc0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
11dd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11de0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  MEM;.  }.  sqlit
11df0 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
11e00 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  );..  return sql
11e10 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
11e20 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  c);.}.#endif /* 
11e30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
11e40 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
11e50 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
11e60 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
11e70 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
11e80 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
11e90 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
11ea0 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  _collation(.  sq
11eb0 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
11ec0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
11ed0 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
11ee0 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
11ef0 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
11f00 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
11f10 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
11f20 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
11f30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11f40 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
11f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
11f60 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11f70 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
11f80 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
11f90 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 53 51 4c  me, (u8)enc, SQL
11fa0 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70  ITE_COLL_USER, p
11fb0 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
11fc0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11fd0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
11fe0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
11ff0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
12000 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
12010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
12020 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
12030 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
12040 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
12050 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
12060 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
12070 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73  ollation_v2(.  s
12080 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
12090 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
120a0 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
120b0 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
120c0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
120d0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
120e0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
120f0 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
12100 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
12110 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
12120 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
12130 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
12140 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
12150 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
12160 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
12170 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
12180 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  nc, SQLITE_COLL_
12190 55 53 45 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d  USER, pCtx, xCom
121a0 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
121b0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
121c0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
121d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
121e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
121f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
12200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12210 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
12220 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
12230 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12240 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
12250 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
12260 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
12270 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
12280 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
12290 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
122a0 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20  ame,.  int enc, 
122b0 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
122c0 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
122d0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
122e0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
122f0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
12300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12310 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a    char *zName8;.
12320 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12330 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
12340 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
12350 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
12360 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69  .  zName8 = sqli
12370 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
12380 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
12390 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
123a0 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a    if( zName8 ){.
123b0 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43      rc = createC
123c0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
123d0 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 53 51  me8, (u8)enc, SQ
123e0 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20  LITE_COLL_USER, 
123f0 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
12400 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
12410 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
12420 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
12430 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
12440 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
12450 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
12460 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
12470 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
12480 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
12490 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
124a0 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
124b0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
124c0 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
124d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
124e0 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
124f0 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
12500 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
12510 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12520 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
12530 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
12540 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
12550 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
12560 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
12570 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
12580 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
12590 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
125a0 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
125b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
125c0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
125d0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
125e0 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e  lNeeded = xCollN
125f0 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f  eeded;.  db->xCo
12600 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a  llNeeded16 = 0;.
12610 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
12620 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
12630 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
12640 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12650 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
12660 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12670 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12680 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
12690 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
126a0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
126b0 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
126c0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
126d0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
126e0 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
126f0 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
12700 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
12710 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
12720 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
12730 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20  tion_needed16(. 
12740 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
12750 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
12760 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
12770 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76  xCollNeeded16)(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 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c   void*).){.  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 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e   0;.  db->xCollN
127f0 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e  eeded16 = xCollN
12800 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70  eeded16;.  db->p
12810 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
12820 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
12830 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12840 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12850 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12860 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
12870 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
12880 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  F16 */..#ifndef 
12890 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
128a0 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
128b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
128c0 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d  w an anachronism
128d0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20  . It used to be 
128e0 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20  used to recover 
128f0 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63  from a.** malloc
12900 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20  () failure, but 
12910 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20  SQLite now does 
12920 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  this automatical
12930 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
12940 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  e3_global_recove
12950 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  r(void){.  retur
12960 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
12970 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  endif../*.** Tes
12980 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
12990 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61   or not the data
129a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
129b0 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
129c0 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72  .** mode.  Retur
129d0 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
129e0 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  and FALSE if not
129f0 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  .  Autocommit mo
12a00 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64  de is on.** by d
12a10 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d  efault.  Autocom
12a20 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20  mit is disabled 
12a30 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  by a BEGIN state
12a40 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c  ment and reenabl
12a50 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78  ed.** by the nex
12a60 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  t COMMIT or ROLL
12a70 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  BACK..**.*******
12a80 20 54 48 49 53 20 49 53 20 41 4e 20 45 58 50 45   THIS IS AN EXPE
12a90 52 49 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e 44  RIMENTAL API AND
12aa0 20 49 53 20 53 55 42 4a 45 43 54 20 54 4f 20 43   IS SUBJECT TO C
12ab0 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a  HANGE ******.*/.
12ac0 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
12ad0 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
12ae0 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
12af0 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  n db->autoCommit
12b00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
12b10 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
12b20 73 20 61 72 65 20 73 75 62 74 69 74 75 74 65 73  s are subtitutes
12b30 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53   for constants S
12b40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a  QLITE_CORRUPT,.*
12b50 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  * SQLITE_MISUSE,
12b60 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
12b70 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 61  , SQLITE_IOERR a
12b80 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65  nd possibly othe
12b90 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74  r error.** const
12ba0 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76  ants.  They serv
12bb0 65 72 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a  er two purposes:
12bc0 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72  .**.**   1.  Ser
12bd0 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65  ve as a convenie
12be0 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20  nt place to set 
12bf0 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20  a breakpoint in 
12c00 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20  a debugger.**   
12c10 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68      to detect wh
12c20 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72  en version error
12c30 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75   conditions occu
12c40 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20  rs..**.**   2.  
12c50 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c  Invoke sqlite3_l
12c60 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20  og() to provide 
12c70 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20  the source code 
12c80 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a  location where.*
12c90 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65  *       a low-le
12ca0 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72  vel error is fir
12cb0 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a  st detected..*/.
12cc0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
12cd0 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  ptError(int line
12ce0 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
12cf0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12d00 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
12d10 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
12d20 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20  LITE_CORRUPT,.  
12d30 20 20 20 20 20 20 20 20 20 20 20 20 22 64 61 74              "dat
12d40 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
12d50 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
12d60 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
12d70 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
12d80 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
12d90 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
12da0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
12db0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73  }.int sqlite3Mis
12dc0 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  useError(int lin
12dd0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
12de0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
12df0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
12e00 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
12e10 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20  QLITE_MISUSE, . 
12e20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 69               "mi
12e30 73 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20  suse at line %d 
12e40 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
12e50 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
12e60 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
12e70 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
12e80 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
12e90 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  E;.}.int sqlite3
12ea0 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e  CantopenError(in
12eb0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
12ec0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
12ed0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
12ee0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
12ef0 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  log(SQLITE_CANTO
12f00 50 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  PEN, .          
12f10 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e      "cannot open
12f20 20 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64   file at line %d
12f30 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
12f40 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
12f50 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
12f60 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
12f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
12f80 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  OPEN;.}...#ifnde
12f90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
12fa0 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
12fb0 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  his is a conveni
12fc0 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61  ence routine tha
12fd0 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  t makes sure tha
12fe0 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65  t all thread-spe
12ff0 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f  cific.** data fo
13000 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61  r this thread ha
13010 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s been deallocat
13020 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ed..**.** SQLite
13030 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
13040 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20  thread-specific 
13050 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75  data so this rou
13060 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a  tine is now a.**
13070 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72   no-op.  It is r
13080 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74  etained for hist
13090 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69  orical compatibi
130a0 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lity..*/.void sq
130b0 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
130c0 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65  anup(void){.}.#e
130d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
130e0 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  rn meta informat
130f0 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63  ion about a spec
13100 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ific column of a
13110 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
13120 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20  .** See comment 
13130 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71  in sqlite3.h (sq
13140 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64  lite.h.in) for d
13150 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65  etails..*/.#ifde
13160 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13170 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
13180 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
13190 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
131a0 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
131b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
131c0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
131d0 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
131e0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
131f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
13200 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
13210 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13220 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
13230 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
13240 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
13250 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
13260 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
13270 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
13280 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
13290 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
132a0 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
132b0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
132c0 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
132d0 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
132e0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
132f0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
13300 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
13310 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
13320 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
13330 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
13340 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
13350 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
13360 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
13370 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
13380 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
13390 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
133a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
133b0 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
133c0 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
133d0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
133e0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
133f0 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
13400 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
13410 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
13420 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63    int iCol;..  c
13430 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61  har const *zData
13440 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
13450 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71   const *zCollSeq
13460 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e   = 0;.  int notn
13470 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ull = 0;.  int p
13480 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20  rimarykey = 0;. 
13490 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30   int autoinc = 0
134a0 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  ;..  /* Ensure t
134b0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
134c0 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64  ma has been load
134d0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
134e0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
134f0 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
13500 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
13510 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
13520 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  e3Init(db, &zErr
13530 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  Msg);.  if( SQLI
13540 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
13550 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
13560 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
13570 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71  e the table in q
13580 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61  uestion */.  pTa
13590 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
135a0 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e  able(db, zTableN
135b0 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  ame, zDbName);. 
135c0 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54   if( !pTab || pT
135d0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
135e0 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
135f0 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
13600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
13610 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77  the column for w
13620 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71  hich info is req
13630 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  uested */.  if( 
13640 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
13650 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20  ColumnName) ){. 
13660 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
13670 69 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69  iPKey;.    if( i
13680 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
13690 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
136a0 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  ol[iCol];.    }.
136b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
136c0 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
136d0 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
136e0 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
136f0 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
13700 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
13710 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
13720 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
13730 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
13740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13750 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13760 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f   iCol==pTab->nCo
13770 6c 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  l ){.      pTab 
13780 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
13790 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
137a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
137b0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
137c0 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69  tores the meta i
137d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
137e0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
137f0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  .  ** to the cal
13800 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  ler in local var
13810 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65  iables zDataType
13820 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e  , zCollSeq, notn
13830 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a  ull, primarykey.
13840 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63    ** and autoinc
13850 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
13860 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f  there are two po
13870 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a  ssibilities:.  *
13880 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54  * .  **     1. T
13890 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  he specified col
138a0 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77  umn name was row
138b0 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f  id", "oid" or "_
138c0 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20  rowid_" .  **   
138d0 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69       and there i
138e0 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20  s no explicitly 
138f0 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c  declared IPK col
13900 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  umn. .  **.  ** 
13910 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65      2. The table
13920 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61   is not a view a
13930 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  nd the column na
13940 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e  me identified an
13950 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78   .  **        ex
13960 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
13970 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d  d column. Copy m
13980 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
13990 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f  from *pCol..  */
139a0 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a   .  if( pCol ){.
139b0 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
139c0 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
139d0 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c   zCollSeq = pCol
139e0 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74  ->zColl;.    not
139f0 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74  null = pCol->not
13a00 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69  Null!=0;.    pri
13a10 6d 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d  marykey  = pCol-
13a20 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20  >isPrimKey!=0;. 
13a30 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
13a40 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
13a50 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
13a60 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
13a70 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
13a80 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
13a90 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
13aa0 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
13ab0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
13ac0 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
13ad0 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22  llSeq = "BINARY"
13ae0 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
13af0 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  :.  sqlite3Btree
13b00 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
13b10 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20   /* Whether the 
13b20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75  function call su
13b30 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65  cceeded or faile
13b40 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  d, set the outpu
13b50 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a  t parameters.  *
13b60 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68  * to whatever th
13b70 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65  eir local counte
13b80 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20  rparts contain. 
13b90 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  If an error did 
13ba0 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73  occur,.  ** this
13bb0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
13bc0 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f  of zeroing all o
13bd0 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
13be0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44  ..  */.  if( pzD
13bf0 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74  ataType ) *pzDat
13c00 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70  aType = zDataTyp
13c10 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53  e;.  if( pzCollS
13c20 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20  eq ) *pzCollSeq 
13c30 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66  = zCollSeq;.  if
13c40 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e  ( pNotNull ) *pN
13c50 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c  otNull = notnull
13c60 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79  ;.  if( pPrimary
13c70 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b  Key ) *pPrimaryK
13c80 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b  ey = primarykey;
13c90 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20  .  if( pAutoinc 
13ca0 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75  ) *pAutoinc = au
13cb0 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51  toinc;..  if( SQ
13cc0 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21  LITE_OK==rc && !
13cd0 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
13ce0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
13cf0 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72  rrMsg);.    zErr
13d00 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
13d10 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63  intf(db, "no suc
13d20 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
13d30 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  %s.%s", zTableNa
13d40 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  me,.        zCol
13d50 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  umnName);.    rc
13d60 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
13d70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
13d80 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  ror(db, rc, (zEr
13d90 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
13da0 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
13db0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
13dc0 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
13dd0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
13de0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
13df0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
13e00 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
13e10 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
13e20 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
13e30 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
13e40 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
13e50 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
13e60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
13e70 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
13e80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13e90 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
13ea0 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
13eb0 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
13ec0 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
13ed0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
13ee0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
13ef0 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
13f00 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
13f10 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
13f20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
13f30 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
13f40 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
13f50 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
13f60 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
13f70 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
13f80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13f90 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
13fa0 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
13fb0 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
13fc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
13fd0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
13fe0 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
13ff0 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20  b, int onoff){. 
14000 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14010 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
14020 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
14030 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
14040 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71  fff : 0xff;.  sq
14050 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14060 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
14070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
14090 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72  e the xFileContr
140a0 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70  ol method on a p
140b0 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
140c0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
140d0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
140e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
140f0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
14100 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
14110 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  pArg){.  int rc 
14120 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
14130 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
14140 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14150 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
14160 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b  f( zDbName==0 ){
14170 0a 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20  .    iDb = 0;.  
14180 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
14190 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  Db=0; iDb<db->nD
141a0 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20  b; iDb++){.     
141b0 20 69 66 28 20 73 74 72 63 6d 70 28 64 62 2d 3e   if( strcmp(db->
141c0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
141d0 7a 44 62 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  zDbName)==0 ) br
141e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
141f0 20 69 66 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62   if( iDb<db->nDb
14200 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   ){.    Btree *p
14210 42 74 72 65 65 20 3d 20 64 62 2d 3e 61 44 62 5b  Btree = db->aDb[
14220 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  iDb].pBt;.    if
14230 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
14240 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
14250 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14260 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 20 20 73  ile *fd;.      s
14270 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14280 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20  (pBtree);.      
14290 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
142a0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65  BtreePager(pBtre
142b0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
142c0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
142d0 20 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65       fd = sqlite
142e0 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
142f0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
14300 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( fd!=0 );.     
14310 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
14320 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
14330 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  ER ){.        *(
14340 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70  sqlite3_file**)p
14350 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  Arg = fd;.      
14360 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14370 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
14380 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
14390 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
143a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
143b0 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
143c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
143d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
143e0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
143f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14400 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
14410 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tree);.    }.  }
14420 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
14430 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
14440 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
14450 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65    .}../*.** Inte
14460 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
14470 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
14480 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
14490 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
144a0 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
144b0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
144c0 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
144d0 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61  TEST.  va_list a
144e0 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
144f0 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
14500 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
14510 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
14520 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
14530 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
14540 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14550 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
14560 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
14570 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
14580 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
14590 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
145a0 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
145b0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
145c0 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
145d0 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
145e0 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
145f0 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
14600 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
14610 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
14620 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
14630 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
14640 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
14650 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
14660 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
14670 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
14680 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
14690 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
146a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
146b0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
146c0 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
146d0 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
146e0 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
146f0 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
14700 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
14710 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
14720 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
14730 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
14740 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
14750 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
14760 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
14770 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
14780 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
14790 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
147a0 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
147b0 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74  sqlite3PrngReset
147c0 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
147d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
147e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
147f0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
14800 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
14810 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
14820 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
14830 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
14840 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
14850 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
14860 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
14870 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
14880 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
14890 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
148a0 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
148b0 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
148c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
148d0 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
148e0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
148f0 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
14900 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
14910 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
14920 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
14930 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
14940 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
14950 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
14960 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
14970 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
14980 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
14990 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
149a0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
149b0 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
149c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
149d0 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
149e0 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
149f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
14a00 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
14a10 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
14a20 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
14a30 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
14a40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
14a50 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
14a60 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
14a70 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
14a80 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
14a90 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
14aa0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
14ab0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
14ac0 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
14ad0 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
14ae0 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
14af0 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
14b00 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
14b10 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
14b20 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
14b30 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
14b40 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
14b50 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
14b60 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
14b70 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
14b80 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
14b90 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
14ba0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
14bb0 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
14bc0 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
14bd0 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
14be0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
14bf0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
14c00 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
14c10 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
14c20 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
14c30 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
14c40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
14c50 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
14c60 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
14c70 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
14c80 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
14c90 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
14ca0 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
14cb0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
14cc0 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
14cd0 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
14ce0 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
14cf0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
14d00 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
14d10 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
14d20 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
14d30 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
14d40 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
14d50 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
14d60 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
14d70 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
14d80 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
14d90 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
14da0 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
14db0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14dc0 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
14dd0 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
14de0 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72 69  .    ** dileteri
14df0 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
14e00 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
14e10 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
14e20 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
14e30 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47      rc = PENDING
14e40 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53  _BYTE;.#ifndef S
14e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
14e60 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
14e70 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56  nsigned int newV
14e80 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
14e90 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
14ea0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61         if( newVa
14eb0 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69  l ) sqlite3Pendi
14ec0 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b  ngByte = newVal;
14ed0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
14ee0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14ef0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
14f00 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
14f10 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
14f20 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
14f30 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
14f40 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
14f50 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
14f60 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
14f70 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
14f80 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
14f90 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
14fa0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
14fb0 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
14fc0 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
14fd0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
14fe0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
14ff0 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
15000 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
15010 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
15020 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
15030 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
15040 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
15050 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
15060 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
15070 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
15080 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
15090 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
150a0 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
150b0 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
150c0 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
150d0 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
150e0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
150f0 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
15100 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
15110 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
15120 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
15130 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
15140 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15150 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  (x = va_arg(ap,i
15160 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  nt))!=0 );.     
15170 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62   rc = x;.      b
15180 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
15190 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
151a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
151b0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
151c0 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29  L_ALWAYS, int X)
151d0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
151e0 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
151f0 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
15200 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74  est to see how t
15210 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20  he ALWAYS and.  
15220 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f    ** NEVER macro
15230 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61  s were defined a
15240 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a  t compile-time..
15250 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
15260 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
15270 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20  s ALWAYS(X).  . 
15280 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
15290 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73   recommended tes
152a0 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74  t is X==2.  If t
152b0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
152c0 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 2, that means
152d0 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29  .    ** ALWAYS()
152e0 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
152f0 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73   both no-op pass
15300 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c  -through macros,
15310 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20   which is the.  
15320 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74    ** default set
15330 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65  ting.  If the re
15340 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c  turn value is 1,
15350 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69   then ALWAYS() i
15360 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  s either.    ** 
15370 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
15380 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73  ue or else it as
15390 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67  serts if its arg
153a0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a  ument is false..
153b0 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
153c0 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d   behavior (hard-
153d0 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69  coded to true) i
153e0 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
153f0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
15400 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
15410 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
15420 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20  is disabled and 
15430 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
15440 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65  * behavior (asse
15450 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  rt if the argume
15460 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69  nt to ALWAYS() i
15470 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20  s false) is the 
15480 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
15490 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
154a0 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
154b0 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
154c0 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  bled..    **.   
154d0 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65   ** The run-time
154e0 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20   test procedure 
154f0 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74  might look somet
15500 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
15510 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
15520 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
15530 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
15540 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
15550 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a  , 2)==2 ){.    *
15560 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
15570 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
15580 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  re no-op pass-th
15590 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20  rough macros.   
155a0 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   **    }else if(
155b0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
155c0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
155d0 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29  TCTRL_ASSERT, 1)
155e0 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   ){.    **      
155f0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73  // ALWAYS(x) ass
15600 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74  erts that x is t
15610 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73  rue. NEVER(x) as
15620 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65  serts x is false
15630 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  ..    **    }els
15640 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  e{.    **      /
15650 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61  / ALWAYS(x) is a
15660 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45   constant 1.  NE
15670 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73  VER(x) is a cons
15680 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20  tant 0..    **  
15690 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63    }.    */.    c
156a0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
156b0 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20  TRL_ALWAYS: {.  
156c0 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
156d0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
156e0 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29    rc = ALWAYS(x)
156f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15700 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
15710 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
15720 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
15730 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c  TRL_RESERVE, sql
15740 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
15750 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
15760 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  et the nReserve 
15770 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68  size to N for th
15780 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15790 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
157a0 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f      ** connectio
157b0 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  n db..    */.   
157c0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
157d0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b  TCTRL_RESERVE: {
157e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
157f0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
15800 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
15810 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
15820 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  ap,int);.      s
15830 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15840 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
15850 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
15860 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d  eSetPageSize(db-
15870 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20  >aDb[0].pBt, 0, 
15880 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  x, 0);.      sql
15890 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
158a0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
158b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
158c0 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
158d0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
158e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
158f0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c  TIMIZATIONS, sql
15900 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
15910 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
15920 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
15930 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
15940 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69  ations for testi
15950 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
15960 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  e .    ** argume
15970 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73  nt N is a bitmas
15980 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f  k of optimizatio
15990 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ns to be disable
159a0 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20  d.  For normal. 
159b0 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20     ** operation 
159c0 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20  N should be 0.  
159d0 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
159e0 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20   a test program 
159f0 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a  (like the.    **
15a00 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20   SQL Logic Test 
15a10 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75  or SLT test modu
15a20 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20  le) can run the 
15a30 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c  same SQL multipl
15a40 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77  e times.    ** w
15a50 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ith various opti
15a60 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c  mizations disabl
15a70 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
15a80 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  t the same answe
15a90 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61  r.    ** is obta
15aa0 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61  ined in every ca
15ab0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  se..    */.    c
15ac0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
15ad0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
15ae0 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
15af0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
15b00 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
15b10 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
15b20 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
15b30 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
15b40 78 20 26 20 53 51 4c 49 54 45 5f 4f 70 74 4d 61  x & SQLITE_OptMa
15b50 73 6b 29 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  sk) | (db->flags
15b60 20 26 20 7e 53 51 4c 49 54 45 5f 4f 70 74 4d 61   & ~SQLITE_OptMa
15b70 73 6b 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  sk);.      break
15b80 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
15b90 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
15ba0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
15bb0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
15bc0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
15bd0 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68  EYWORD, const ch
15be0 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a  ar *zWord).    *
15bf0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72  *.    ** If zWor
15c00 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72  d is a keyword r
15c10 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65  ecognized by the
15c20 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65   parser, then re
15c30 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  turn the.    ** 
15c40 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72  number of keywor
15c50 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64  ds.  Or if zWord
15c60 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72   is not a keywor
15c70 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20  d, return 0..   
15c80 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73   ** .    ** This
15c90 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69 73   test feature is
15ca0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
15cb0 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  in the amalgamat
15cc0 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a  ion since.    **
15cd0 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45   the SQLITE_N_KE
15ce0 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e  YWORD macro is n
15cf0 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ot defined in th
15d00 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74  is file if SQLit
15d10 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c  e.    ** is buil
15d20 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  t using separate
15d30 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20   source files.. 
15d40 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15d50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
15d60 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20  SKEYWORD: {.    
15d70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
15d80 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ord = va_arg(ap,
15d90 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20   const char*);. 
15da0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
15db0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f  ite3Strlen30(zWo
15dc0 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rd);.      rc = 
15dd0 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43  (sqlite3KeywordC
15de0 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20  ode((u8*)zWord, 
15df0 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c  n)!=TK_ID) ? SQL
15e00 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20  ITE_N_KEYWORD : 
15e10 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
15e20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20      }.#endif .. 
15e30 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
15e40 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
15e50 45 5f 54 45 53 54 43 54 52 4c 5f 50 47 48 44 52  E_TESTCTRL_PGHDR
15e60 53 5a 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  SZ).    **.    *
15e70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
15e80 65 20 6f 66 20 61 20 70 63 61 63 68 65 20 68 65  e of a pcache he
15e90 61 64 65 72 20 69 6e 20 62 79 74 65 73 2e 0a 20  ader in bytes.. 
15ea0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
15eb0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
15ec0 47 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20  GHDRSZ: {.      
15ed0 72 63 20 3d 20 73 69 7a 65 6f 66 28 50 67 48 64  rc = sizeof(PgHd
15ee0 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
15ef0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
15f00 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
15f10 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
15f20 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
15f30 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46  C, sz, &pNew, pF
15f40 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ree);.    **.   
15f50 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69   ** Pass pFree i
15f60 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74  nto sqlite3Scrat
15f70 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a  chFree(). .    *
15f80 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61  * If sz>0 then a
15f90 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63  llocate a scratc
15fa0 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e  h buffer into pN
15fb0 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ew.  .    */.   
15fc0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
15fd0 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
15fe0 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  LOC: {.      voi
15ff0 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65  d *pFree, **ppNe
16000 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  w;.      int sz;
16010 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61  .      sz = va_a
16020 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
16030 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72     ppNew = va_ar
16040 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20  g(ap, void**);. 
16050 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f       pFree = va_
16060 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
16070 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a        if( sz ) *
16080 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53  ppNew = sqlite3S
16090 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29  cratchMalloc(sz)
160a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
160b0 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65  cratchFree(pFree
160c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
160d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
160e0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
160f0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
16100 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
16110 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29  AULT, int onoff)
16120 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
16130 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f  If parameter ono
16140 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ff is non-zero, 
16150 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72  configure the wr
16160 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61  appers so that a
16170 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71  ll.    ** subseq
16180 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f  uent calls to lo
16190 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61  caltime() and va
161a0 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20  riants fail. If 
161b0 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20  onoff is zero,. 
161c0 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20     ** undo this 
161d0 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
161e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
161f0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
16200 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
16210 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
16220 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65  onfig.bLocaltime
16230 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61  Fault = va_arg(a
16240 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
16250 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  reak;.    }..  }
16260 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
16270 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16280 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
16290 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
162a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
162b0 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
162c0 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
162d0 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
162e0 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
162f0 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
16300 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
16310 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
16320 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
16330 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
16340 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
16350 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
16360 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
16370 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
16380 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
16390 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
163a0 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
163b0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
163c0 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
163d0 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
163e0 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
163f0 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
16400 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
16410 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
16420 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
16430 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
16440 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
16450 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
16460 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
16470 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
16480 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
16490 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
164a0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
164b0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
164c0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
164d0 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
164e0 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
164f0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
16500 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
16510 29 7b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  ){.  zFilename +
16520 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
16530 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
16540 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65  ;.  while( zFile
16550 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
16560 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46  nt x = strcmp(zF
16570 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
16580 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
16590 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
165a0 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
165b0 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20  1;.    if( x==0 
165c0 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61  ) return zFilena
165d0 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  me;.    zFilenam
165e0 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
165f0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
16600 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  + 1;.  }.  retur
16610 6e 20 30 3b 0a 7d 0a                             n 0;.}.