/ Hex Artifact Content
Login

Artifact 3be0ccf84c92da06aae7f56cf39a9ee7bfddf799:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 34 38 32  ATION-OF: R-5482
06a0: 33 2d 34 31 33 34 33 20 54 68 65 20 73 71 6c 69  3-41343 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 6d 75 74  was compiled mut
0700: 65 78 69 6e 67 20 63 6f 64 65 20 6f 6d 69 74 74  exing code omitt
0710: 65 64 20 64 75 65 20 74 6f 0a 2a 2a 20 74 68 65  ed due to.** the
0720: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
0730: 46 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  FE compile-time 
0740: 6f 70 74 69 6f 6e 20 62 65 69 6e 67 20 73 65 74  option being set
0750: 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
0760: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0770: 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53  (void){ return S
0780: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
0790: 3b 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ; }..#if !define
07a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
07b0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
07c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
07d0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
07e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
07f0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0800: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0810: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0820: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0830: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0840: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0850: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0860: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0870: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0880: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0890: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
08a0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
08b0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  ivity only..*/.v
08c0: 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54  oid (*sqlite3IoT
08d0: 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72  race)(const char
08e0: 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e  *, ...) = 0;.#en
08f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
0900: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
0910: 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  al variable poin
0920: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77  ts to a string w
0930: 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e  hich is the.** n
0940: 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
0950: 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69  ry, then that di
0960: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
0970: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
0980: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
0990: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
09a0: 20 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d   the "PRAGMA tem
09b0: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
09c0: 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a  y" SQL command..
09d0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
09e0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
09f0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  = 0;../*.** Init
0a00: 69 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20  ialize SQLite.  
0a10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0a20: 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
0a30: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
0a40: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0a50: 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20  cation,.** VFS, 
0a60: 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
0a70: 74 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f  tems prior to do
0a80: 69 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20  ing any serious 
0a90: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c  work with.** SQL
0aa0: 69 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e  ite.  But as lon
0ab0: 67 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20  g as you do not 
0ac0: 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c  compile with SQL
0ad0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
0ae0: 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  T.** this routin
0af0: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
0b00: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
0b10: 79 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73  y key routines s
0b20: 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65  uch as.** sqlite
0b30: 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a  3_open().  .**.*
0b40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0b50: 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74  s a no-op except
0b60: 20 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72   on its very fir
0b70: 73 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20  st call for the 
0b80: 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66  process,.** or f
0b90: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  or the first cal
0ba0: 6c 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  l after a call t
0bb0: 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  o sqlite3_shutdo
0bc0: 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  wn..**.** The fi
0bd0: 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61  rst thread to ca
0be0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
0bf0: 72 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c  runs the initial
0c00: 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f  ization to.** co
0c10: 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75  mpletion.  If su
0c20: 62 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73  bsequent threads
0c30: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
0c40: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ne before the fi
0c50: 72 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61  rst.** thread ha
0c60: 73 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69  s finished the i
0c70: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
0c80: 6f 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20  ocess, then the 
0c90: 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68  subsequent.** th
0ca0: 72 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b  reads must block
0cb0: 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
0cc0: 20 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73   thread finishes
0cd0: 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
0ce0: 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  lization..**.** 
0cf0: 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  The first thread
0d00: 20 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73   might call this
0d10: 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69   routine recursi
0d20: 76 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65  vely.  Recursive
0d30: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  .** calls to thi
0d40: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
0d50: 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63   not block, of c
0d60: 6f 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73  ourse.  Otherwis
0d70: 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
0d80: 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20  ization process 
0d90: 77 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70  would never comp
0da0: 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20  lete..**.** Let 
0db0: 58 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74  X be the first t
0dc0: 68 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74  hread to enter t
0dd0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65  his routine.  Le
0de0: 74 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65  t Y be some othe
0df0: 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68  r.** thread.  Th
0e00: 65 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69  en while the ini
0e10: 74 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tial invocation 
0e20: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
0e30: 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d  by X is.** incom
0e40: 70 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71  plete, it is req
0e50: 75 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a  uired that:.**.*
0e60: 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f  *    *  Calls to
0e70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
0e80: 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20  om Y must block 
0e90: 75 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d  until the outer-
0ea0: 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61  most.**       ca
0eb0: 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65  ll by X complete
0ec0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52  s..**.**    *  R
0ed0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
0ee0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  o this routine f
0ef0: 72 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74  rom thread X ret
0f00: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
0f10: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74  **       without
0f20: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e   blocking..*/.in
0f30: 74 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  t sqlite3_initia
0f40: 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 73 71  lize(void){.  sq
0f50: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
0f60: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
0f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0f80: 65 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75  e main static mu
0f90: 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  tex */.  int rc;
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
0fd0: 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
0fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
0ff0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
1000: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
1010: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1020: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1030: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1040: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c  dif..  /* If SQL
1050: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 63  ite is already c
1060: 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61  ompletely initia
1070: 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73  lized, then this
1080: 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71   call.  ** to sq
1090: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
10a0: 28 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e  () should be a n
10b0: 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69  o-op.  But the i
10c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
10d0: 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c  ** must be compl
10e0: 65 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20  ete.  So isInit 
10f0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20  must not be set 
1100: 75 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20 65  until the very e
1110: 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  nd.  ** of this 
1120: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
1130: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1140: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
1150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1160: 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  K;..  /* Make su
1170: 72 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  re the mutex sub
1180: 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61  system is initia
1190: 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c  lized.  If unabl
11a0: 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69  e to .  ** initi
11b0: 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20  alize the mutex 
11c0: 73 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72  subsystem, retur
11d0: 6e 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65  n early with the
11e0: 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20   error..  ** If 
11f0: 74 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f  the system is so
1200: 20 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72   sick that we ar
1210: 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  e unable to allo
1220: 63 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20  cate a mutex,.  
1230: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  ** there is not 
1240: 6d 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67  much SQLite is g
1250: 6f 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20  oing to be able 
1260: 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  to do..  **.  **
1270: 20 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   The mutex subsy
1280: 73 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63  stem must take c
1290: 61 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69  are of serializi
12a0: 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20  ng its own.  ** 
12b0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
12c0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
12d0: 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a  te3MutexInit();.
12e0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12f0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  n rc;..  /* Init
1300: 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f  ialize the mallo
1310: 63 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74  c() system and t
1320: 68 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e  he recursive pIn
1330: 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20  itMutex mutex.. 
1340: 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69   ** This operati
1350: 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  on is protected 
1360: 62 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41  by the STATIC_MA
1370: 53 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74  STER mutex.  Not
1380: 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65  e that.  ** Mute
1390: 78 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c  xAlloc() is call
13a0: 65 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20  ed for a static 
13b0: 6d 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69  mutex prior to i
13c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a  nitializing the.
13d0: 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73    ** malloc subs
13e0: 79 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70  ystem - this imp
13f0: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c  lies that the al
1400: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74  location of a st
1410: 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20  atic.  ** mutex 
1420: 6d 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65  must not require
1430: 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68   support from th
1440: 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  e malloc subsyst
1450: 65 6d 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  em..  */.  pMast
1460: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
1470: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
1480: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
1490: 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  R);.  sqlite3_mu
14a0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
14b0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
14c0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
14d0: 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  xInit = 1;.  if(
14e0: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
14f0: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
1500: 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  it ){.    rc = s
1510: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74  qlite3MallocInit
1520: 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ();.  }.  if( rc
1530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1540: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1550: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
1560: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nit = 1;.    if(
1570: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1580: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1590: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
15b0: 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20  nitMutex =.     
15c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74        sqlite3Mut
15d0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
15e0: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
15f0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1600: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1610: 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73 71  CoreMutex && !sq
1620: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1630: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1640: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1650: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1660: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
1670: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47   ){.    sqlite3G
1690: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
16a0: 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d  InitMutex++;.  }
16b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16c0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
16d0: 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20  ..  /* If rc is 
16e0: 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74  not SQLITE_OK at
16f0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
1700: 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c  n either the mal
1710: 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74  loc.  ** subsyst
1720: 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  em could not be 
1730: 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74  initialized or t
1740: 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64  he system failed
1750: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a   to allocate.  *
1760: 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78  * the pInitMutex
1770: 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61   mutex. Return a
1780: 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65  n error in eithe
1790: 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66  r case.  */.  if
17a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74  ;.  }..  /* Do t
17d0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
17e0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e  nitialization un
17f0: 64 65 72 20 74 68 65 20 72 65 63 75 72 73 69 76  der the recursiv
1800: 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20  e mutex so.  ** 
1810: 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
1820: 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72  able to handle r
1830: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69  ecursive calls i
1840: 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1850: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
1860: 54 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  The recursive ca
1870: 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d  lls normally com
1880: 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73  e through.  ** s
1890: 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29  qlite3_os_init()
18a0: 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73   when it invokes
18b0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
18c0: 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68  ister(), but oth
18d0: 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76  er.  ** recursiv
18e0: 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c  e calls might al
18f0: 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a  so be possible..
1900: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
1910: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30  ENTATION-OF: R-0
1920: 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74  0140-37445 SQLit
1930: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
1940: 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73  serializes calls
1950: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e  .  ** to the xIn
1960: 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68  it method, so th
1970: 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e  e xInit method n
1980: 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61  eed not be threa
1990: 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dsafe..  **.  **
19a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
19b0: 75 74 65 78 20 69 73 20 77 68 61 74 20 73 65 72  utex is what ser
19c0: 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74  ializes access t
19d0: 6f 20 74 68 65 20 61 70 70 64 65 66 20 70 63 61  o the appdef pca
19e0: 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d  che xInit.  ** m
19f0: 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c  ethods.  The sql
1a00: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
1a10: 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20  ods.xInit() all 
1a20: 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74  is embedded in t
1a30: 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  he.  ** call to 
1a40: 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69  sqlite3PcacheIni
1a50: 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a  tialize()..  */.
1a60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1a70: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f  enter(sqlite3Glo
1a80: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1a90: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
1aa0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ab0: 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71  .isInit==0 && sq
1ac0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ad0: 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20  g.inProgress==0 
1ae0: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61  ){.    FuncDefHa
1af0: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f  sh *pHash = &GLO
1b00: 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c  BAL(FuncDefHash,
1b10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75   sqlite3GlobalFu
1b20: 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71  nctions);.    sq
1b30: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b40: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31  g.inProgress = 1
1b50: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61  ;.    memset(pHa
1b60: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  sh, 0, sizeof(sq
1b70: 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74  lite3GlobalFunct
1b80: 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69  ions));.    sqli
1b90: 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61  te3RegisterGloba
1ba0: 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20  lFunctions();.  
1bb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1bc0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1bd0: 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  heInit==0 ){.   
1be0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1bf0: 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28  cacheInitialize(
1c00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1c30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
1c40: 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20  acheInit = 1;.  
1c50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c60: 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a  OsInit();.    }.
1c70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1c90: 71 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66  qlite3PCacheBuff
1ca0: 65 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33  erSetup( sqlite3
1cb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
1cc0: 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  ge, .          s
1cd0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ce0: 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74  ig.szPage, sqlit
1cf0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1d00: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Page);.      sql
1d10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1d20: 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  .isInit = 1;.   
1d30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c   }.    sqlite3Gl
1d40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1d50: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  gress = 0;.  }. 
1d60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d70: 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62  eave(sqlite3Glob
1d80: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1d90: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62  tex);..  /* Go b
1da0: 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74  ack under the st
1db0: 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63  atic mutex and c
1dc0: 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 63 75  lean up the recu
1dd0: 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78  rsive.  ** mutex
1de0: 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65   to prevent a re
1df0: 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a  source leak..  *
1e00: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1e10: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
1e20: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
1e30: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1e40: 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73  Mutex--;.  if( s
1e50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e60: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1e70: 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=0 ){.    asser
1e80: 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  t( sqlite3Global
1e90: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1ea0: 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
1eb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1ec0: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
1ed0: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1f00: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Mutex = 0;.  }. 
1f10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1f20: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1f30: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1f40: 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e  ng is just a san
1f50: 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ity check to mak
1f60: 65 20 73 75 72 65 20 53 51 4c 69 74 65 20 68 61  e sure SQLite ha
1f70: 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70  s.  ** been comp
1f80: 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  iled correctly. 
1f90: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
1fa0: 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64   to run this cod
1fb0: 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64  e, but.  ** we d
1fc0: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e  on't want to run
1fd0: 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e   it too often an
1fe0: 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79  d soak up CPU cy
1ff0: 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a  cles for no.  **
2000: 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20   reason.  So we 
2010: 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69  run it once duri
2020: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
2030: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
2040: 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53  NDEBUG.#ifndef S
2050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
2060: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54  ING_POINT.  /* T
2070: 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63  his section of c
2080: 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70  ode's only "outp
2090: 75 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72  ut" is via asser
20a0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  t() statements. 
20b0: 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51  */.  if ( rc==SQ
20c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
20d0: 36 34 20 78 20 3d 20 28 28 28 75 36 34 29 31 29  64 x = (((u64)1)
20e0: 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75  <<63)-1;.    dou
20f0: 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72  ble y;.    asser
2100: 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b  t(sizeof(x)==8);
2110: 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65  .    assert(size
2120: 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29  of(x)==sizeof(y)
2130: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79  );.    memcpy(&y
2140: 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73  , &x, 8);.    as
2150: 73 65 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e  sert( sqlite3IsN
2160: 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  aN(y) );.  }.#en
2170: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  dif.#endif..  re
2180: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2190: 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63  * Undo the effec
21a0: 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e  ts of sqlite3_in
21b0: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73  itialize().  Mus
21c0: 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  t not be called 
21d0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61  while.** there a
21e0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
21f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2200: 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c  ons or memory al
2210: 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20  locations or.** 
2220: 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f  while any part o
2230: 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65  f SQLite is othe
2240: 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20  rwise in use in 
2250: 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69  any thread.  Thi
2260: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
2270: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20  not threadsafe. 
2280: 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20   But it is safe 
2290: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  to invoke this r
22a0: 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65  outine.** on whe
22b0: 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  n SQLite is alre
22c0: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20  ady shut down.  
22d0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  If SQLite is alr
22e0: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a  eady shut down.*
22f0: 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
2300: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  ine is invoked, 
2310: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
2320: 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
2330: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
2340: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76  lite3_shutdown(v
2350: 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  oid){.  if( sqli
2360: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2370: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  isInit ){.    sq
2380: 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a  lite3_os_end();.
2390: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
23a0: 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e  t_auto_extension
23b0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
23c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
23d0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  it = 0;.  }.  if
23e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
23f0: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
2400: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
2410: 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28  3PcacheShutdown(
2420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
2430: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
2440: 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  cheInit = 0;.  }
2450: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2460: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
2470: 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  locInit ){.    s
2480: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28  qlite3MallocEnd(
2490: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
24a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
24b0: 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  locInit = 0;.  }
24c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74  obalConfig.isMut
24e0: 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  exInit ){.    sq
24f0: 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b  lite3MutexEnd();
2500: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2510: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78  alConfig.isMutex
2520: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Init = 0;.  }.. 
2530: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2540: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
2550: 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c   API allows appl
2560: 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69  ications to modi
2570: 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f  fy the global co
2580: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a  nfiguration of.*
2590: 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  * the SQLite lib
25a0: 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65  rary at run-time
25b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25c0: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
25d0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
25e0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
25f0: 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61  standing.** data
2600: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2610: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
2620: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f  ations.  This ro
2630: 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  utine is not.** 
2640: 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61 69  threadsafe.  Fai
2650: 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68 65  lure to heed the
2660: 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20  se warnings can 
2670: 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63  lead to unpredic
2680: 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f  table.** behavio
2690: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
26a0: 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c  3_config(int op,
26b0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
26c0: 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   ap;.  int rc = 
26d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
26e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
26f0: 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53  ) shall return S
2700: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20  QLITE_MISUSE if 
2710: 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68  it is invoked wh
2720: 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  ile.  ** the SQL
2730: 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20 69  ite library is i
2740: 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20  n use. */.  if( 
2750: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2760: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
2770: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
2780: 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74  E_BKPT;..  va_st
2790: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
27a0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
27b0: 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69    /* Mutex confi
27c0: 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
27d0: 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61   are only availa
27e0: 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73  ble in a threads
27f0: 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  afe.    ** compi
2800: 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20  le. .    */.#if 
2810: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2820: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
2830: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
2840: 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  0.    case SQLIT
2850: 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54  E_CONFIG_SINGLET
2860: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
2870: 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75  * Disable all mu
2880: 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  texing */.      
2890: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
28a0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
28b0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
28c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
28d0: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20  ullMutex = 0;.  
28e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2900: 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52  _CONFIG_MULTITHR
2910: 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAD: {.      /* 
2920: 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67  Disable mutexing
2930: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
2940: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  nections */.    
2950: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
2960: 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74  xing of core dat
2970: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
2980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2990: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
29a0: 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  utex = 1;.      
29b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
29c0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
29d0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
29e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
29f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45  SQLITE_CONFIG_SE
2a00: 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20  RIALIZED: {.    
2a10: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20    /* Enable all 
2a20: 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20  mutexing */.    
2a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2a40: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
2a50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
2a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2a70: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a  bFullMutex = 1;.
2a80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a90: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2aa0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a  TE_CONFIG_MUTEX:
2ab0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
2ac0: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
2ad0: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
2ae0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
2af0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b00: 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61  nfig.mutex = *va
2b10: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
2b20: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
2b30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2b40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2b50: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
2b60: 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  UTEX: {.      /*
2b70: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
2b80: 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c  rrent mutex impl
2b90: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
2ba0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
2bb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
2bc0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
2bd0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
2be0: 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tex;.      break
2bf0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2c00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2c10: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20  _CONFIG_MALLOC: 
2c20: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
2c30: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
2c40: 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65  e malloc impleme
2c50: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
2c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2c70: 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67  nfig.m = *va_arg
2c80: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
2c90: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
2ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2cb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2cc0: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a  ONFIG_GETMALLOC:
2cd0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
2ce0: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
2cf0: 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d   malloc() implem
2d00: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2d10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2d20: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c  balConfig.m.xMal
2d30: 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  loc==0 ) sqlite3
2d40: 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b  MemSetDefault();
2d50: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
2d60: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  p, sqlite3_mem_m
2d70: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
2d80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2d90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2da0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2db0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53  LITE_CONFIG_MEMS
2dc0: 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f  TATUS: {.      /
2dd0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
2de0: 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73  ble the malloc s
2df0: 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e  tatus collection
2e00: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2e10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d  3GlobalConfig.bM
2e20: 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28  emstat = va_arg(
2e30: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
2e40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2e50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2e60: 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20  FIG_SCRATCH: {. 
2e70: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
2e80: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73  e a buffer for s
2e90: 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70  cratch memory sp
2ea0: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ace */.      sql
2eb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2ec0: 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .pScratch = va_a
2ed0: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
2ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2ef0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
2f00: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
2f10: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
2f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2f30: 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  nScratch = va_ar
2f40: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
2f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2f60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2f70: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a  ONFIG_PAGECACHE:
2f80: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69   {.      /* Desi
2f90: 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66  gnate a buffer f
2fa0: 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65  or page cache me
2fb0: 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20  mory space */.  
2fc0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2fd0: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20  lConfig.pPage = 
2fe0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
2ff0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3000: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50  GlobalConfig.szP
3010: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3020: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3030: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3040: 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28  .nPage = va_arg(
3050: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3060: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3070: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3080: 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20  NFIG_PCACHE: {. 
3090: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
30a0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
30b0: 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d  age cache implem
30c0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
30d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
30e0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 20 3d 20 2a  onfig.pcache = *
30f0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3100: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
3110: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
3120: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3130: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3140: 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20  GETPCACHE: {.   
3150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3160: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3170: 65 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  e.xInit==0 ){.  
3180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
3190: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
31a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
31b0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
31c0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
31d0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
31e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
31f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3200: 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65     }..#if define
3210: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
3220: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
3230: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
3240: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
3250: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3260: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
3270: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
3280: 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d  uffer for heap m
3290: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
32a0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
32b0: 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d  alConfig.pHeap =
32c0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
32d0: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
32e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
32f0: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
3300: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3310: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3320: 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28  .mnReq = va_arg(
3330: 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20  ap, int);..     
3340: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3350: 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d  alConfig.pHeap==
3360: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
3370: 49 66 20 74 68 65 20 68 65 61 70 20 70 6f 69 6e  If the heap poin
3380: 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ter is NULL, the
3390: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 6d 61  n restore the ma
33a0: 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lloc implementat
33b0: 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ion.        ** b
33c0: 61 63 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e  ack to NULL poin
33d0: 74 65 72 73 20 74 6f 6f 2e 20 20 54 68 69 73 20  ters too.  This 
33e0: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d  will cause the m
33f0: 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20  alloc to go.    
3400: 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69      ** back to i
3410: 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65  ts default imple
3420: 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73  mentation when s
3430: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
3440: 65 28 29 20 69 73 0a 20 20 20 20 20 20 20 20 2a  e() is.        *
3450: 2a 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a  * run..        *
3460: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  /.        memset
3470: 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  (&sqlite3GlobalC
3480: 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65  onfig.m, 0, size
3490: 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  of(sqlite3Global
34a0: 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20  Config.m));.    
34b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34c0: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 70 6f 69   /* The heap poi
34d0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
34e0: 2c 20 74 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f  , then install o
34f0: 6e 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ne of the.      
3500: 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33    ** mem5.c/mem3
3510: 2e 63 20 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e  .c methods. If n
3520: 65 69 74 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45  either ENABLE_ME
3530: 4d 53 59 53 33 20 6e 6f 72 0a 20 20 20 20 20 20  MSYS3 nor.      
3540: 20 20 2a 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53    ** ENABLE_MEMS
3550: 59 53 35 20 69 73 20 64 65 66 69 6e 65 64 2c 20  YS5 is defined, 
3560: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  return an error.
3570: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
3580: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
3590: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
35a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
35b0: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
35c0: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
35d0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
35e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
35f0: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
3600: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3610: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
3620: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
3630: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
3640: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3650: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
3660: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3670: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
3680: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3690: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
36a0: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
36b0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
36c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
36d0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
36e0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
36f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3700: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
3710: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
3720: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
3730: 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69  ction and its fi
3740: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
3750: 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74    ** The default
3760: 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69   is NULL.  Loggi
3770: 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ng is disabled i
3780: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  f the function p
3790: 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a  ointer is.    **
37a0: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
37b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
37c0: 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20  NFIG_LOG: {.    
37d0: 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
37e0: 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
37f0: 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
3800: 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
3810: 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
3820: 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
3830: 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
3840: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
3850: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
3860: 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28  arg(ap, void(*)(
3870: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
3880: 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a  char*));.      *
3890: 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
38a0: 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29  void(*LOGFUNC_t)
38b0: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
38c0: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73   char*);.      s
38d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
38e0: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
38f0: 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b  (ap, LOGFUNC_t);
3900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3910: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41  obalConfig.pLogA
3920: 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  rg = va_arg(ap, 
3930: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72  void*);.      br
3940: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
3950: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
3960: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
3970: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
3980: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
3990: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
39a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
39b0: 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73  et up the lookas
39c0: 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72 20  ide buffers for 
39d0: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
39e0: 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e  ction..** Return
39f0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
3a00: 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c  ccess.  .** If l
3a10: 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65  ookaside is alre
3a20: 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74 75  ady active, retu
3a30: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
3a40: 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72  **.** The sz par
3a50: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75  ameter is the nu
3a60: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
3a70: 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20   each lookaside 
3a80: 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74  slot..** The cnt
3a90: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
3aa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  e number of slot
3ab0: 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69 73  s.  If pStart is
3ac0: 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61   NULL the.** spa
3ad0: 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61  ce for the looka
3ae0: 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f  side memory is o
3af0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
3b00: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
3b10: 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20 6e  * If pStart is n
3b20: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20  ot NULL then it 
3b30: 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20  is sz*cnt bytes 
3b40: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65  of memory to use
3b50: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b   for.** the look
3b60: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  aside memory..*/
3b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 75  .static int setu
3b80: 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74  pLookaside(sqlit
3b90: 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42  e3 *db, void *pB
3ba0: 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  uf, int sz, int 
3bb0: 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70 53  cnt){.  void *pS
3bc0: 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tart;.  if( db->
3bd0: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29  lookaside.nOut )
3be0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
3bf0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
3c00: 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69 73  /* Free any exis
3c10: 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62  ting lookaside b
3c20: 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20 68  uffer for this h
3c30: 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a  andle before.  *
3c40: 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * allocating a n
3c50: 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e  ew one so we don
3c60: 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65 20  't have to have 
3c70: 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20  space for .  ** 
3c80: 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d 65  both at the same
3c90: 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   time..  */.  if
3ca0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
3cb0: 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  bMalloced ){.   
3cc0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
3cd0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
3ce0: 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68  rt);.  }.  /* Th
3cf0: 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b  e size of a look
3d00: 61 73 69 64 65 20 73 6c 6f 74 20 6e 65 65 64 73  aside slot needs
3d10: 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68   to be larger th
3d20: 61 6e 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a  an a pointer.  *
3d30: 2a 20 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a  * to be useful..
3d40: 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28    */.  if( sz<=(
3d50: 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61  int)sizeof(Looka
3d60: 73 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20  sideSlot*) ) sz 
3d70: 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30  = 0;.  if( cnt<0
3d80: 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66   ) cnt = 0;.  if
3d90: 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d  ( sz==0 || cnt==
3da0: 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b  0 ){.    sz = 0;
3db0: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b  .    pStart = 0;
3dc0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75  .  }else if( pBu
3dd0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  f==0 ){.    sz =
3de0: 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b   ROUNDDOWN8(sz);
3df0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
3e00: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 20 20 73 71  -09382 */.    sq
3e10: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
3e20: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53  Malloc();.    pS
3e30: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  tart = sqlite3Ma
3e40: 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20  lloc( sz*cnt ); 
3e50: 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34 39   /* IMP: R-61949
3e60: 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73 71  -35727 */.    sq
3e70: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
3e80: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 65 6c 73 65 7b  lloc();.  }else{
3e90: 0a 20 20 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  .    sz = ROUNDD
3ea0: 4f 57 4e 38 28 73 7a 29 3b 20 2f 2a 20 49 4d 50  OWN8(sz); /* IMP
3eb0: 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20  : R-33038-09382 
3ec0: 2a 2f 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  */.    pStart = 
3ed0: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
3ee0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
3ef0: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
3f00: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
3f10: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
3f20: 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29  aside.sz = (u16)
3f30: 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74  sz;.  if( pStart
3f40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3f50: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
3f60: 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
3f70: 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f   sz > (int)sizeo
3f80: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
3f90: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f  ) );.    p = (Lo
3fa0: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74  okasideSlot*)pSt
3fb0: 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63  art;.    for(i=c
3fc0: 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  nt-1; i>=0; i--)
3fd0: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
3fe0: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
3ff0: 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62  .pFree;.      db
4000: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
4010: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d  e = p;.      p =
4020: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
4030: 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a  )&((u8*)p)[sz];.
4040: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f      }.    db->lo
4050: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70  okaside.pEnd = p
4060: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
4070: 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31  ide.bEnabled = 1
4080: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
4090: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
40a0: 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20  pBuf==0 ?1:0;.  
40b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
40c0: 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20  ookaside.pEnd = 
40d0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  0;.    db->looka
40e0: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
40f0: 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  0;.    db->looka
4100: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
4110: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
4120: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4130: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4140: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
4150: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
4160: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4170: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73  sqlite3_mutex *s
4180: 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
4190: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
41a0: 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78  return db->mutex
41b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
41c0: 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67  guration setting
41d0: 73 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64  s for an individ
41e0: 75 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ual database con
41f0: 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73  nection.*/.int s
4200: 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
4210: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
4220: 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  t op, ...){.  va
4230: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
4240: 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  rc;.  va_start(a
4250: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
4260: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
4270: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
4280: 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20  _LOOKASIDE: {.  
4290: 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d      void *pBuf =
42a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
42b0: 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 31  *); /* IMP: R-21
42c0: 31 31 32 2d 31 32 32 37 35 20 2a 2f 0a 20 20 20  112-12275 */.   
42d0: 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
42e0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20  rg(ap, int);    
42f0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38     /* IMP: R-478
4300: 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20  71-25994 */.    
4310: 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61    int cnt = va_a
4320: 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20  rg(ap, int);    
4330: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36    /* IMP: R-0446
4340: 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20  0-53386 */.     
4350: 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61   rc = setupLooka
4360: 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73  side(db, pBuf, s
4370: 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62  z, cnt);.      b
4380: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4390: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
43a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
43b0: 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32  OR; /* IMP: R-42
43c0: 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20  790-23372 */.   
43d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
43e0: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
43f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4400: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
4410: 74 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66  true if the buff
4420: 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e  er z[0..n-1] con
4430: 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73  tains all spaces
4440: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4450: 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20  allSpaces(const 
4460: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
4470: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
4480: 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20   z[n-1]==' ' ){ 
4490: 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  n--; }.  return 
44a0: 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n==0;.}../*.** T
44b0: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
44c0: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  lt collating fun
44d0: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e  ction named "BIN
44e0: 41 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c  ARY" which is al
44f0: 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  ways.** availabl
4500: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
4510: 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74  padFlag argument
4520: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
4530: 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20  n space padding 
4540: 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66  at the end.** of
4550: 20 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f   strings is igno
4560: 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65  red.  This imple
4570: 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20  ments the RTRIM 
4580: 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  collation..*/.st
4590: 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c  atic int binColl
45a0: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61  Func(.  void *pa
45b0: 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65  dFlag,.  int nKe
45c0: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
45d0: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
45e0: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
45f0: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
4600: 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79  c, n;.  n = nKey
4610: 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20  1<nKey2 ? nKey1 
4620: 3a 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20  : nKey2;.  rc = 
4630: 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
4640: 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
4650: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
4660: 70 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20  padFlag.     && 
4670: 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72  allSpaces(((char
4680: 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79  *)pKey1)+n, nKey
4690: 31 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c  1-n).     && all
46a0: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
46b0: 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e  Key2)+n, nKey2-n
46c0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
46d0: 2a 20 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61  * Leave rc uncha
46e0: 6e 67 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20  nged at 0 */.   
46f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
4700: 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32   = nKey1 - nKey2
4710: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4720: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4730: 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d  * Another built-
4740: 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  in collating seq
4750: 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a  uence: NOCASE. .
4760: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61  **.** This colla
4770: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
4780: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
4790: 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69  used for "case i
47a0: 6e 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f  ndependant.** co
47b0: 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74  mparison". SQLit
47c0: 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  e's knowledge of
47d0: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
47e0: 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74   case equivalent
47f0: 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c  s.** extends onl
4800: 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72  y to the 26 char
4810: 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74  acters used in t
4820: 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he English langu
4830: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  age..**.** At th
4840: 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69  e moment there i
4850: 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69  s only a UTF-8 i
4860: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
4870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63  /.static int noc
4880: 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
4890: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
48a0: 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
48b0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
48c0: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
48d0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
48e0: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73  2.){.  int r = s
48f0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a  qlite3StrNICmp(.
4900: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
4910: 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73  r *)pKey1, (cons
4920: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20  t char *)pKey2, 
4930: 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b  (nKey1<nKey2)?nK
4940: 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e  ey1:nKey2);.  UN
4950: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
4960: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30  otUsed);.  if( 0
4970: 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e  ==r ){.    r = n
4980: 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a  Key1-nKey2;.  }.
4990: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
49a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
49b0: 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73  ROWID of the mos
49c0: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a  t recent insert.
49d0: 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  */.sqlite_int64 
49e0: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
49f0: 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65  ert_rowid(sqlite
4a00: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
4a10: 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a   db->lastRowid;.
4a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4a30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
4a40: 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73  anges in the mos
4a50: 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f  t recent call to
4a60: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e   sqlite3_exec().
4a70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
4a80: 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  changes(sqlite3 
4a90: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
4aa0: 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  b->nChange;.}../
4ab0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4ac0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
4ad0: 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  s since the data
4ae0: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
4af0: 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  opened..*/.int s
4b00: 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
4b10: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
4b20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
4b30: 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a  nTotalChange;.}.
4b40: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
4b50: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
4b60: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
4b70: 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73  only manipulates
4b80: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a   fields of the.*
4b90: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
4ba0: 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65  e object, it doe
4bb0: 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20  s not close any 
4bc0: 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20  savepoints that 
4bd0: 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61  may be open.** a
4be0: 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67  t the b-tree/pag
4bf0: 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69  er level..*/.voi
4c00: 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61  d sqlite3CloseSa
4c10: 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33  vepoints(sqlite3
4c20: 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20   *db){.  while( 
4c30: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29  db->pSavepoint )
4c40: 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20  {.    Savepoint 
4c50: 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76  *pTmp = db->pSav
4c60: 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e  epoint;.    db->
4c70: 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d  pSavepoint = pTm
4c80: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  p->pNext;.    sq
4c90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4ca0: 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  pTmp);.  }.  db-
4cb0: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
4cc0: 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  .  db->nStatemen
4cd0: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54  t = 0;.  db->isT
4ce0: 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f  ransactionSavepo
4cf0: 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  int = 0;.}../*.*
4d00: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  * Invoke the des
4d10: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
4d20: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4d30: 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61   FuncDef p, if a
4d40: 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69  ny. Except,.** i
4d50: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
4d60: 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74  e last copy of t
4d70: 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20  he function, do 
4d80: 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d  not invoke it. M
4d90: 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65  ultiple.** copie
4da0: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75  s of a single fu
4db0: 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74  nction are creat
4dc0: 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66  ed when create_f
4dd0: 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  unction() is cal
4de0: 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  led.** with SQLI
4df0: 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e  TE_ANY as the en
4e00: 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  coding..*/.stati
4e10: 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44  c void functionD
4e20: 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a  estroy(sqlite3 *
4e30: 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b  db, FuncDef *p){
4e40: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
4e50: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d  r *pDestructor =
4e60: 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 3b   p->pDestructor;
4e70: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
4e80: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
4e90: 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  uctor->nRef--;. 
4ea0: 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74     if( pDestruct
4eb0: 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  or->nRef==0 ){. 
4ec0: 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72       pDestructor
4ed0: 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74  ->xDestroy(pDest
4ee0: 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74  ructor->pUserDat
4ef0: 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
4f00: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73  3DbFree(db, pDes
4f10: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
4f20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
4f30: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53  se an existing S
4f40: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a  QLite database.*
4f50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  /.int sqlite3_cl
4f60: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ose(sqlite3 *db)
4f70: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
4fa0: 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  e iterator */.  
4fb0: 69 6e 74 20 6a 3b 0a 0a 20 20 69 66 28 20 21 64  int j;..  if( !d
4fc0: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
4fd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
4fe0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
4ff0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
5000: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
5010: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
5020: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
5030: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5040: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  (db->mutex);..  
5050: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
5060: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
5070: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  );..  /* If a tr
5080: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
5090: 6e 2c 20 74 68 65 20 52 65 73 65 74 49 6e 74 65  n, the ResetInte
50a0: 72 6e 61 6c 53 63 68 65 6d 61 28 29 20 63 61 6c  rnalSchema() cal
50b0: 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c  l above.  ** wil
50c0: 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65  l not have calle
50d0: 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  d the xDisconnec
50e0: 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e  t() method on an
50f0: 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74  y virtual.  ** t
5100: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d  ables in the db-
5110: 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79  >aVTrans[] array
5120: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
5130: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
5140: 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20  ack().  ** call 
5150: 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e  will do so. We n
5160: 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62  eed to do this b
5170: 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20  efore the check 
5180: 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20  for active.  ** 
5190: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62  SQL statements b
51a0: 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74  elow, as the v-t
51b0: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
51c0: 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69  ion may be stori
51d0: 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65  ng.  ** some pre
51e0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
51f0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
5200: 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52  /.  sqlite3VtabR
5210: 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20  ollback(db);..  
5220: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
5230: 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  any outstanding 
5240: 56 4d 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  VMs, return SQLI
5250: 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66  TE_BUSY. */.  if
5260: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20  ( db->pVdbe ){. 
5270: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
5280: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
5290: 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
52a0: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
52b0: 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64 20 73 74  o unfinalised st
52c0: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
52d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
52e0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
52f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5300: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73  E_BUSY;.  }.  as
5310: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 61 66  sert( sqlite3Saf
5320: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
5330: 28 64 62 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a  (db) );..  for(j
5340: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
5350: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
5360: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  pBt = db->aDb[j]
5370: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
5380: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
5390: 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29  eIsInBackup(pBt)
53a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
53b0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
53c0: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
53d0: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c     "unable to cl
53e0: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
53f0: 69 73 68 65 64 20 62 61 63 6b 75 70 20 6f 70 65  ished backup ope
5400: 72 61 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  ration");.      
5410: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
5420: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
5430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5440: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
5450: 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
5460: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
5470: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
5480: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
5490: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
54a0: 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  (db);..  for(j=0
54b0: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
54c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
54d0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
54e0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [j];.    if( pDb
54f0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73  ->pBt ){.      s
5500: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
5510: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pDb->pBt);.    
5520: 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a    pDb->pBt = 0;.
5530: 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29        if( j!=1 )
5540: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70  {.        pDb->p
5550: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
5560: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5570: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
5580: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
5590: 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68  );..  /* Tell th
55a0: 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79  e code in notify
55b0: 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e  .c that the conn
55c0: 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72  ection no longer
55d0: 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20   holds any.  ** 
55e0: 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e  locks and does n
55f0: 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66  ot require any f
5600: 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f  urther unlock-no
5610: 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
5620: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
5630: 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64  nnectionClosed(d
5640: 62 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64  b);..  assert( d
5650: 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61  b->nDb<=2 );.  a
5660: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d  ssert( db->aDb==
5670: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b  db->aDbStatic );
5680: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72  .  for(j=0; j<Ar
5690: 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e  raySize(db->aFun
56a0: 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  c.a); j++){.    
56b0: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
56c0: 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20  *pHash, *p;.    
56d0: 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e  for(p=db->aFunc.
56e0: 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68  a[j]; p; p=pHash
56f0: 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d  ){.      pHash =
5700: 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20   p->pHash;.     
5710: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
5720: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
5730: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
5740: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
5750: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
5760: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5770: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d   p);.        p =
5780: 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a   pNext;.      }.
5790: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
57a0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
57b0: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
57c0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
57d0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
57e0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
57f0: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
5800: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
5810: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
5820: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
5830: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
5840: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
5850: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
5860: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
5870: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
5880: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
5890: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
58a0: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
58b0: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
58c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
58d0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
58e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
58f0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
5900: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
5910: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
5920: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
5930: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
5940: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
5950: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
5960: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
5970: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
5980: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
5990: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
59a0: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
59b0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
59c0: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
59d0: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
59e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
59f0: 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73  , pMod);.  }.  s
5a00: 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28  qlite3HashClear(
5a10: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
5a20: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
5a30: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
5a40: 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c  _OK, 0); /* Deal
5a50: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
5a60: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
5a70: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70  . */.  if( db->p
5a80: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
5a90: 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e  e3ValueFree(db->
5aa0: 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pErr);.  }.  sql
5ab0: 69 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69  ite3CloseExtensi
5ac0: 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e  ons(db);..  db->
5ad0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
5ae0: 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  AGIC_ERROR;..  /
5af0: 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62  * The temp-datab
5b00: 61 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c  ase schema is al
5b10: 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e  located differen
5b20: 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  tly from the oth
5b30: 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f  er schema.  ** o
5b40: 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71  bjects (using sq
5b50: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72  liteMalloc() dir
5b60: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
5b70: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  f sqlite3BtreeSc
5b80: 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f  hema())..  ** So
5b90: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
5ba0: 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f  freed here. Todo
5bb0: 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74  : Why not roll t
5bc0: 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69  he temp schema i
5bd0: 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d  nto.  ** the sam
5be0: 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  e sqliteMalloc()
5bf0: 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74   as the one that
5c00: 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64   allocates the d
5c10: 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74  atabase .  ** st
5c20: 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20  ructure?.  */.  
5c30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5c40: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  , db->aDb[1].pSc
5c50: 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  hema);.  sqlite3
5c60: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
5c70: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d  >mutex);.  db->m
5c80: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
5c90: 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71  GIC_CLOSED;.  sq
5ca0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
5cb0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
5cc0: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
5cd0: 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20  side.nOut==0 ); 
5ce0: 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c   /* Fails on a l
5cf0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
5d00: 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62  leak */.  if( db
5d10: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
5d20: 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  loced ){.    sql
5d30: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f  ite3_free(db->lo
5d40: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b  okaside.pStart);
5d50: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
5d60: 72 65 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  ree(db);.  retur
5d70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5d80: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
5d90: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
5da0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
5db0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71  e3RollbackAll(sq
5dc0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
5dd0: 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61  t i;.  int inTra
5de0: 6e 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ns = 0;.  assert
5df0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5e00: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
5e10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
5e20: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
5e30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
5e40: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
5e50: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
5e60: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  pBt ){.      if(
5e70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
5e80: 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69  nTrans(db->aDb[i
5e90: 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  ].pBt) ){.      
5ea0: 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20    inTrans = 1;. 
5eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
5ec0: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
5ed0: 6b 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  k(db->aDb[i].pBt
5ee0: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  );.      db->aDb
5ef0: 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b  [i].inTrans = 0;
5f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
5f10: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
5f20: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  (db);.  sqlite3E
5f30: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
5f40: 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61  ;..  if( db->fla
5f50: 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
5f60: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73  Changes ){.    s
5f70: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
5f80: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
5f90: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
5fa0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
5fb0: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ma(db, 0);.  }..
5fc0: 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65    /* Any deferre
5fd0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  d constraint vio
5fe0: 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77  lations have now
5ff0: 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
6000: 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  */.  db->nDeferr
6010: 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20 2f  edCons = 0;..  /
6020: 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * If one has bee
6030: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e  n configured, in
6040: 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  voke the rollbac
6050: 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20  k-hook callback 
6060: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f  */.  if( db->xRo
6070: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26  llbackCallback &
6080: 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64  & (inTrans || !d
6090: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29  b->autoCommit) )
60a0: 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  {.    db->xRollb
60b0: 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ackCallback(db->
60c0: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20  pRollbackArg);. 
60d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
60e0: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
60f0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
6100: 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
6110: 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
6120: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
6130: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
6140: 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  *sqlite3ErrStr(i
6150: 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63  nt rc){.  static
6160: 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e   const char* con
6170: 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20  st aMsg[] = {.  
6180: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20    /* SQLITE_OK  
6190: 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20          */ "not 
61a0: 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  an error",.    /
61b0: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20  * SQLITE_ERROR  
61c0: 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67       */ "SQL log
61d0: 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73  ic error or miss
61e0: 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20  ing database",. 
61f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
6200: 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20  ERNAL    */ 0,. 
6210: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52     /* SQLITE_PER
6220: 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63  M        */ "acc
6230: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ess permission d
6240: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
6250: 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20  QLITE_ABORT     
6260: 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72    */ "callback r
6270: 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61  equested query a
6280: 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bort",.    /* SQ
6290: 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20  LITE_BUSY       
62a0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73   */ "database is
62b0: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
62c0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20   SQLITE_LOCKED  
62d0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
62e0: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
62f0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6300: 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20  _NOMEM       */ 
6310: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  "out of memory",
6320: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
6330: 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61  EADONLY    */ "a
6340: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
6350: 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62  a readonly datab
6360: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
6370: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20  ITE_INTERRUPT   
6380: 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22  */ "interrupted"
6390: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
63a0: 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22  IOERR       */ "
63b0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c  disk I/O error",
63c0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
63d0: 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64  ORRUPT     */ "d
63e0: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
63f0: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22  ge is malformed"
6400: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6410: 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22  NOTFOUND    */ "
6420: 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f  unknown operatio
6430: 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  n",.    /* SQLIT
6440: 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f  E_FULL        */
6450: 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   "database or di
6460: 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20  sk is full",.   
6470: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   /* SQLITE_CANTO
6480: 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c  PEN    */ "unabl
6490: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
64a0: 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a  se file",.    /*
64b0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
64c0: 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20      */ "locking 
64d0: 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f  protocol",.    /
64e0: 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20  * SQLITE_EMPTY  
64f0: 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63       */ "table c
6500: 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22  ontains no data"
6510: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6520: 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22  SCHEMA      */ "
6530: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
6540: 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20  has changed",.  
6550: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42    /* SQLITE_TOOB
6560: 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69  IG      */ "stri
6570: 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62  ng or blob too b
6580: 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ig",.    /* SQLI
6590: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a  TE_CONSTRAINT  *
65a0: 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  / "constraint fa
65b0: 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  iled",.    /* SQ
65c0: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20  LITE_MISMATCH   
65d0: 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69   */ "datatype mi
65e0: 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20  smatch",.    /* 
65f0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20  SQLITE_MISUSE   
6600: 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72     */ "library r
6610: 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75  outine called ou
6620: 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a  t of sequence",.
6630: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
6640: 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61  LFS       */ "la
6650: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
6660: 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20   is disabled",. 
6670: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54     /* SQLITE_AUT
6680: 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74  H        */ "aut
6690: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
66a0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
66b0: 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f  E_FORMAT      */
66c0: 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74 61   "auxiliary data
66d0: 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f  base format erro
66e0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
66f0: 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f  E_RANGE       */
6700: 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e   "bind or column
6710: 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61   index out of ra
6720: 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nge",.    /* SQL
6730: 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20  ITE_NOTADB      
6740: 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72  */ "file is encr
6750: 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20  ypted or is not 
6760: 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d  a database",.  }
6770: 3b 0a 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a  ;.  rc &= 0xff;.
6780: 20 20 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e    if( ALWAYS(rc>
6790: 3d 30 29 20 26 26 20 72 63 3c 28 69 6e 74 29 28  =0) && rc<(int)(
67a0: 73 69 7a 65 6f 66 28 61 4d 73 67 29 2f 73 69 7a  sizeof(aMsg)/siz
67b0: 65 6f 66 28 61 4d 73 67 5b 30 5d 29 29 20 26 26  eof(aMsg[0])) &&
67c0: 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a   aMsg[rc]!=0 ){.
67d0: 20 20 20 20 72 65 74 75 72 6e 20 61 4d 73 67 5b      return aMsg[
67e0: 72 63 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rc];.  }else{.  
67f0: 20 20 72 65 74 75 72 6e 20 22 75 6e 6b 6e 6f 77    return "unknow
6800: 6e 20 65 72 72 6f 72 22 3b 0a 20 20 7d 0a 7d 0a  n error";.  }.}.
6810: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6820: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ine implements a
6830: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74   busy callback t
6840: 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74  hat sleeps and t
6850: 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e  ries.** again un
6860: 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61  til a timeout va
6870: 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20  lue is reached. 
6880: 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c   The timeout val
6890: 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65  ue is.** an inte
68a0: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ger number of mi
68b0: 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65  lliseconds passe
68c0: 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73  d in as the firs
68d0: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  t.** argument..*
68e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
68f0: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
6900: 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70  llback(. void *p
6910: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
6920: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
6930: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74  nnection */. int
6940: 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20   count          
6950: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6960: 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68  of times table h
6970: 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a  as been busy */.
6980: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
6990: 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64  _WIN || (defined
69a0: 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
69b0: 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20   HAVE_USLEEP).  
69c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
69d0: 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20  delays[] =.     
69e0: 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31  { 1, 2, 5, 10, 1
69f0: 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20  5, 20, 25, 25,  
6a00: 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30  25,  50,  50, 10
6a10: 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  0 };.  static co
6a20: 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20  nst u8 totals[] 
6a30: 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33  =.     { 0, 1, 3
6a40: 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33  ,  8, 18, 33, 53
6a50: 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20  , 78, 103, 128, 
6a60: 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65  178, 228 };.# de
6a70: 66 69 6e 65 20 4e 44 45 4c 41 59 20 28 73 69 7a  fine NDELAY (siz
6a80: 65 6f 66 28 64 65 6c 61 79 73 29 2f 73 69 7a 65  eof(delays)/size
6a90: 6f 66 28 64 65 6c 61 79 73 5b 30 5d 29 29 0a 20  of(delays[0])). 
6aa0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
6ab0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
6ac0: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64   int timeout = d
6ad0: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
6ae0: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
6af0: 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  or;..  assert( c
6b00: 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ount>=0 );.  if(
6b10: 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20   count < NDELAY 
6b20: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  ){.    delay = d
6b30: 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  elays[count];.  
6b40: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
6b50: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65  [count];.  }else
6b60: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
6b70: 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a  lays[NDELAY-1];.
6b80: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
6b90: 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64  ls[NDELAY-1] + d
6ba0: 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45  elay*(count-(NDE
6bb0: 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69  LAY-1));.  }.  i
6bc0: 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79  f( prior + delay
6bd0: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
6be0: 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75    delay = timeou
6bf0: 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69  t - prior;.    i
6c00: 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65  f( delay<=0 ) re
6c10: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
6c20: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
6c30: 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30  >pVfs, delay*100
6c40: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
6c50: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20  #else.  sqlite3 
6c60: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
6c70: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
6c80: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
6c90: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
6ca0: 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e  out;.  if( (coun
6cb0: 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65  t+1)*1000 > time
6cc0: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
6cd0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
6ce0: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
6cf0: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
6d00: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
6d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
6d20: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
6d30: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
6d40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6d50: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
6d60: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77  eration failed w
6d70: 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49  ith a lock..** I
6d80: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
6d90: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
6da0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
6db0: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
6dc0: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
6dd0: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
6de0: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
6df0: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
6e00: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
6e10: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
6e20: 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e  andler *p){.  in
6e30: 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45  t rc;.  if( NEVE
6e40: 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46  R(p==0) || p->xF
6e50: 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75  unc==0 || p->nBu
6e60: 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  sy<0 ) return 0;
6e70: 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63  .  rc = p->xFunc
6e80: 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75  (p->pArg, p->nBu
6e90: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  sy);.  if( rc==0
6ea0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
6eb0: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
6ec0: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
6ed0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6ee0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
6ef0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
6f00: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
6f10: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
6f20: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
6f30: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
6f40: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
6f50: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
6f60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
6f70: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
6f80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
6f90: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
6fa0: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
6fb0: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
6fc0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
6fd0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
6fe0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
6ff0: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
7000: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
7010: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
7020: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
7030: 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  y = 0;.  sqlite3
7040: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
7050: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
7060: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7070: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7080: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
7090: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
70a0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
70b0: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
70c0: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
70d0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
70e0: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
70f0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
7100: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
7110: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
7120: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
7130: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
7140: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
7150: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7160: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
7170: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
7180: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
7190: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
71a0: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
71b0: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
71c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
71d0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
71e0: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
71f0: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
7200: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
7210: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
7220: 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64  ps = nOps;.    d
7230: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
7240: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
7250: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
7260: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
7270: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
7280: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
7290: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
72a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
72b0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
72c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
72d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
72e0: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
72f0: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
7300: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
7310: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
7320: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
7330: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
7340: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
7350: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
7360: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
7370: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69  db, int ms){.  i
7380: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64  f( ms>0 ){.    d
7390: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
73a0: 20 6d 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ms;.    sqlite3
73b0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
73c0: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
73d0: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
73e0: 69 64 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65  id*)db);.  }else
73f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
7400: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
7410: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
7420: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7430: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
7440: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
7450: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
7460: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
7470: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
7480: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
7490: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
74a0: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
74b0: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
74c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
74d0: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
74e0: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
74f0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7500: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
7510: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
7520: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
7530: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
7540: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
7550: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
7560: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
7570: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
7580: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
7590: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
75a0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
75b0: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
75c0: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
75d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
75e0: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
75f0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
7600: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
7610: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
7620: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
7630: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
7640: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
7650: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
7660: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
7670: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
7680: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
7690: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
76a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
76b0: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
76c0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
76d0: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
76e0: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
76f0: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
7700: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
7710: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7720: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
7730: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
7740: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
7750: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
7760: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
7770: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
7780: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
7790: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
77a0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
77b0: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
77c0: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
77d0: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
77e0: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
77f0: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
7800: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
7810: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
7820: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
7830: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
7840: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
7850: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23  E_BKPT;.  }.  .#
7860: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7870: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
7880: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
7890: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
78a0: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
78b0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
78c0: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
78d0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
78e0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
78f0: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
7900: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
7910: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
7920: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
7930: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
7940: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
7950: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
7960: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
7970: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
7980: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
7990: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
79a0: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
79b0: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
79c0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
79d0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
79e0: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
79f0: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
7a00: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
7a10: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
7a20: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
7a30: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
7a40: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
7a50: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
7a60: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
7a70: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
7a80: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7a90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7aa0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
7ab0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
7ac0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
7ad0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a  SQLITE_UTF16LE,.
7ae0: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
7af0: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
7b00: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
7b10: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
7b20: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7b30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
7b40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
7b50: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
7b60: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
7b70: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
7b80: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
7b90: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
7ba0: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
7bb0: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
7bc0: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
7bd0: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
7be0: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
7bf0: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
7c00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
7c10: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
7c20: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
7c30: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
7c40: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
7c50: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
7c60: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
7c70: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
7c80: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
7c90: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
7ca0: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
7cb0: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
7cc0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
7cd0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
7ce0: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
7cf0: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
7d00: 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45  ( p && p->iPrefE
7d10: 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41  nc==enc && p->nA
7d20: 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20  rg==nArg ){.    
7d30: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
7d40: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
7d50: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
7d60: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
7d70: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
7d80: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
7d90: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
7da0: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
7db0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
7dc0: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
7dd0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
7de0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7df0: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
7e00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
7e10: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
7e20: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
7e30: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
7e40: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
7e50: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
7e60: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
7e70: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
7e80: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
7e90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
7ea0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
7eb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
7ec0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
7ed0: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
7ee0: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
7ef0: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
7f00: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
7f10: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
7f20: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
7f30: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
7f40: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
7f50: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
7f60: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
7f70: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
7f80: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
7f90: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
7fa0: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
7fb0: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
7fc0: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e  flags = 0;.  p->
7fd0: 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20  xFunc = xFunc;. 
7fe0: 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65   p->xStep = xSte
7ff0: 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a  p;.  p->xFinaliz
8000: 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d  e = xFinal;.  p-
8010: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73  >pUserData = pUs
8020: 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72  erData;.  p->nAr
8030: 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20  g = (u16)nArg;. 
8040: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8050: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
8060: 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63  te new user func
8070: 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tions..*/.int sq
8080: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8090: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
80a0: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
80b0: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
80c0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
80d0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
80e0: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
80f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
8100: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
8110: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
8120: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
8130: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
8140: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
8150: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
8160: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
8170: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
8180: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8190: 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63  ion_v2(db, zFunc
81a0: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
81b0: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  xFunc, xStep,.  
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a    xFinal, 0);.}.
81f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
8200: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
8210: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
8220: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
8230: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
8240: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
8250: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
8260: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
8270: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8280: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
8290: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
82a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
82b0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
82c0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
82d0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
82e0: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69  context*),.  voi
82f0: 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f  d (*xDestroy)(vo
8300: 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  id *).){.  int r
8310: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
8320: 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ;.  FuncDestruct
8330: 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20  or *pArg = 0;.  
8340: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
8350: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
8360: 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29    if( xDestroy )
8370: 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75  {.    pArg = (Fu
8380: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73  ncDestructor *)s
8390: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
83a0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75  ro(db, sizeof(Fu
83b0: 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a  ncDestructor));.
83c0: 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b      if( !pArg ){
83d0: 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28  .      xDestroy(
83e0: 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  p);.      goto o
83f0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41  ut;.    }.    pA
8400: 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78  rg->xDestroy = x
8410: 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72  Destroy;.    pAr
8420: 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  g->pUserData = p
8430: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
8440: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
8450: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
8460: 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  enc, p, xFunc, x
8470: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41  Step, xFinal, pA
8480: 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20  rg);.  if( pArg 
8490: 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30  && pArg->nRef==0
84a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
84b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
84c0: 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29  .    xDestroy(p)
84d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
84e0: 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20  ree(db, pArg);. 
84f0: 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d   }.. out:.  rc =
8500: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
8510: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
8520: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8530: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
8540: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
8550: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
8560: 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33  TF16.int sqlite3
8570: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8580: 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
8590: 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b,.  const void 
85a0: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
85b0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
85c0: 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f  t eTextRep,.  vo
85d0: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
85e0: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
85f0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8600: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
8610: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
8620: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
8630: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
8640: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
8650: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
8660: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
8670: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
8680: 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  nc8;.  sqlite3_m
8690: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
86a0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
86b0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
86c0: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
86d0: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
86e0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
86f0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
8700: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72  TF16NATIVE);.  r
8710: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
8720: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
8730: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
8740: 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  , p, xFunc, xSte
8750: 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20  p, xFinal,0);.  
8760: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8770: 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
8780: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
8790: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
87a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
87b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
87c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
87d0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  f.../*.** Declar
87e0: 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f  e that a functio
87f0: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c  n has been overl
8800: 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75  oaded by a virtu
8810: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
8820: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
8830: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
8840: 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62  s a regular glob
8850: 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  al function, the
8860: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
8870: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
8880: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
8890: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
88a0: 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20  hen create.** a 
88b0: 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77  new one that alw
88c0: 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e  ays throws a run
88d0: 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a  -time error.  .*
88e0: 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61  *.** When virtua
88f0: 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20  l tables intend 
8900: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76  to provide an ov
8910: 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f  erloaded functio
8920: 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  n, they.** shoul
8930: 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  d call this rout
8940: 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ine to make sure
8950: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
8960: 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20  tion exists..** 
8970: 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  A global functio
8980: 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20  n must exist in 
8990: 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72  order for name r
89a0: 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72  esolution to wor
89b0: 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  k.** properly..*
89c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76  /.int sqlite3_ov
89d0: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
89e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
89f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
8a00: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a  ame,.  int nArg.
8a10: 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  ){.  int nName =
8a20: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8a30: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72  (zName);.  int r
8a40: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  c;.  sqlite3_mut
8a50: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
8a60: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
8a70: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
8a80: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
8a90: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
8aa0: 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  F8, 0)==0 ){.   
8ab0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
8ac0: 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  nc(db, zName, nA
8ad0: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
8ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8af0: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
8b00: 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e  3InvalidFunction
8b10: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
8b20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
8b30: 69 45 78 69 74 28 64 62 2c 20 53 51 4c 49 54 45  iExit(db, SQLITE
8b40: 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  _OK);.  sqlite3_
8b50: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8b60: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
8b70: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
8b80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
8b90: 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  E./*.** Register
8ba0: 20 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f   a trace functio
8bb0: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
8bc0: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
8bd0: 20 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63   registered trac
8be0: 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  e.** is returned
8bf0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
8c00: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20   trace function 
8c10: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72  means that no tr
8c20: 61 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  acing is execute
8c30: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
8c40: 2a 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69  * trace is a poi
8c50: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
8c60: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
8c70: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
8c80: 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73  of each.** SQL s
8c90: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
8ca0: 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65  d *sqlite3_trace
8cb0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
8cc0: 69 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69  id (*xTrace)(voi
8cd0: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c  d*,const char*),
8ce0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
8cf0: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
8d00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8d10: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8d20: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63  pOld = db->pTrac
8d30: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61  eArg;.  db->xTra
8d40: 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64  ce = xTrace;.  d
8d50: 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
8d60: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
8d70: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
8d80: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
8d90: 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  pOld;.}./*.** Re
8da0: 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
8db0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
8dc0: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
8dd0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
8de0: 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
8df0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
8e00: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
8e10: 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
8e20: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
8e30: 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
8e40: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
8e50: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
8e60: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
8e70: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
8e80: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
8e90: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
8ea0: 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
8eb0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
8ec0: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
8ed0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
8ee0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
8ef0: 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
8f00: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
8f10: 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
8f20: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
8f30: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
8f40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8f50: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8f60: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
8f70: 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64  pProfileArg;.  d
8f80: 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50  b->xProfile = xP
8f90: 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50  rofile;.  db->pP
8fa0: 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67  rofileArg = pArg
8fb0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8fc0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8fd0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
8fe0: 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
8ff0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
9000: 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58 50 45 52 49   */../*** EXPERI
9010: 4d 45 4e 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  MENTAL ***.**.**
9020: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
9030: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
9040: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
9050: 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a  ction comments..
9060: 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65  ** If the invoke
9070: 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  d function retur
9080: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
9090: 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63  n the commit bec
90a0: 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61  omes a.** rollba
90b0: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ck..*/.void *sql
90c0: 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b  ite3_commit_hook
90d0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
90f0: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
9100: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
9110: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61  e */.  int (*xCa
9120: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
9130: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
9140: 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63  invoke on each c
9150: 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20  ommit */.  void 
9160: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
9170: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
9180: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
9190: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
91a0: 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Old;.  sqlite3_m
91b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
91c0: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
91d0: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a  db->pCommitArg;.
91e0: 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c    db->xCommitCal
91f0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
9200: 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  k;.  db->pCommit
9210: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
9220: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9230: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9240: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a  return pOld;.}..
9250: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
9260: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
9270: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
9280: 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74  e a row is updat
9290: 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20  ed,.** inserted 
92a0: 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  or deleted using
92b0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
92c0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
92d0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61  id *sqlite3_upda
92e0: 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  te_hook(.  sqlit
92f0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9300: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
9310: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
9320: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
9330: 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
9340: 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63  void*,int,char c
9350: 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73  onst *,char cons
9360: 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34  t *,sqlite_int64
9370: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9390: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
93a0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
93b0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
93c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
93d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
93e0: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55  .  pRet = db->pU
93f0: 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e  pdateArg;.  db->
9400: 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  xUpdateCallback 
9410: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
9420: 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20  b->pUpdateArg = 
9430: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
9440: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
9450: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
9460: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
9470: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
9480: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
9490: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
94a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
94b0: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74  led.** back by t
94c0: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
94d0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
94e0: 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61   *sqlite3_rollba
94f0: 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  ck_hook(.  sqlit
9500: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9510: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
9520: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
9530: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
9540: 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
9550: 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62  void*), /* Callb
9560: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
9570: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
9580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9590: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
95a0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
95b0: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
95c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
95d0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
95e0: 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c  pRet = db->pRoll
95f0: 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78  backArg;.  db->x
9600: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
9610: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
9620: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
9630: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
9640: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9650: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
9660: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
9670: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9680: 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  _WAL./*.** The s
9690: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
96a0: 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  ) callback regis
96b0: 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  tered by sqlite3
96c0: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
96d0: 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  int()..** Invoke
96e0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
96f0: 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e  ckpoint if the n
9700: 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
9710: 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a  in the log file.
9720: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
9730: 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41  an sqlite3.pWalA
9740: 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e  rg cast to an in
9750: 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65  teger (the value
9760: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a   configured by.*
9770: 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  * wal_autocheckp
9780: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74  oint())..*/ .int
9790: 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
97a0: 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a  ltHook(.  void *
97b0: 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20  pClientData,    
97c0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a   /* Argument */.
97d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
97e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
97f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
9800: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
9810: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a     /* Database *
9820: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20  /.  int nFrame  
9830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9840: 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a  ze of WAL */.){.
9850: 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51    if( nFrame>=SQ
9860: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
9870: 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a  pClientData) ){.
9880: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
9890: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
98a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
98b0: 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
98c0: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
98d0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
98e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
98f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
9900: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9910: 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
9920: 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71   Configure an sq
9930: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
9940: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
9950: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
9960: 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62  point.** a datab
9970: 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74  ase after commit
9980: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
9990: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
99a0: 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72  nFrame or.** mor
99b0: 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  e frames in the 
99c0: 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e  log file. Passin
99d0: 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61  g zero or a nega
99e0: 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68  tive value as th
99f0: 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61  e.** nFrame para
9a00: 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61  meter disables a
9a10: 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
9a20: 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  ints entirely..*
9a30: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
9a40: 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
9a50: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
9a60: 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74  places any exist
9a70: 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ing callback.** 
9a80: 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  registered using
9a90: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
9aa0: 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72  k(). Likewise, r
9ab0: 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c  egistering a cal
9ac0: 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73  lback.** using s
9ad0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
9ae0: 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  ) disables the a
9af0: 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
9b00: 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  int mechanism.**
9b10: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
9b20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
9b30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
9b40: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
9b50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
9b60: 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66   nFrame){.#ifdef
9b70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
9b80: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9b90: 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
9ba0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61  D_PARAMETER(nFra
9bb0: 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  me);.#else.  if(
9bc0: 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20   nFrame>0 ){.   
9bd0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
9be0: 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c  k(db, sqlite3Wal
9bf0: 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c  DefaultHook, SQL
9c00: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
9c10: 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  Frame));.  }else
9c20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
9c30: 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29  l_hook(db, 0, 0)
9c40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
9c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
9c70: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
9c80: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
9c90: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
9ca0: 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ion is written.*
9cb0: 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65  * into the write
9cc0: 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68  -ahead-log by th
9cd0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
9ce0: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
9cf0: 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f  *sqlite3_wal_hoo
9d00: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
9d10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9d20: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
9d30: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
9d40: 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
9d50: 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  nt(*xCallback)(v
9d60: 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  oid *, sqlite3*,
9d70: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
9d80: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
9db0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
9dc0: 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
9dd0: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
9de0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f  TE_OMIT_WAL.  vo
9df0: 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
9e00: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
9e10: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
9e20: 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67  et = db->pWalArg
9e30: 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c  ;.  db->xWalCall
9e40: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
9e50: 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20  ;.  db->pWalArg 
9e60: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
9e70: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
9e80: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
9e90: 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20  rn pRet;.#else. 
9ea0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
9eb0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  f.}../*.** Check
9ec0: 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
9ed0: 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  Db..*/.int sqlit
9ee0: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
9ef0: 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  t_v2(.  sqlite3 
9f00: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
9f10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
9f20: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
9f30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f50: 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63  /* Name of attac
9f60: 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72  hed database (or
9f70: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20   NULL) */.  int 
9f80: 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  eMode,          
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9fa0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
9fb0: 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  _* value */.  in
9fc0: 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20  t *pnLog,       
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9fe0: 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41   OUT: Size of WA
9ff0: 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20  L log in frames 
a000: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74  */.  int *pnCkpt
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74       /* OUT: Tot
a030: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  al number of fra
a040: 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  mes checkpointed
a050: 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51   */.){.#ifdef SQ
a060: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
a070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a080: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
a090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
a0b0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
a0c0: 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d  t iDb = SQLITE_M
a0d0: 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a  AX_ATTACHED;  /*
a0e0: 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69   sqlite3.aDb[] i
a0f0: 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68  ndex of db to ch
a100: 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f  eckpoint */..  /
a110: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
a120: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
a130: 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20  s to -1 in case 
a140: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
a150: 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20   */.  if( pnLog 
a160: 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20  ) *pnLog = -1;. 
a170: 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70   if( pnCkpt ) *p
a180: 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61  nCkpt = -1;..  a
a190: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
a1a0: 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51  ECKPOINT_FULL>SQ
a1b0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
a1c0: 50 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73  PASSIVE );.  ass
a1d0: 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
a1e0: 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49  KPOINT_FULL<SQLI
a1f0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
a200: 53 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72  START );.  asser
a210: 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
a220: 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d  OINT_PASSIVE+2==
a230: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
a240: 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69  T_RESTART );.  i
a250: 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f  f( eMode<SQLITE_
a260: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
a270: 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49  VE || eMode>SQLI
a280: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
a290: 53 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74  START ){.    ret
a2a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
a2b0: 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  E;.  }..  sqlite
a2c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
a2d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
a2e0: 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b  zDb && zDb[0] ){
a2f0: 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
a300: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
a310: 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28   zDb);.  }.  if(
a320: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63   iDb<0 ){.    rc
a330: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
a340: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a350: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52  r(db, SQLITE_ERR
a360: 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  OR, "unknown dat
a370: 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29  abase: %s", zDb)
a380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
a390: 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b  c = sqlite3Check
a3a0: 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65  point(db, iDb, e
a3b0: 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
a3c0: 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  kpt);.    sqlite
a3d0: 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
a3e0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
a3f0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
a400: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
a410: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
a420: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
a430: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
a440: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
a450: 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49   database zDb. I
a460: 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f  f zDb is NULL, o
a470: 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20  r if the buffer 
a480: 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zDb points.** to
a490: 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f   contains a zero
a4a0: 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20  -length string, 
a4b0: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
a4c0: 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63  abases are .** c
a4d0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a  heckpointed..*/.
a4e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
a4f0: 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  checkpoint(sqlit
a500: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
a510: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75  ar *zDb){.  retu
a520: 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  rn sqlite3_wal_c
a530: 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c  heckpoint_v2(db,
a540: 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45   zDb, SQLITE_CHE
a550: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
a560: 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64   0, 0);.}..#ifnd
a570: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
a580: 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63  AL./*.** Run a c
a590: 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74  heckpoint on dat
a5a0: 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20  abase iDb. This 
a5b0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61  is a no-op if da
a5c0: 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a  tabase iDb is.**
a5d0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f   not currently o
a5e0: 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  pen in WAL mode.
a5f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
a600: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
a610: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
a620: 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
a630: 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ed, this .** fun
a640: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
a650: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  LITE_LOCKED and 
a660: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  a checkpoint is 
a670: 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49  not attempted. I
a680: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  f .** an error o
a690: 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e  ccurs while runn
a6a0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ing the checkpoi
a6b0: 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  nt, an SQLite er
a6c0: 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
a6d0: 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53  returned (i.e. S
a6e0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74  QLITE_IOERR). Ot
a6f0: 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
a700: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  OK..**.** The mu
a710: 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
a720: 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64  handle db should
a730: 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20   be held by the 
a740: 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65  caller. The mute
a750: 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  x.** associated 
a760: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
a770: 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63  c b-tree being c
a780: 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74  heckpointed is t
a790: 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20  aken by.** this 
a7a0: 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74  function while t
a7b0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73  he checkpoint is
a7c0: 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   running..**.** 
a7d0: 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64  If iDb is passed
a7e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
a7f0: 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61  CHED, then all a
a800: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
a810: 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f  s are.** checkpo
a820: 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72  inted. If an err
a830: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
a840: 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  d it is returned
a850: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a   immediately -.*
a860: 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20  * no attempt is 
a870: 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69  made to checkpoi
a880: 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67  nt any remaining
a890: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
a8a0: 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  * Parameter eMod
a8b0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49  e is one of SQLI
a8c0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
a8d0: 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52  SSIVE, FULL or R
a8e0: 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73  ESTART..*/.int s
a8f0: 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
a900: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
a910: 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65  t iDb, int eMode
a920: 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e  , int *pnLog, in
a930: 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e  t *pnCkpt){.  in
a940: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a960: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
a970: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a990: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
a9a0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74  rate through att
a9b0: 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69  ached dbs */.  i
a9c0: 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20  nt bBusy = 0;   
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a9e0: 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45  * True if SQLITE
a9f0: 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65  _BUSY has been e
aa00: 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20  ncountered */.. 
aa10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
aa20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
aa30: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
aa40: 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70  rt( !pnLog || *p
aa50: 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73  nLog==-1 );.  as
aa60: 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c  sert( !pnCkpt ||
aa70: 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a   *pnCkpt==-1 );.
aa80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
aa90: 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c  ->nDb && rc==SQL
aaa0: 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
aab0: 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20    if( i==iDb || 
aac0: 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  iDb==SQLITE_MAX_
aad0: 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20  ATTACHED ){.    
aae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
aaf0: 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  reeCheckpoint(db
ab00: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d  ->aDb[i].pBt, eM
ab10: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
ab20: 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67  pt);.      pnLog
ab30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b   = 0;.      pnCk
ab40: 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  pt = 0;.      if
ab50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
ab60: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75  Y ){.        bBu
ab70: 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  sy = 1;.        
ab80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ab90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aba0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
abb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42  =SQLITE_OK && bB
abc0: 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55  usy) ? SQLITE_BU
abd0: 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  SY : rc;.}.#endi
abe0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
abf0: 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  _WAL */../*.** T
ac00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
ac10: 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69  urns true if mai
ac20: 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20  n-memory should 
ac30: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
ac40: 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  of.** a temporar
ac50: 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73  y file for trans
ac60: 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73  ient pager files
ac70: 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a   and statement j
ac80: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20  ournals..** The 
ac90: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64  value returned d
aca0: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
acb0: 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f  lue of db->temp_
acc0: 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a  store (runtime.*
acd0: 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64  * parameter) and
ace0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d   the compile tim
acf0: 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54  e value of SQLIT
ad00: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68  E_TEMP_STORE. Th
ad10: 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  e.** following t
ad20: 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
ad30: 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
ad40: 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77  between these tw
ad50: 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20  o values.** and 
ad60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72  this functions r
ad70: 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a  eturn value..**.
ad80: 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50  **   SQLITE_TEMP
ad90: 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74  _STORE     db->t
ada0: 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f  emp_store     Lo
adb0: 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72  cation of tempor
adc0: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
add0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ade0: 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
adf0: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20       any        
ae40: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
ae50: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
ae60: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
ae70: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
ae80: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
ae90: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
aea0: 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
aeb0: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
aed0: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
aee0: 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  1).**   1       
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af10: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
af20: 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
af50: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
af60: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af80: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
af90: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
afa0: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
afb0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
afc0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
afd0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
afe0: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
aff0: 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20  *   3           
b000: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
b020: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
b030: 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ).*/.int sqlite3
b040: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e  TempInMemory(con
b050: 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  st sqlite3 *db){
b060: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
b070: 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75  _STORE==1.  retu
b080: 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
b090: 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ore==2 );.#endif
b0a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
b0b0: 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75  _STORE==2.  retu
b0c0: 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74  rn ( db->temp_st
b0d0: 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66  ore!=1 );.#endif
b0e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  .#if SQLITE_TEMP
b0f0: 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75  _STORE==3.  retu
b100: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66  rn 1;.#endif.#if
b110: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
b120: 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54  RE<1 || SQLITE_T
b130: 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65  EMP_STORE>3.  re
b140: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
b150: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  ../*.** Return U
b160: 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67  TF-8 encoded Eng
b170: 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
b180: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
b190: 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
b1a0: 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
b1b0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
b1c0: 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62  rmsg(sqlite3 *db
b1d0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
b1e0: 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
b1f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
b200: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
b210: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69  _NOMEM);.  }.  i
b220: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
b230: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
b240: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
b250: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
b260: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
b270: 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  T);.  }.  sqlite
b280: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
b290: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
b2a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b2b0: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69   ){.    z = sqli
b2c0: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
b2d0: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65  _NOMEM);.  }else
b2e0: 7b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a  {.    z = (char*
b2f0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
b300: 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ext(db->pErr);. 
b310: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
b320: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
b330: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
b340: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
b350: 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
b360: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
b370: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b380: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
b390: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
b3a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b3b0: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
b3c0: 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65   Return UTF-16 e
b3d0: 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
b3e0: 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
b3f0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
b400: 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
b410: 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
b420: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
b430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
b440: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
b450: 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b  6 outOfMem[] = {
b460: 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27  .    'o', 'u', '
b470: 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66  t', ' ', 'o', 'f
b480: 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27  ', ' ', 'm', 'e'
b490: 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c  , 'm', 'o', 'r',
b4a0: 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73   'y', 0.  };.  s
b4b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
b4c0: 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20  misuse[] = {.   
b4d0: 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20   'l', 'i', 'b', 
b4e0: 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27  'r', 'a', 'r', '
b4f0: 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72  y', ' ', .    'r
b500: 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27  ', 'o', 'u', 't'
b510: 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c  , 'i', 'n', 'e',
b520: 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20   ' ', .    'c', 
b530: 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27  'a', 'l', 'l', '
b540: 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20  e', 'd', ' ', . 
b550: 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
b560: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
b570: 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'f', ' ', .    
b580: 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27  's', 'e', 'q', '
b590: 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63  u', 'e', 'n', 'c
b5a0: 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a  ', 'e', 0.  };..
b5b0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b    const void *z;
b5c0: 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
b5d0: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
b5e0: 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20  )outOfMem;.  }. 
b5f0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
b600: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
b610: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
b620: 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73  rn (void *)misus
b630: 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
b640: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
b650: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
b660: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b670: 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64  ){.    z = (void
b680: 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d   *)outOfMem;.  }
b690: 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71  else{.    z = sq
b6a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
b6b0: 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
b6c0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
b6d0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
b6e0: 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
b6f0: 20 2d 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53   -1, sqlite3ErrS
b700: 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c  tr(db->errCode),
b710: 0a 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  .           SQLI
b720: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
b730: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a  STATIC);.      z
b740: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
b750: 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
b760: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
b770: 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68  A malloc() may h
b780: 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69  ave failed withi
b790: 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  n the call to sq
b7a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
b7b0: 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  16().    ** abov
b7c0: 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
b7d0: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
b7e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b7f0: 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a  d flag needs to.
b800: 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65      ** be cleare
b810: 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
b820: 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65  ng. Do this dire
b830: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
b840: 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69   via.    ** sqli
b850: 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f  te3ApiExit(), to
b860: 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74   avoid setting t
b870: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
b880: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
b890: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d  ..    */.    db-
b8a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
b8b0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
b8c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
b8d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
b8e0: 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
b8f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
b900: 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  16 */../*.** Ret
b910: 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
b920: 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67  ent error code g
b930: 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53  enerated by an S
b940: 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49  QLite routine. I
b950: 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73  f NULL is.** pas
b960: 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
b970: 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20  tion, we assume 
b980: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  a malloc() faile
b990: 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  d during sqlite3
b9a0: 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _open()..*/.int 
b9b0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
b9c0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
b9d0: 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
b9e0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
b9f0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
ba00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
ba10: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
ba20: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
ba30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
ba40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ba50: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
ba60: 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
ba70: 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  de & db->errMask
ba80: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
ba90: 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
baa0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
bab0: 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
bac0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
bad0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
bae0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
baf0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
bb00: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
bb10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bb20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
bb30: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
bb40: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
bb50: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ode;.}../*.** Cr
bb60: 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61  eate a new colla
bb70: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
bb80: 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e  r database "db".
bb90: 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e    The name is zN
bba0: 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65  ame.** and the e
bbb0: 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a  ncoding is enc..
bbc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72  */.static int cr
bbd0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eateCollation(. 
bbe0: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20   sqlite3* db,.  
bbf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
bc00: 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20  e, .  u8 enc,.  
bc10: 75 38 20 63 6f 6c 6c 54 79 70 65 2c 0a 20 20 76  u8 collType,.  v
bc20: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
bc30: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
bc40: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
bc50: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
bc60: 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
bc70: 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
bc80: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
bc90: 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20  int enc2;.  int 
bca0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
bcb0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
bcc0: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
bcd0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
bce0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
bcf0: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
bd00: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
bd10: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
bd20: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
bd30: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
bd40: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
bd50: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
bd60: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
bd70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
bd80: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
bd90: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
bda0: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
bdb0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
bdc0: 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
bdd0: 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
bde0: 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
bdf0: 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
be00: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
be10: 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
be20: 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
be30: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
be40: 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
be50: 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
be60: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
be70: 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
be80: 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
be90: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
bea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
beb0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
bec0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
bed0: 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
bee0: 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
bef0: 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
bf00: 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
bf10: 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
bf20: 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
bf30: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
bf40: 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
bf50: 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
bf60: 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
bf70: 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
bf80: 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
bf90: 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
bfa0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
bfb0: 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
bfc0: 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
bfd0: 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
bfe0: 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
bff0: 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  if( db->activeVd
c000: 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  beCnt ){.      s
c010: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
c020: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
c030: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
c040: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63   delete/modify c
c050: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
c060: 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20  e due to active 
c070: 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20  statements");.  
c080: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c090: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
c0a0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
c0b0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
c0c0: 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  s(db);..    /* I
c0d0: 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  f collation sequ
c0e0: 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63  ence pColl was c
c0f0: 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20  reated directly 
c100: 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20  by a call to.   
c110: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61   ** sqlite3_crea
c120: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e  te_collation, an
c130: 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20  d not generated 
c140: 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
c150: 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ),.    ** then a
c160: 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62  ny copies made b
c170: 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
c180: 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61   need to be inva
c190: 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20  lidated..    ** 
c1a0: 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20  Also, collation 
c1b0: 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c  destructor - Col
c1c0: 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75  lSeq.xDel() - fu
c1d0: 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a  nction may need.
c1e0: 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c      ** to be cal
c1f0: 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  led..    */ .   
c200: 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63   if( (pColl->enc
c210: 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36   & ~SQLITE_UTF16
c220: 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20  _ALIGNED)==enc2 
c230: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
c240: 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *aColl = sqlite
c250: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
c260: 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20  CollSeq, zName, 
c270: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  nName);.      in
c280: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
c290: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
c2a0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
c2b0: 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
c2c0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
c2d0: 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
c2e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
c2f0: 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
c300: 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
c310: 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
c320: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
c330: 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
c340: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c350: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
c360: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
c370: 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
c380: 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
c390: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
c3a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c3b0: 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
c3c0: 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
c3d0: 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
c3e0: 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
c3f0: 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
c400: 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
c410: 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
c420: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
c430: 45 44 29 29 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 74  ED));.  pColl->t
c440: 79 70 65 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a  ype = collType;.
c450: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
c460: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  b, SQLITE_OK, 0)
c470: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
c480: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
c490: 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
c4a0: 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
c4b0: 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
c4c0: 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
c4d0: 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
c4e0: 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
c4f0: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
c500: 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
c510: 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
c520: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
c530: 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
c540: 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
c550: 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
c560: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
c570: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
c580: 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
c590: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
c5a0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
c5b0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
c5c0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
c5d0: 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
c5e0: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
c5f0: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
c600: 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
c610: 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
c620: 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
c630: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
c640: 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54 45  NUMBER,.  SQLITE
c650: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
c660: 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  TH,.};../*.** Ma
c670: 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64  ke sure the hard
c680: 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20   limits are set 
c690: 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61  to reasonable va
c6a0: 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lues.*/.#if SQLI
c6b0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30  TE_MAX_LENGTH<10
c6c0: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
c6d0: 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _MAX_LENGTH must
c6e0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
c6f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
c700: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
c710: 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
c720: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
c730: 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
c740: 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
c750: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
c760: 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45  QL_LENGTH>SQLITE
c770: 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72  _MAX_LENGTH.# er
c780: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
c790: 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e  QL_LENGTH must n
c7a0: 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ot be greater th
c7b0: 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  an SQLITE_MAX_LE
c7c0: 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20  NGTH.#endif.#if 
c7d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
c7e0: 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65  UND_SELECT<2.# e
c7f0: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
c800: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
c810: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
c820: 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   2.#endif.#if SQ
c830: 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
c840: 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  <40.# error SQLI
c850: 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d  TE_MAX_VDBE_OP m
c860: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
c870: 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  40.#endif.#if SQ
c880: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
c890: 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54  N_ARG<0 || SQLIT
c8a0: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
c8b0: 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20  RG>1000.# error 
c8c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
c8d0: 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20  ION_ARG must be 
c8e0: 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30  between 0 and 10
c8f0: 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
c900: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
c910: 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  D<0 || SQLITE_MA
c920: 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 23 20  X_ATTACHED>30.# 
c930: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
c940: 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62  _ATTACHED must b
c950: 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
c960: 33 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  30.#endif.#if SQ
c970: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
c980: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
c990: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
c9a0: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
c9b0: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
c9c0: 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
c9d0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
c9e0: 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72  OLUMN>32767.# er
c9f0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
ca00: 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65  OLUMN must not e
ca10: 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64  xceed 32767.#end
ca20: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
ca30: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c  X_TRIGGER_DEPTH<
ca40: 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
ca50: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
ca60: 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
ca70: 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ast 1.#endif.../
ca80: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
ca90: 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74  value of a limit
caa0: 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c  .  Report the ol
cab0: 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61  d value..** If a
cac0: 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20  n invalid limit 
cad0: 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65  index is supplie
cae0: 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a  d, report -1..**
caf0: 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
cb00: 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72   but still repor
cb10: 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  t the old value 
cb20: 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69  if the.** new li
cb30: 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
cb40: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77  .**.** A new low
cb50: 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f  er limit does no
cb60: 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e  t shrink existin
cb70: 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a  g constructs..**
cb80: 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65   It merely preve
cb90: 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63  nts new construc
cba0: 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74  ts that exceed t
cbb0: 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d  he limit.** from
cbc0: 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   forming..*/.int
cbd0: 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73   sqlite3_limit(s
cbe0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
cbf0: 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77  limitId, int new
cc00: 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c  Limit){.  int ol
cc10: 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45  dLimit;...  /* E
cc20: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30  VIDENCE-OF: R-30
cc30: 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61  189-54097 For ea
cc40: 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72  ch limit categor
cc50: 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e  y SQLITE_LIMIT_N
cc60: 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  AME.  ** there i
cc70: 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62  s a hard upper b
cc80: 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70  ound set at comp
cc90: 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20  ile-time by a C 
cca0: 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a  preprocessor.  *
ccb0: 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53  * macro called S
ccc0: 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20  QLITE_MAX_NAME. 
ccd0: 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69  (The "_LIMIT_" i
cce0: 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68  n the name is ch
ccf0: 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f  anged to.  ** "_
cd00: 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61  MAX_".).  */.  a
cd10: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
cd20: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
cd30: 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
cd40: 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  AX_LENGTH );.  a
cd50: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
cd60: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53  t[SQLITE_LIMIT_S
cd70: 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49  QL_LENGTH]==SQLI
cd80: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
cd90: 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
cda0: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
cdb0: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d  _LIMIT_COLUMN]==
cdc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
cdd0: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  N );.  assert( a
cde0: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
cdf0: 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
ce00: 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45  H]==SQLITE_MAX_E
ce10: 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  XPR_DEPTH );.  a
ce20: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
ce30: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
ce40: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d  OMPOUND_SELECT]=
ce50: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50  =SQLITE_MAX_COMP
ce60: 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20  OUND_SELECT);.  
ce70: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
ce80: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
ce90: 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45  VDBE_OP]==SQLITE
cea0: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a  _MAX_VDBE_OP );.
ceb0: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
cec0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
ced0: 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d  T_FUNCTION_ARG]=
cee0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  =SQLITE_MAX_FUNC
cef0: 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73  TION_ARG );.  as
cf00: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
cf10: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54  [SQLITE_LIMIT_AT
cf20: 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f  TACHED]==SQLITE_
cf30: 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a  MAX_ATTACHED );.
cf40: 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
cf50: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
cf60: 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
cf70: 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20  ENGTH]==.       
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d          SQLITE_M
cfb0: 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
cfc0: 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
cfd0: 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
cfe0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
cff0: 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51  ABLE_NUMBER]==SQ
d000: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
d010: 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73  E_NUMBER);.  ass
d020: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
d030: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
d040: 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  GGER_DEPTH]==SQL
d050: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
d060: 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
d070: 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  t( SQLITE_LIMIT_
d080: 54 52 49 47 47 45 52 5f 44 45 50 54 48 3d 3d 28  TRIGGER_DEPTH==(
d090: 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31  SQLITE_N_LIMIT-1
d0a0: 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d  ) );...  if( lim
d0b0: 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49  itId<0 || limitI
d0c0: 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  d>=SQLITE_N_LIMI
d0d0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
d0e0: 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d  -1;.  }.  oldLim
d0f0: 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  it = db->aLimit[
d100: 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20  limitId];.  if( 
d110: 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20  newLimit>=0 ){  
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36   /* IMP: R-52476
d140: 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66  -28732 */.    if
d150: 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64  ( newLimit>aHard
d160: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29  Limit[limitId] )
d170: 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74  {.      newLimit
d180: 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69   = aHardLimit[li
d190: 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a  mitId];  /* IMP:
d1a0: 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a   R-51463-25634 *
d1b0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  /.    }.    db->
d1c0: 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
d1d0: 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
d1e0: 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
d1f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
d200: 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
d210: 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a  -53341-35419 */.
d220: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
d230: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
d240: 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
d250: 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
d260: 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
d270: 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
d280: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
d290: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d2a0: 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
d2b0: 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
d2c0: 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
d2d0: 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
d2e0: 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
d2f0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
d300: 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
d310: 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
d320: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
d330: 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
d340: 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
d350: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
d360: 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67 73    unsigned flags
d370: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72  ,        /* Oper
d380: 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
d390: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d3a0: 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
d3b0: 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
d3c0: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
d3d0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
d3e0: 63 3b 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  c;.  int isThrea
d3f0: 64 73 61 66 65 3b 0a 0a 20 20 2a 70 70 44 62 20  dsafe;..  *ppDb 
d400: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
d410: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
d420: 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
d430: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
d440: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d450: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f   rc;.#endif..  /
d460: 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e  * Only allow sen
d470: 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
d480: 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ns of bits in th
d490: 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
d4a0: 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61  .  .  ** Throw a
d4b0: 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e  n error if any n
d4c0: 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61  on-sense combina
d4d0: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49  tion is used.  I
d4e0: 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74  f we.  ** do not
d4f0: 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63   block illegal c
d500: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65  ombinations here
d510: 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67  , it could trigg
d520: 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  er.  ** assert()
d530: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64   statements in d
d540: 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53  eeper layers.  S
d550: 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
d560: 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20  ions.  ** are:. 
d570: 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51   **.  **  1:  SQ
d580: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
d590: 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c  LY.  **  2:  SQL
d5a0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
d5b0: 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c  TE.  **  6:  SQL
d5c0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
d5d0: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
d5e0: 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61  _CREATE.  */.  a
d5f0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
d600: 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20  EN_READONLY  == 
d610: 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0x01 );.  assert
d620: 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
d630: 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20  ADWRITE == 0x02 
d640: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
d650: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
d660: 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20     == 0x04 );.  
d670: 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
d680: 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29  lags&7))==0x02 )
d690: 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f  ; /* READONLY */
d6a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
d6b0: 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
d6c0: 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  4 ); /* READWRIT
d6d0: 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  E */.  testcase(
d6e0: 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
d6f0: 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44  =0x40 ); /* READ
d700: 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a  WRITE | CREATE *
d710: 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c  /.  if( ((1<<(fl
d720: 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d  ags&7)) & 0x46)=
d730: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
d740: 54 45 5f 4d 49 53 55 53 45 3b 0a 0a 20 20 69 66  TE_MISUSE;..  if
d750: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
d760: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
d770: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
d780: 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
d790: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
d7a0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
d7b0: 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
d7c0: 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
d7d0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
d7e0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
d7f0: 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
d800: 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
d810: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
d820: 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
d830: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
d840: 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
d850: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
d860: 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
d870: 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66  TECACHE ){.    f
d880: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
d890: 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
d8a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
d8b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
d8c0: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
d8d0: 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67  bled ){.    flag
d8e0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
d8f0: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
d900: 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68  }..  /* Remove h
d910: 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d  armful bits from
d920: 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
d930: 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  eter.  **.  ** T
d940: 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  he SQLITE_OPEN_N
d950: 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54  OMUTEX and SQLIT
d960: 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
d970: 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a   flags were.  **
d980: 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74   dealt with in t
d990: 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
d9a0: 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73   block.  Besides
d9b0: 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79   these, the only
d9c0: 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75  .  ** valid inpu
d9d0: 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  t flags for sqli
d9e0: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72  te3_open_v2() ar
d9f0: 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  e SQLITE_OPEN_RE
da00: 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c  ADONLY,.  ** SQL
da10: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
da20: 54 45 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  TE, and SQLITE_O
da30: 50 45 4e 5f 43 52 45 41 54 45 2e 20 20 53 69 6c  PEN_CREATE.  Sil
da40: 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
da50: 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
da60: 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
da70: 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
da80: 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
da90: 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
daa0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
dab0: 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
dac0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
dad0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
dae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
daf0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
db00: 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
db10: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
db20: 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
db30: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
db40: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
db50: 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
db60: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
db70: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
db80: 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
db90: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
dba0: 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
dbb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dbc0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
dbd0: 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
dbf0: 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
dc00: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
dc10: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
dc20: 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
dc30: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
dc40: 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
dc50: 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
dc60: 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
dc70: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
dc80: 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
dc90: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
dca0: 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
dcb0: 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
dcc0: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
dcd0: 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
dce0: 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
dcf0: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
dd00: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
dd10: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
dd20: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
dd30: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
dd40: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
dd50: 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
dd60: 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
dd70: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
dd80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
dd90: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
dda0: 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
ddb0: 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44  = 0xff;.  db->nD
ddc0: 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67  b = 2;.  db->mag
ddd0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
dde0: 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44  C_BUSY;.  db->aD
ddf0: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
de00: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  c;..  assert( si
de10: 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
de20: 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69  ==sizeof(aHardLi
de30: 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  mit) );.  memcpy
de40: 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61  (db->aLimit, aHa
de50: 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28  rdLimit, sizeof(
de60: 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20  db->aLimit));.  
de70: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
de80: 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
de90: 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
dea0: 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
deb0: 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   0;.  db->flags 
dec0: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
ded0: 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
dee0: 5f 41 75 74 6f 49 6e 64 65 78 0a 23 69 66 20 53  _AutoIndex.#if S
def0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
df00: 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20  LE_FORMAT<4.    
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
df20: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
df30: 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  Fmt.#endif.#ifde
df40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
df50: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  | SQLITE_LoadExt
df80: 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69  ension.#endif.#i
df90: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
dfa0: 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47  _RECURSIVE_TRIGG
dfb0: 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERS.            
dfc0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65       | SQLITE_Re
dfd0: 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66  cTriggers.#endif
dfe0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
dff0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
e000: 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c  IGN_KEYS) && SQL
e010: 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
e020: 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20  IGN_KEYS.       
e030: 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
e040: 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23  TE_ForeignKeys.#
e050: 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
e060: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
e070: 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
e080: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e090: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
e0a0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
e0b0: 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
e0c0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e  ;.#endif..  db->
e0d0: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
e0e0: 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20  fs_find(zVfs);. 
e0f0: 20 69 66 28 20 21 64 62 2d 3e 70 56 66 73 20 29   if( !db->pVfs )
e100: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
e110: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
e120: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
e130: 2c 20 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20  , "no such vfs: 
e140: 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  %s", zVfs);.    
e150: 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
e160: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74  .  }..  /* Add t
e170: 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
e180: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
e190: 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
e1a0: 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
e1b0: 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
e1c0: 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
e1d0: 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
e1e0: 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
e1f0: 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
e200: 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
e210: 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
e220: 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
e230: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
e240: 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  ..  */.  createC
e250: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
e260: 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
e270: 46 38 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  F8, SQLITE_COLL_
e280: 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20  BINARY, 0,.     
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e               bin
e2a0: 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
e2b0: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
e2c0: 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
e2d0: 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51  LITE_UTF16BE, SQ
e2e0: 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
e2f0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
e300: 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75         binCollFu
e310: 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
e320: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
e330: 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
e340: 54 46 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 43  TF16LE, SQLITE_C
e350: 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20  OLL_BINARY, 0,. 
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
e380: 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
e390: 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c  ion(db, "RTRIM",
e3a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
e3b0: 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20  LITE_COLL_USER, 
e3c0: 28 76 6f 69 64 2a 29 31 2c 0a 20 20 20 20 20 20  (void*)1,.      
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43              binC
e3e0: 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69  ollFunc, 0);.  i
e3f0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
e400: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
e410: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
e420: 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
e430: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
e440: 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
e450: 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20  UTF8, "BINARY", 
e460: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
e470: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29  ->pDfltColl!=0 )
e480: 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64  ;..  /* Also add
e490: 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e   a UTF-8 case-in
e4a0: 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74  sensitive collat
e4b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f  ion sequence. */
e4c0: 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
e4d0: 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c  on(db, "NOCASE",
e4e0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
e4f0: 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45  LITE_COLL_NOCASE
e500: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
e510: 20 20 20 20 20 20 20 6e 6f 63 61 73 65 43 6f 6c         nocaseCol
e520: 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
e530: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62  .  /* Open the b
e540: 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20  ackend database 
e550: 64 72 69 76 65 72 20 2a 2f 0a 20 20 64 62 2d 3e  driver */.  db->
e560: 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67  openFlags = flag
e570: 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  s;.  rc = sqlite
e580: 33 42 74 72 65 65 4f 70 65 6e 28 7a 46 69 6c 65  3BtreeOpen(zFile
e590: 6e 61 6d 65 2c 20 64 62 2c 20 26 64 62 2d 3e 61  name, db, &db->a
e5a0: 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5c0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
e5d0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
e5e0: 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
e5f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
e600: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
e610: 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
e620: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e630: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
e640: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
e650: 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74   rc, 0);.    got
e660: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
e670: 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  }.  db->aDb[0].p
e680: 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
e690: 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62  SchemaGet(db, db
e6a0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
e6b0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
e6c0: 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
e6d0: 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a  emaGet(db, 0);..
e6e0: 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
e6f0: 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  t safety_level f
e700: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
e710: 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20  base is 'full'; 
e720: 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a  for the temp.  *
e730: 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73  * database it is
e740: 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61   'NONE'. This ma
e750: 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20  tches the pager 
e760: 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20  layer defaults. 
e770: 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62   .  */.  db->aDb
e780: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69  [0].zName = "mai
e790: 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  n";.  db->aDb[0]
e7a0: 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
e7b0: 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  3;.  db->aDb[1].
e7c0: 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a  zName = "temp";.
e7d0: 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66    db->aDb[1].saf
e7e0: 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a  ety_level = 1;..
e7f0: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
e800: 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
e810: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
e820: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
e830: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
e840: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
e850: 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20  er all built-in 
e860: 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64  functions, but d
e870: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
e880: 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64   read the.  ** d
e890: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79  atabase schema y
e8a0: 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61  et. This is dela
e8b0: 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  yed until the fi
e8c0: 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74  rst time the dat
e8d0: 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63  abase.  ** is ac
e8e0: 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  cessed..  */.  s
e8f0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
e900: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
e910: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
e920: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
e930: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  (db);..  /* Load
e940: 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e   automatic exten
e950: 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f  sions - extensio
e960: 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ns that have bee
e970: 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a  n registered.  *
e980: 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
e990: 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78  te3_automatic_ex
e9a0: 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20  tension() API.. 
e9b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 41 75 74   */.  sqlite3Aut
e9c0: 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28  oLoadExtensions(
e9d0: 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  db);.  rc = sqli
e9e0: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
e9f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
ea00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
ea10: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
ea20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ea30: 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66  ENABLE_FTS1.  if
ea40: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
ea50: 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72  led ){.    exter
ea60: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
ea70: 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  1Init(sqlite3*);
ea80: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ea90: 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts1Init(db);. 
eaa0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
eab0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
eac0: 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS2.  if( !db->
ead0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
eae0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
eaf0: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
eb00: 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
eb10: 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
eb20: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49  c = sqlite3Fts2I
eb30: 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
eb40: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
eb50: 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20  TE_ENABLE_FTS3. 
eb60: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
eb70: 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
eb80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
eb90: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
eba0: 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
ebb0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
ebc0: 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20  TE_ENABLE_ICU.  
ebd0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
ebe0: 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
ebf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
ec00: 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69   = sqlite3IcuIni
ec10: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
ec20: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
ec30: 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20  _ENABLE_RTREE.  
ec40: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
ec50: 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
ec60: 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
ec70: 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  = sqlite3RtreeIn
ec80: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
ec90: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72  if..  sqlite3Err
eca0: 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a  or(db, rc, 0);..
ecb0: 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
ecc0: 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
ecd0: 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
ece0: 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
ecf0: 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
ed00: 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
ed10: 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
ed20: 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
ed30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
ed40: 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
ed50: 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
ed60: 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
ed70: 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
ed80: 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
ed90: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
eda0: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
edb0: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
edc0: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
edd0: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
ede0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
edf0: 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
ee00: 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
ee10: 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
ee40: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
ee50: 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  E);.#endif..  /*
ee60: 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b   Enable the look
ee70: 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62  aside-malloc sub
ee80: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75  system */.  setu
ee90: 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30  pLookaside(db, 0
eea0: 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  , sqlite3GlobalC
eeb0: 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
eec0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
eed0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
eee0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
eef0: 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73  Lookaside);..  s
ef00: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
ef10: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51  heckpoint(db, SQ
ef20: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
ef30: 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29  _AUTOCHECKPOINT)
ef40: 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20  ;..opendb_out:. 
ef50: 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61   if( db ){.    a
ef60: 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78  ssert( db->mutex
ef70: 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73  !=0 || isThreads
ef80: 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  afe==0 || sqlite
ef90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
efa0: 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20  ullMutex==0 );. 
efb0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
efc0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
efd0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
efe0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
eff0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
f000: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
f010: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
f020: 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a  b);.    db = 0;.
f030: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
f040: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f050: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
f060: 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a  ITE_MAGIC_SICK;.
f070: 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62    }.  *ppDb = db
f080: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
f090: 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29  e3ApiExit(0, rc)
f0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
f0b0: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68  a new database h
f0c0: 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
f0d0: 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f  lite3_open(.  co
f0e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
f0f0: 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
f100: 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74  **ppDb .){.  ret
f110: 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
f120: 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  (zFilename, ppDb
f130: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f140: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
f150: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
f160: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
f170: 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71  TE, 0);.}.int sq
f180: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20  lite3_open_v2(. 
f190: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
f1a0: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61  ename,   /* Data
f1b0: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55  base filename (U
f1c0: 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
f1d0: 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
f1e0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74     /* OUT: SQLit
f1f0: 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  e db handle */. 
f200: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
f210: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
f220: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
f230: 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f  r *zVfs        /
f240: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f  * Name of VFS mo
f250: 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29  dule to use */.)
f260: 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
f270: 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65  atabase(filename
f280: 2c 20 70 70 44 62 2c 20 66 6c 61 67 73 2c 20 7a  , ppDb, flags, z
f290: 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Vfs);.}..#ifndef
f2a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
f2b0: 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  16./*.** Open a 
f2c0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
f2d0: 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
f2e0: 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f  te3_open16(.  co
f2f0: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
f300: 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
f310: 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72  **ppDb.){.  char
f320: 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d   const *zFilenam
f330: 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61  e8;   /* zFilena
f340: 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  me encoded in UT
f350: 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55  F-8 instead of U
f360: 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-16 */.  sqlit
f370: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
f380: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
f390: 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29  ert( zFilename )
f3a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44 62  ;.  assert( ppDb
f3b0: 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b   );.  *ppDb = 0;
f3c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f3d0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
f3e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
f3f0: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
f400: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
f410: 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d  .#endif.  pVal =
f420: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
f430: 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
f440: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
f450: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53  -1, zFilename, S
f460: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
f470: 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
f480: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20  );.  zFilename8 
f490: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
f4a0: 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
f4b0: 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69  UTF8);.  if( zFi
f4c0: 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72  lename8 ){.    r
f4d0: 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65  c = openDatabase
f4e0: 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44  (zFilename8, ppD
f4f0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
f500: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
f510: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
f520: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
f530: 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  ATE, 0);.    ass
f540: 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63  ert( *ppDb || rc
f550: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
f560: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f570: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61  LITE_OK && !DbHa
f580: 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c  sProperty(*ppDb,
f590: 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
f5a0: 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45 4e  ded) ){.      EN
f5b0: 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54  C(*ppDb) = SQLIT
f5c0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
f5d0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
f5e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
f5f0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  MEM;.  }.  sqlit
f600: 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
f610: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  );..  return sql
f620: 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
f630: 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  c);.}.#endif /* 
f640: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
f650: 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
f660: 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
f670: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
f680: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
f690: 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
f6a0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
f6b0: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  _collation(.  sq
f6c0: 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
f6d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
f6e0: 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
f6f0: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
f700: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
f710: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
f720: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
f730: 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
f740: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f750: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
f770: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f780: 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
f790: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
f7a0: 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 53 51 4c  me, (u8)enc, SQL
f7b0: 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70  ITE_COLL_USER, p
f7c0: 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
f7d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
f7e0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
f7f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f800: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f810: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
f820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
f830: 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
f840: 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
f850: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
f860: 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
f870: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
f880: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73  ollation_v2(.  s
f890: 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
f8a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
f8b0: 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
f8c0: 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
f8d0: 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
f8e0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
f8f0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
f900: 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
f910: 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
f920: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
f930: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f940: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
f950: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
f960: 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
f970: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
f980: 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
f990: 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  nc, SQLITE_COLL_
f9a0: 55 53 45 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d  USER, pCtx, xCom
f9b0: 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72  pare, xDel);.  r
f9c0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
f9d0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
f9e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f9f0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
fa00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
fa10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fa20: 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
fa30: 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
fa40: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
fa50: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
fa60: 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
fa70: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
fa80: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a  te_collation16(.
fa90: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
faa0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
fab0: 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20  ame,.  int enc, 
fac0: 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
fad0: 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
fae0: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
faf0: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
fb00: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
fb10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fb20: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a    char *zName8;.
fb30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fb40: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
fb50: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
fb60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
fb70: 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69  .  zName8 = sqli
fb80: 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
fb90: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
fba0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
fbb0: 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a    if( zName8 ){.
fbc0: 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43      rc = createC
fbd0: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
fbe0: 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 53 51  me8, (u8)enc, SQ
fbf0: 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20  LITE_COLL_USER, 
fc00: 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
fc10: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
fc20: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38  bFree(db, zName8
fc30: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
fc40: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
fc50: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
fc60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
fc70: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
fc80: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
fc90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
fca0: 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
fcb0: 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
fcc0: 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
fcd0: 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
fce0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
fcf0: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
fd00: 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
fd10: 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
fd20: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
fd30: 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
fd40: 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
fd50: 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69  n_needed(.  sqli
fd60: 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
fd70: 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
fd80: 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
fd90: 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71  Needed)(void*,sq
fda0: 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
fdb0: 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  Rep,const char*)
fdc0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
fdd0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
fde0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
fdf0: 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e  lNeeded = xCollN
fe00: 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f  eeded;.  db->xCo
fe10: 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a  llNeeded16 = 0;.
fe20: 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
fe30: 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
fe40: 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
fe50: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
fe60: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
fe70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fe80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fe90: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
fea0: 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
feb0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
fec0: 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
fed0: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
fee0: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
fef0: 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
ff00: 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
ff10: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
ff20: 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
ff30: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
ff40: 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20  tion_needed16(. 
ff50: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
ff60: 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
ff70: 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
ff80: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76  xCollNeeded16)(v
ff90: 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
ffa0: 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
ffb0: 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c   void*).){.  sql
ffc0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ffd0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
ffe0: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
fff0: 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e   0;.  db->xCollN
10000 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e  eeded16 = xCollN
10010 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70  eeded16;.  db->p
10020 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
10030 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
10040 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10050 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
10060 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10070 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
10080 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
10090 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  F16 */..#ifndef 
100a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
100b0 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
100c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
100d0 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d  w an anachronism
100e0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20  . It used to be 
100f0 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20  used to recover 
10100 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63  from a.** malloc
10110 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20  () failure, but 
10120 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20  SQLite now does 
10130 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  this automatical
10140 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
10150 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  e3_global_recove
10160 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  r(void){.  retur
10170 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
10180 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  endif../*.** Tes
10190 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
101a0 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61   or not the data
101b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
101c0 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
101d0 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72  .** mode.  Retur
101e0 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
101f0 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  and FALSE if not
10200 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  .  Autocommit mo
10210 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64  de is on.** by d
10220 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d  efault.  Autocom
10230 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20  mit is disabled 
10240 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  by a BEGIN state
10250 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c  ment and reenabl
10260 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78  ed.** by the nex
10270 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  t COMMIT or ROLL
10280 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  BACK..**.*******
10290 20 54 48 49 53 20 49 53 20 41 4e 20 45 58 50 45   THIS IS AN EXPE
102a0 52 49 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e 44  RIMENTAL API AND
102b0 20 49 53 20 53 55 42 4a 45 43 54 20 54 4f 20 43   IS SUBJECT TO C
102c0 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a  HANGE ******.*/.
102d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
102e0 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
102f0 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
10300 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  n db->autoCommit
10310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
10320 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
10330 73 20 61 72 65 20 73 75 62 74 69 74 75 74 65 73  s are subtitutes
10340 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53   for constants S
10350 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a  QLITE_CORRUPT,.*
10360 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  * SQLITE_MISUSE,
10370 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
10380 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 61  , SQLITE_IOERR a
10390 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65  nd possibly othe
103a0 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74  r error.** const
103b0 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76  ants.  They serv
103c0 65 72 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a  er two purposes:
103d0 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72  .**.**   1.  Ser
103e0 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65  ve as a convenie
103f0 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20  nt place to set 
10400 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20  a breakpoint in 
10410 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20  a debugger.**   
10420 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68      to detect wh
10430 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72  en version error
10440 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75   conditions occu
10450 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20  rs..**.**   2.  
10460 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c  Invoke sqlite3_l
10470 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20  og() to provide 
10480 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20  the source code 
10490 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a  location where.*
104a0 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65  *       a low-le
104b0 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72  vel error is fir
104c0 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a  st detected..*/.
104d0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
104e0 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  ptError(int line
104f0 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
10500 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
10510 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
10520 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
10530 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20  LITE_CORRUPT,.  
10540 20 20 20 20 20 20 20 20 20 20 20 20 22 64 61 74              "dat
10550 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10560 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
10570 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
10580 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
10590 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
105a0 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
105b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
105c0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73  }.int sqlite3Mis
105d0 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  useError(int lin
105e0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
105f0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
10600 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
10610 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
10620 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20  QLITE_MISUSE, . 
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 69               "mi
10640 73 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20  suse at line %d 
10650 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
10660 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
10670 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
10680 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
10690 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
106a0 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  E;.}.int sqlite3
106b0 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e  CantopenError(in
106c0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
106d0 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
106e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
106f0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
10700 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  log(SQLITE_CANTO
10710 50 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  PEN, .          
10720 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e      "cannot open
10730 20 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64   file at line %d
10740 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
10750 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
10760 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
10770 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
10780 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
10790 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  OPEN;.}...#ifnde
107a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
107b0 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
107c0 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  his is a conveni
107d0 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61  ence routine tha
107e0 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  t makes sure tha
107f0 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65  t all thread-spe
10800 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f  cific.** data fo
10810 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61  r this thread ha
10820 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s been deallocat
10830 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ed..**.** SQLite
10840 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
10850 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20  thread-specific 
10860 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75  data so this rou
10870 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a  tine is now a.**
10880 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72   no-op.  It is r
10890 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74  etained for hist
108a0 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69  orical compatibi
108b0 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lity..*/.void sq
108c0 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
108d0 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65  anup(void){.}.#e
108e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
108f0 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  rn meta informat
10900 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63  ion about a spec
10910 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ific column of a
10920 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
10930 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20  .** See comment 
10940 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71  in sqlite3.h (sq
10950 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64  lite.h.in) for d
10960 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65  etails..*/.#ifde
10970 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10980 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
10990 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
109a0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
109b0 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
109c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
109d0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
109e0 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
109f0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
10a00 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
10a10 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
10a20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10a30 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
10a40 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
10a50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10a60 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
10a70 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
10a80 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
10a90 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
10aa0 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
10ab0 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
10ac0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
10ad0 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
10ae0 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
10af0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
10b00 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
10b10 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
10b20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
10b30 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
10b40 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
10b50 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
10b60 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
10b70 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
10b80 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
10b90 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
10ba0 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
10bb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
10bc0 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
10bd0 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
10be0 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
10bf0 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
10c00 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
10c10 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
10c20 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
10c30 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63    int iCol;..  c
10c40 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61  har const *zData
10c50 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
10c60 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71   const *zCollSeq
10c70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e   = 0;.  int notn
10c80 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ull = 0;.  int p
10c90 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20  rimarykey = 0;. 
10ca0 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30   int autoinc = 0
10cb0 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  ;..  /* Ensure t
10cc0 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
10cd0 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64  ma has been load
10ce0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
10cf0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
10d00 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
10d10 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
10d20 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
10d30 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  e3Init(db, &zErr
10d40 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  Msg);.  if( SQLI
10d50 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
10d60 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
10d70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
10d80 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71  e the table in q
10d90 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61  uestion */.  pTa
10da0 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
10db0 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e  able(db, zTableN
10dc0 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  ame, zDbName);. 
10dd0 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54   if( !pTab || pT
10de0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
10df0 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
10e00 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
10e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
10e20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77  the column for w
10e30 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71  hich info is req
10e40 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  uested */.  if( 
10e50 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
10e60 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20  ColumnName) ){. 
10e70 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
10e80 69 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69  iPKey;.    if( i
10e90 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
10ea0 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
10eb0 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  ol[iCol];.    }.
10ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
10ed0 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
10ee0 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
10ef0 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
10f00 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
10f10 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
10f20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
10f30 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
10f40 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
10f50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10f60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
10f70 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f   iCol==pTab->nCo
10f80 6c 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  l ){.      pTab 
10f90 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
10fa0 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
10fb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
10fc0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
10fd0 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69  tores the meta i
10fe0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
10ff0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
11000 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  .  ** to the cal
11010 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  ler in local var
11020 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65  iables zDataType
11030 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e  , zCollSeq, notn
11040 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a  ull, primarykey.
11050 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63    ** and autoinc
11060 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
11070 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f  there are two po
11080 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a  ssibilities:.  *
11090 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54  * .  **     1. T
110a0 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  he specified col
110b0 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77  umn name was row
110c0 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f  id", "oid" or "_
110d0 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20  rowid_" .  **   
110e0 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69       and there i
110f0 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20  s no explicitly 
11100 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c  declared IPK col
11110 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  umn. .  **.  ** 
11120 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65      2. The table
11130 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61   is not a view a
11140 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  nd the column na
11150 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e  me identified an
11160 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78   .  **        ex
11170 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
11180 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d  d column. Copy m
11190 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
111a0 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f  from *pCol..  */
111b0 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a   .  if( pCol ){.
111c0 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
111d0 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
111e0 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c   zCollSeq = pCol
111f0 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74  ->zColl;.    not
11200 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74  null = pCol->not
11210 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69  Null!=0;.    pri
11220 6d 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d  marykey  = pCol-
11230 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20  >isPrimKey!=0;. 
11240 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
11250 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
11260 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
11270 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
11280 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
11290 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
112a0 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
112b0 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
112c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
112d0 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
112e0 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22  llSeq = "BINARY"
112f0 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
11300 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  :.  sqlite3Btree
11310 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
11320 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20   /* Whether the 
11330 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75  function call su
11340 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65  cceeded or faile
11350 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  d, set the outpu
11360 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a  t parameters.  *
11370 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68  * to whatever th
11380 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65  eir local counte
11390 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20  rparts contain. 
113a0 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  If an error did 
113b0 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73  occur,.  ** this
113c0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
113d0 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f  of zeroing all o
113e0 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
113f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44  ..  */.  if( pzD
11400 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74  ataType ) *pzDat
11410 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70  aType = zDataTyp
11420 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53  e;.  if( pzCollS
11430 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20  eq ) *pzCollSeq 
11440 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66  = zCollSeq;.  if
11450 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e  ( pNotNull ) *pN
11460 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c  otNull = notnull
11470 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79  ;.  if( pPrimary
11480 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b  Key ) *pPrimaryK
11490 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b  ey = primarykey;
114a0 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20  .  if( pAutoinc 
114b0 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75  ) *pAutoinc = au
114c0 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51  toinc;..  if( SQ
114d0 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21  LITE_OK==rc && !
114e0 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
114f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
11500 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72  rrMsg);.    zErr
11510 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
11520 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63  intf(db, "no suc
11530 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
11540 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  %s.%s", zTableNa
11550 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  me,.        zCol
11560 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  umnName);.    rc
11570 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
11580 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
11590 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  ror(db, rc, (zEr
115a0 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
115b0 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
115c0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
115d0 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
115e0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
115f0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
11600 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
11610 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11620 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
11630 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
11640 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
11650 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
11660 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
11670 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
11680 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
11690 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
116a0 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
116b0 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
116c0 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
116d0 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
116e0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
116f0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
11700 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
11710 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
11720 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
11730 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
11740 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
11750 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
11760 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
11770 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
11780 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
11790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
117a0 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
117b0 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
117c0 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
117d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
117e0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
117f0 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
11800 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20  b, int onoff){. 
11810 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11820 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
11830 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
11840 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
11850 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71  fff : 0xff;.  sq
11860 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11870 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
11880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
118a0 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72  e the xFileContr
118b0 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70  ol method on a p
118c0 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
118d0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
118e0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
118f0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
11900 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
11910 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
11920 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  pArg){.  int rc 
11930 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
11940 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c    int iDb;.  sql
11950 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11960 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
11970 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b  f( zDbName==0 ){
11980 0a 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20 20  .    iDb = 0;.  
11990 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
119a0 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  Db=0; iDb<db->nD
119b0 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20  b; iDb++){.     
119c0 20 69 66 28 20 73 74 72 63 6d 70 28 64 62 2d 3e   if( strcmp(db->
119d0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
119e0 7a 44 62 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  zDbName)==0 ) br
119f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
11a00 20 69 66 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62   if( iDb<db->nDb
11a10 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   ){.    Btree *p
11a20 42 74 72 65 65 20 3d 20 64 62 2d 3e 61 44 62 5b  Btree = db->aDb[
11a30 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  iDb].pBt;.    if
11a40 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
11a50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
11a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
11a70 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 20 20 73  ile *fd;.      s
11a80 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11a90 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20  (pBtree);.      
11aa0 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
11ab0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65  BtreePager(pBtre
11ac0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
11ad0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
11ae0 20 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65       fd = sqlite
11af0 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
11b00 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
11b10 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( fd!=0 );.     
11b20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
11b30 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
11b40 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28  ER ){.        *(
11b50 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70  sqlite3_file**)p
11b60 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  Arg = fd;.      
11b70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11b80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11b90 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
11ba0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11bb0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
11bc0 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
11bd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11be0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
11bf0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
11c00 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11c10 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
11c20 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tree);.    }.  }
11c30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11c40 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
11c50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
11c60 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65    .}../*.** Inte
11c70 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
11c80 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
11c90 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
11ca0 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
11cb0 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
11cc0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
11cd0 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
11ce0 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61  TEST.  va_list a
11cf0 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
11d00 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
11d10 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
11d20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
11d30 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
11d40 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
11d50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
11d60 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
11d70 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
11d80 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
11d90 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
11da0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
11db0 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
11dc0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
11dd0 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
11de0 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
11df0 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
11e00 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
11e10 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
11e20 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
11e30 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
11e40 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
11e50 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
11e60 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
11e70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
11e80 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
11e90 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
11ea0 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
11eb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11ec0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
11ed0 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
11ee0 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
11ef0 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
11f00 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
11f10 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
11f20 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
11f30 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
11f40 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
11f50 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
11f60 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
11f70 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
11f80 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
11f90 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
11fa0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
11fb0 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
11fc0 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 65 74  sqlite3PrngReset
11fd0 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
11fe0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
11ff0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
12000 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
12010 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
12020 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
12030 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
12040 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
12050 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
12060 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
12070 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
12080 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
12090 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
120a0 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
120b0 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
120c0 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
120d0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
120e0 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
120f0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
12100 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
12110 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
12120 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
12130 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
12140 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
12150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
12160 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
12170 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
12180 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
12190 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
121a0 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
121b0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
121c0 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
121d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
121e0 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
121f0 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
12200 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
12210 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
12220 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e  test_control(BEN
12230 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
12240 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a  , xBegin, xEnd).
12250 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
12260 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20  gister hooks to 
12270 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65  call to indicate
12280 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20   which malloc() 
12290 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a  failures .    **
122a0 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20   are benign..   
122b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
122c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e  ITE_TESTCTRL_BEN
122d0 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53  IGN_MALLOC_HOOKS
122e0 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
122f0 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75  f void (*void_fu
12300 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20  nction)(void);. 
12310 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69       void_functi
12320 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b  on xBenignBegin;
12330 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
12340 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b  tion xBenignEnd;
12350 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65  .      xBenignBe
12360 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  gin = va_arg(ap,
12370 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
12380 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e  .      xBenignEn
12390 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  d = va_arg(ap, v
123a0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20  oid_function);. 
123b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69       sqlite3Beni
123c0 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42  gnMallocHooks(xB
123d0 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e  enignBegin, xBen
123e0 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62  ignEnd);.      b
123f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
12400 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
12410 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
12420 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
12430 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75  _PENDING_BYTE, u
12440 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20  nsigned int X). 
12450 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
12460 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
12470 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  e to the value i
12480 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20  n the argument, 
12490 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d  if X>0..    ** M
124a0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
124b0 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20  f X==0.  Return 
124c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
124d0 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20   pending byte.  
124e0 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74    ** as it exist
124f0 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20  ing before this 
12500 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
12510 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
12520 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68  * IMPORTANT:  Ch
12530 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
12540 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34  NG byte from 0x4
12550 30 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20  0000000 results 
12560 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  in.    ** an inc
12570 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61  ompatible databa
12580 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20  se file format. 
12590 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
125a0 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a  NDING byte.    *
125b0 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61  * while any data
125c0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
125d0 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20  is open results 
125e0 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64  in undefined and
125f0 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65 72 69  .    ** dileteri
12600 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20  ous behavior..  
12610 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
12620 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
12630 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20  NDING_BYTE: {.  
12640 20 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47      rc = PENDING
12650 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53  _BYTE;.#ifndef S
12660 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
12670 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75       {.        u
12680 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56  nsigned int newV
12690 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  al = va_arg(ap, 
126a0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20  unsigned int);. 
126b0 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61         if( newVa
126c0 6c 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69  l ) sqlite3Pendi
126d0 6e 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b  ngByte = newVal;
126e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
126f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12700 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
12710 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
12720 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
12730 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
12740 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
12750 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
12760 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
12770 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
12780 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
12790 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
127a0 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
127b0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
127c0 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
127d0 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
127e0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
127f0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
12800 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
12810 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
12820 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
12830 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
12840 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
12850 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
12860 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
12870 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
12880 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
12890 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
128a0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
128b0 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
128c0 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
128d0 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
128e0 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
128f0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
12900 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
12910 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
12920 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
12930 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
12940 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
12950 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12960 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  (x = va_arg(ap,i
12970 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  nt))!=0 );.     
12980 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62   rc = x;.      b
12990 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
129a0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
129b0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
129c0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
129d0 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29  L_ALWAYS, int X)
129e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
129f0 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
12a00 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
12a10 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74  est to see how t
12a20 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20  he ALWAYS and.  
12a30 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f    ** NEVER macro
12a40 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61  s were defined a
12a50 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a  t compile-time..
12a60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
12a70 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
12a80 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20  s ALWAYS(X).  . 
12a90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
12aa0 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73   recommended tes
12ab0 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74  t is X==2.  If t
12ac0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
12ad0 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 2, that means
12ae0 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29  .    ** ALWAYS()
12af0 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
12b00 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73   both no-op pass
12b10 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c  -through macros,
12b20 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20   which is the.  
12b30 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74    ** default set
12b40 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65  ting.  If the re
12b50 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c  turn value is 1,
12b60 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69   then ALWAYS() i
12b70 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  s either.    ** 
12b80 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
12b90 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73  ue or else it as
12ba0 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67  serts if its arg
12bb0 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a  ument is false..
12bc0 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
12bd0 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d   behavior (hard-
12be0 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69  coded to true) i
12bf0 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
12c00 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
12c10 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
12c20 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
12c30 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20  is disabled and 
12c40 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
12c50 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65  * behavior (asse
12c60 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  rt if the argume
12c70 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69  nt to ALWAYS() i
12c80 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20  s false) is the 
12c90 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
12ca0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
12cb0 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
12cc0 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
12cd0 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  bled..    **.   
12ce0 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65   ** The run-time
12cf0 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20   test procedure 
12d00 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74  might look somet
12d10 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
12d20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
12d30 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
12d40 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
12d50 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
12d60 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a  , 2)==2 ){.    *
12d70 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
12d80 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
12d90 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  re no-op pass-th
12da0 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20  rough macros.   
12db0 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   **    }else if(
12dc0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
12dd0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
12de0 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29  TCTRL_ASSERT, 1)
12df0 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   ){.    **      
12e00 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73  // ALWAYS(x) ass
12e10 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74  erts that x is t
12e20 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73  rue. NEVER(x) as
12e30 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65  serts x is false
12e40 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  ..    **    }els
12e50 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  e{.    **      /
12e60 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61  / ALWAYS(x) is a
12e70 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45   constant 1.  NE
12e80 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73  VER(x) is a cons
12e90 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20  tant 0..    **  
12ea0 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63    }.    */.    c
12eb0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
12ec0 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20  TRL_ALWAYS: {.  
12ed0 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
12ee0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
12ef0 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29    rc = ALWAYS(x)
12f00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12f10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
12f20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
12f30 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
12f40 54 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c  TRL_RESERVE, sql
12f50 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
12f60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
12f70 65 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20  et the nReserve 
12f80 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68  size to N for th
12f90 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
12fa0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
12fb0 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f      ** connectio
12fc0 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  n db..    */.   
12fd0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
12fe0 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b  TCTRL_RESERVE: {
12ff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
13000 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
13010 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
13020 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
13030 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  ap,int);.      s
13040 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13050 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
13060 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13070 65 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d  eSetPageSize(db-
13080 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20  >aDb[0].pBt, 0, 
13090 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  x, 0);.      sql
130a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
130b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
130c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
130d0 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33  .    /*  sqlite3
130e0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
130f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
13100 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c  TIMIZATIONS, sql
13110 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29  ite3 *db, int N)
13120 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
13130 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
13140 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
13150 61 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69  ations for testi
13160 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
13170 65 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65  e .    ** argume
13180 6e 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73  nt N is a bitmas
13190 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f  k of optimizatio
131a0 6e 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ns to be disable
131b0 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20  d.  For normal. 
131c0 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20     ** operation 
131d0 4e 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20  N should be 0.  
131e0 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
131f0 20 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20   a test program 
13200 28 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a  (like the.    **
13210 20 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20   SQL Logic Test 
13220 6f 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75  or SLT test modu
13230 6c 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20  le) can run the 
13240 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c  same SQL multipl
13250 65 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77  e times.    ** w
13260 69 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ith various opti
13270 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c  mizations disabl
13280 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
13290 74 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  t the same answe
132a0 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61  r.    ** is obta
132b0 69 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61  ined in every ca
132c0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  se..    */.    c
132d0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
132e0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
132f0 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S: {.      sqlit
13300 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
13310 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
13320 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
13330 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
13340 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
13350 78 20 26 20 53 51 4c 49 54 45 5f 4f 70 74 4d 61  x & SQLITE_OptMa
13360 73 6b 29 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  sk) | (db->flags
13370 20 26 20 7e 53 51 4c 49 54 45 5f 4f 70 74 4d 61   & ~SQLITE_OptMa
13380 73 6b 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  sk);.      break
13390 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
133a0 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44  SQLITE_N_KEYWORD
133b0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
133c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
133d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
133e0 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68  EYWORD, const ch
133f0 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a  ar *zWord).    *
13400 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72  *.    ** If zWor
13410 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72  d is a keyword r
13420 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65  ecognized by the
13430 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65   parser, then re
13440 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  turn the.    ** 
13450 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72  number of keywor
13460 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64  ds.  Or if zWord
13470 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72   is not a keywor
13480 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20  d, return 0..   
13490 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73   ** .    ** This
134a0 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69 73   test feature is
134b0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
134c0 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  in the amalgamat
134d0 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a  ion since.    **
134e0 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45   the SQLITE_N_KE
134f0 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e  YWORD macro is n
13500 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68  ot defined in th
13510 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74  is file if SQLit
13520 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c  e.    ** is buil
13530 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65  t using separate
13540 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20   source files.. 
13550 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
13560 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
13570 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20  SKEYWORD: {.    
13580 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
13590 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ord = va_arg(ap,
135a0 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20   const char*);. 
135b0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
135c0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f  ite3Strlen30(zWo
135d0 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rd);.      rc = 
135e0 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43  (sqlite3KeywordC
135f0 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20  ode((u8*)zWord, 
13600 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c  n)!=TK_ID) ? SQL
13610 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20  ITE_N_KEYWORD : 
13620 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
13630 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20      }.#endif .. 
13640 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
13650 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
13660 45 5f 54 45 53 54 43 54 52 4c 5f 50 47 48 44 52  E_TESTCTRL_PGHDR
13670 53 5a 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  SZ).    **.    *
13680 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
13690 65 20 6f 66 20 61 20 70 63 61 63 68 65 20 68 65  e of a pcache he
136a0 61 64 65 72 20 69 6e 20 62 79 74 65 73 2e 0a 20  ader in bytes.. 
136b0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
136c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
136d0 47 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20  GHDRSZ: {.      
136e0 72 63 20 3d 20 73 69 7a 65 6f 66 28 50 67 48 64  rc = sizeof(PgHd
136f0 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
13700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
13710 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
13720 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
13730 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
13740 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46  C, sz, &pNew, pF
13750 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ree);.    **.   
13760 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69   ** Pass pFree i
13770 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74  nto sqlite3Scrat
13780 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a  chFree(). .    *
13790 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61  * If sz>0 then a
137a0 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63  llocate a scratc
137b0 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e  h buffer into pN
137c0 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ew.  .    */.   
137d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
137e0 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
137f0 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  LOC: {.      voi
13800 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65  d *pFree, **ppNe
13810 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  w;.      int sz;
13820 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61  .      sz = va_a
13830 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
13840 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72     ppNew = va_ar
13850 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20  g(ap, void**);. 
13860 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f       pFree = va_
13870 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
13880 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a        if( sz ) *
13890 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53  ppNew = sqlite3S
138a0 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29  cratchMalloc(sz)
138b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
138c0 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65  cratchFree(pFree
138d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
138e0 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 76 61 5f      }..  }.  va_
138f0 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20  end(ap);.#endif 
13900 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
13910 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20  UILTIN_TEST */. 
13920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.