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

Artifact 1a5cafdc1bee11f4322c837487bf6fa8e54b2f50:


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: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
5d90: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 68 6f  e transaction-ho
5da0: 6f 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ok..*/.void sqli
5db0: 74 65 33 54 72 61 6e 73 61 63 74 69 6f 6e 48 6f  te3TransactionHo
5dc0: 6f 6b 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ok(sqlite3 *db, 
5dd0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 4c 65 76  int op, int iLev
5de0: 65 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f  el){.  assert( o
5df0: 70 3d 3d 53 51 4c 49 54 45 5f 42 45 47 49 4e 20  p==SQLITE_BEGIN 
5e00: 7c 7c 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 43 4f  || op==SQLITE_CO
5e10: 4d 4d 49 54 20 7c 7c 20 6f 70 3d 3d 53 51 4c 49  MMIT || op==SQLI
5e20: 54 45 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  TE_ROLLBACK );. 
5e30: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 51 4c   assert( op==SQL
5e40: 49 54 45 5f 42 45 47 49 4e 20 7c 7c 20 69 4c 65  ITE_BEGIN || iLe
5e50: 76 65 6c 3c 64 62 2d 3e 69 4f 70 65 6e 54 72 61  vel<db->iOpenTra
5e60: 6e 73 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 30 20  ns || iLevel==0 
5e70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  );.  assert( op=
5e80: 3d 53 51 4c 49 54 45 5f 42 45 47 49 4e 20 7c 7c  =SQLITE_BEGIN ||
5e90: 20 69 4c 65 76 65 6c 3c 64 62 2d 3e 69 4f 70 65   iLevel<db->iOpe
5ea0: 6e 54 72 61 6e 73 20 7c 7c 20 64 62 2d 3e 69 4f  nTrans || db->iO
5eb0: 70 65 6e 54 72 61 6e 73 3d 3d 30 20 29 3b 0a 20  penTrans==0 );. 
5ec0: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 53 51 4c   assert( op!=SQL
5ed0: 49 54 45 5f 42 45 47 49 4e 20 7c 7c 20 69 4c 65  ITE_BEGIN || iLe
5ee0: 76 65 6c 3d 3d 64 62 2d 3e 69 4f 70 65 6e 54 72  vel==db->iOpenTr
5ef0: 61 6e 73 20 7c 7c 20 69 4c 65 76 65 6c 3d 3d 30  ans || iLevel==0
5f00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
5f10: 21 3d 53 51 4c 49 54 45 5f 42 45 47 49 4e 20 7c  !=SQLITE_BEGIN |
5f20: 7c 20 69 4c 65 76 65 6c 3d 3d 64 62 2d 3e 69 4f  | iLevel==db->iO
5f30: 70 65 6e 54 72 61 6e 73 20 7c 7c 20 64 62 2d 3e  penTrans || db->
5f40: 69 4f 70 65 6e 54 72 61 6e 73 3d 3d 31 20 29 3b  iOpenTrans==1 );
5f50: 0a 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  ..  if( op==SQLI
5f60: 54 45 5f 42 45 47 49 4e 20 26 26 20 69 4c 65 76  TE_BEGIN && iLev
5f70: 65 6c 21 3d 64 62 2d 3e 69 4f 70 65 6e 54 72 61  el!=db->iOpenTra
5f80: 6e 73 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ns ) return;.  i
5f90: 66 28 20 6f 70 21 3d 53 51 4c 49 54 45 5f 42 45  f( op!=SQLITE_BE
5fa0: 47 49 4e 20 26 26 20 69 4c 65 76 65 6c 3e 3d 64  GIN && iLevel>=d
5fb0: 62 2d 3e 69 4f 70 65 6e 54 72 61 6e 73 20 29 20  b->iOpenTrans ) 
5fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 64  return;..  if( d
5fd0: 62 2d 3e 78 54 72 61 6e 73 43 61 6c 6c 62 61 63  b->xTransCallbac
5fe0: 6b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72  k ){.    db->xTr
5ff0: 61 6e 73 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ansCallback(db->
6000: 70 54 72 61 6e 73 41 72 67 2c 20 6f 70 2c 20 69  pTransArg, op, i
6010: 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 20 20 64 62  Level);.  }.  db
6020: 2d 3e 69 4f 70 65 6e 54 72 61 6e 73 20 3d 20 69  ->iOpenTrans = i
6030: 4c 65 76 65 6c 20 2b 20 28 6f 70 3d 3d 53 51 4c  Level + (op==SQL
6040: 49 54 45 5f 42 45 47 49 4e 29 3b 0a 7d 0a 0a 2f  ITE_BEGIN);.}../
6050: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
6060: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
6070: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6080: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c  3RollbackAll(sql
6090: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
60a0: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
60b0: 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  s = 0;.  assert(
60c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
60d0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
60e0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
60f0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
6100: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
6110: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
6120: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
6130: 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Bt ){.      if( 
6140: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
6150: 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d  Trans(db->aDb[i]
6160: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  .pBt) ){.       
6170: 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20   inTrans = 1;.  
6180: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
6190: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
61a0: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  (db->aDb[i].pBt)
61b0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ;.      db->aDb[
61c0: 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a  i].inTrans = 0;.
61d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
61e0: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
61f0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e  db);.  sqlite3En
6200: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
6210: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ..  if( db->flag
6220: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
6230: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
6240: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
6250: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
6260: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
6270: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
6280: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  a(db, 0);.  }.. 
6290: 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64   /* Any deferred
62a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
62b0: 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20  ations have now 
62c0: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a  been resolved. *
62d0: 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  /.  db->nDeferre
62e0: 64 43 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a  dCons = 0;..  /*
62f0: 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e   If one has been
6300: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76   configured, inv
6310: 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  oke the rollback
6320: 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  -hook callback *
6330: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c  /.  if( db->xRol
6340: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26  lbackCallback &&
6350: 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62   (inTrans || !db
6360: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b  ->autoCommit) ){
6370: 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  .    db->xRollba
6380: 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  ckCallback(db->p
6390: 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20  RollbackArg);.  
63a0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61  }..  /* If a tra
63b0: 6e 73 61 63 74 69 6f 6e 2d 68 6f 6f 6b 20 69 73  nsaction-hook is
63c0: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76   configured, inv
63d0: 6f 6b 65 20 69 74 20 6e 6f 77 20 74 6f 20 72 65  oke it now to re
63e0: 70 6f 72 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  port on .  ** th
63f0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  e rollback opera
6400: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  tion. */.  sqlit
6410: 65 33 54 72 61 6e 73 61 63 74 69 6f 6e 48 6f 6f  e3TransactionHoo
6420: 6b 28 64 62 2c 20 53 51 4c 49 54 45 5f 52 4f 4c  k(db, SQLITE_ROL
6430: 4c 42 41 43 4b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  LBACK, 0);.}../*
6440: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61  .** Return a sta
6450: 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20  tic string that 
6460: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
6470: 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
6480: 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
6490: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e  argument..*/.con
64a0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
64b0: 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a  ErrStr(int rc){.
64c0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
64d0: 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b  har* const aMsg[
64e0: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ] = {.    /* SQL
64f0: 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  ITE_OK          
6500: 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72  */ "not an error
6510: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6520: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20  _ERROR       */ 
6530: 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72  "SQL logic error
6540: 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61   or missing data
6550: 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  base",.    /* SQ
6560: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20  LITE_INTERNAL   
6570: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
6580: 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20  LITE_PERM       
6590: 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d   */ "access perm
65a0: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  ission denied",.
65b0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42      /* SQLITE_AB
65c0: 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61  ORT       */ "ca
65d0: 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65 64  llback requested
65e0: 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20   query abort",. 
65f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53     /* SQLITE_BUS
6600: 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  Y        */ "dat
6610: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22  abase is locked"
6620: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6630: 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22  LOCKED      */ "
6640: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
6650: 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f  s locked",.    /
6660: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20  * SQLITE_NOMEM  
6670: 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20       */ "out of 
6680: 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20  memory",.    /* 
6690: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
66a0: 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74     */ "attempt t
66b0: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
66c0: 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ly database",.  
66d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
66e0: 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65  RRUPT   */ "inte
66f0: 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a  rrupted",.    /*
6700: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20   SQLITE_IOERR   
6710: 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f      */ "disk I/O
6720: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
6730: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20  SQLITE_CORRUPT  
6740: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
6750: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
6760: 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a  lformed",.    /*
6770: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
6780: 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20      */ "unknown 
6790: 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20  operation",.    
67a0: 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20  /* SQLITE_FULL  
67b0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
67c0: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
67d0: 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ll",.    /* SQLI
67e0: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a  TE_CANTOPEN    *
67f0: 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  / "unable to ope
6800: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  n database file"
6810: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6820: 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22  PROTOCOL    */ "
6830: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
6840: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6850: 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20  _EMPTY       */ 
6860: 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  "table contains 
6870: 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a  no data",.    /*
6880: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20   SQLITE_SCHEMA  
6890: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
68a0: 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
68b0: 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ged",.    /* SQL
68c0: 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20  ITE_TOOBIG      
68d0: 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c  */ "string or bl
68e0: 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20  ob too big",.   
68f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   /* SQLITE_CONST
6900: 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74  RAINT  */ "const
6910: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20  raint failed",. 
6920: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
6930: 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74  MATCH    */ "dat
6940: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c  atype mismatch",
6950: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
6960: 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c  ISUSE      */ "l
6970: 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63  ibrary routine c
6980: 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71  alled out of seq
6990: 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53  uence",.    /* S
69a0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
69b0: 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65    */ "large file
69c0: 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61   support is disa
69d0: 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bled",.    /* SQ
69e0: 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20  LITE_AUTH       
69f0: 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69   */ "authorizati
6a00: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
6a10: 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  /* SQLITE_FORMAT
6a20: 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69        */ "auxili
6a30: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72  ary database for
6a40: 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  mat error",.    
6a50: 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20  /* SQLITE_RANGE 
6a60: 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f        */ "bind o
6a70: 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  r column index o
6a80: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
6a90: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
6aa0: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
6ab0: 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72   is encrypted or
6ac0: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
6ad0: 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 72 63 20 26  se",.  };.  rc &
6ae0: 3d 20 30 78 66 66 3b 0a 20 20 69 66 28 20 41 4c  = 0xff;.  if( AL
6af0: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
6b00: 63 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61  c<(int)(sizeof(a
6b10: 4d 73 67 29 2f 73 69 7a 65 6f 66 28 61 4d 73 67  Msg)/sizeof(aMsg
6b20: 5b 30 5d 29 29 20 26 26 20 61 4d 73 67 5b 72 63  [0])) && aMsg[rc
6b30: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ]!=0 ){.    retu
6b40: 72 6e 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d  rn aMsg[rc];.  }
6b50: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6b60: 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22   "unknown error"
6b70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
6b80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
6b90: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
6ba0: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
6bb0: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
6bc0: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
6bd0: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
6be0: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
6bf0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
6c00: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
6c10: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
6c20: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
6c30: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
6c40: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
6c50: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
6c60: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
6c70: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
6c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
6c90: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6ca0: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6cc0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
6cd0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
6ce0: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
6cf0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
6d00: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
6d10: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
6d20: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
6d30: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
6d40: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
6d50: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
6d60: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
6d70: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
6d80: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
6d90: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
6da0: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
6db0: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
6dc0: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
6dd0: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
6de0: 4c 41 59 20 28 73 69 7a 65 6f 66 28 64 65 6c 61  LAY (sizeof(dela
6df0: 79 73 29 2f 73 69 7a 65 6f 66 28 64 65 6c 61 79  ys)/sizeof(delay
6e00: 73 5b 30 5d 29 29 0a 20 20 73 71 6c 69 74 65 33  s[0])).  sqlite3
6e10: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
6e20: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
6e30: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
6e40: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
6e50: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
6e60: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
6e70: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
6e80: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
6e90: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
6ea0: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
6eb0: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
6ec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
6ed0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
6ee0: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
6ef0: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
6f00: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
6f10: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
6f20: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
6f30: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
6f40: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
6f50: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
6f60: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
6f70: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
6f80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
6f90: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
6fa0: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
6fb0: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
6fc0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
6fd0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
6fe0: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
6ff0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
7000: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
7010: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
7020: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
7030: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7040: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
7050: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
7060: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
7070: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
7080: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
7090: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
70a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
70b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
70c0: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
70d0: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
70e0: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
70f0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
7100: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
7110: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
7120: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
7130: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
7140: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
7150: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
7160: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
7170: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
7180: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
7190: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
71a0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
71b0: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
71c0: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
71d0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
71e0: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
71f0: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
7200: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
7210: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
7220: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
7230: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
7240: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
7250: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7260: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
7270: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
7280: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
7290: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
72a0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
72b0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
72c0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
72d0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
72e0: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
72f0: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
7300: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
7310: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
7320: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7330: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
7340: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
7350: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
7360: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
7370: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
7380: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
7390: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
73a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
73b0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
73c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
73d0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
73e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
73f0: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a  RESS_CALLBACK./*
7400: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7410: 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65   sets the progre
7420: 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ss callback for 
7430: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
7440: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
7450: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
7460: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
7470: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  ven argument. Th
7480: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
7490: 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69  ack will.** be i
74a0: 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70  nvoked every nOp
74b0: 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f  s opcodes..*/.vo
74c0: 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72  id sqlite3_progr
74d0: 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  ess_handler(.  s
74e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
74f0: 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28  nt nOps,.  int (
7500: 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64  *xProgress)(void
7510: 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72  *), .  void *pAr
7520: 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  g.){.  sqlite3_m
7530: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
7540: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70  utex);.  if( nOp
7550: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  s>0 ){.    db->x
7560: 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67  Progress = xProg
7570: 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50  ress;.    db->nP
7580: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70  rogressOps = nOp
7590: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
75a0: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
75b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
75c0: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
75d0: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
75e0: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
75f0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
7600: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
7610: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
7620: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
7630: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
7640: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
7650: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
7660: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
7670: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
7680: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
7690: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
76a0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
76b0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
76c0: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
76d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
76e0: 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20  ms){.  if( ms>0 
76f0: 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54  ){.    db->busyT
7700: 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20  imeout = ms;.   
7710: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
7720: 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65  ndler(db, sqlite
7730: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
7740: 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b  ack, (void*)db);
7750: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
7760: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
7770: 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  er(db, 0, 0);.  
7780: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
7790: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
77a0: 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  ause any pending
77b0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74   operation to st
77c0: 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65  op at its earlie
77d0: 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  st opportunity..
77e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
77f0: 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65  interrupt(sqlite
7800: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31  3 *db){.  db->u1
7810: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
7820: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
7830: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
7840: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
7850: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
7860: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
7870: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
7880: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
7890: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
78a0: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
78b0: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
78c0: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
78d0: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
78e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
78f0: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
7900: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
7910: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
7920: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
7930: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
7940: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
7950: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7960: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7970: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
7980: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
7990: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
79a0: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
79b0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
79c0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
79d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
79e0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
79f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
7a00: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
7a10: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
7a20: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
7a30: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75  _context*),.  Fu
7a40: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
7a50: 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46  estructor.){.  F
7a60: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
7a70: 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72   nName;..  asser
7a80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7a90: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
7aa0: 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63 74   );.  if( zFunct
7ab0: 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20  ionName==0 ||.  
7ac0: 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28 78      (xFunc && (x
7ad0: 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29 29  Final || xStep))
7ae0: 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46 75   || .      (!xFu
7af0: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26 26  nc && (xFinal &&
7b00: 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20   !xStep)) ||.   
7b10: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 21     (!xFunc && (!
7b20: 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70 29  xFinal && xStep)
7b30: 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72 67  ) ||.      (nArg
7b40: 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49  <-1 || nArg>SQLI
7b50: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
7b60: 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28 32  ARG) ||.      (2
7b70: 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  55<(nName = sqli
7b80: 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46 75  te3Strlen30( zFu
7b90: 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b  nctionName))) ){
7ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7bb0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7bc0: 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53    }.  .#ifndef S
7bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
7be0: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
7bf0: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
7c00: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
7c10: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
7c20: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
7c30: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
7c40: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
7c50: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
7c60: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
7c70: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
7c80: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
7c90: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
7ca0: 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ally..  **.  ** 
7cb0: 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73  If SQLITE_ANY is
7cc0: 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64 20   specified, add 
7cd0: 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
7ce0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20  f the function. 
7cf0: 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20   ** to the hash 
7d00: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
7d10: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ( enc==SQLITE_UT
7d20: 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d  F16 ){.    enc =
7d30: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
7d40: 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  IVE;.  }else if(
7d50: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59   enc==SQLITE_ANY
7d60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
7d70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7d80: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
7d90: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
7da0: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
7db0: 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44  .         pUserD
7dc0: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
7dd0: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
7de0: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28  ructor);.    if(
7df0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7e00: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7e10: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
7e20: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
7e30: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
7e40: 54 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20 20  TF16LE,.        
7e50: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
7e60: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
7e70: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
7e80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
7e90: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
7eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d  .    }.    enc =
7ec0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
7ed0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63  .  }.#else.  enc
7ee0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
7ef0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43  #endif.  .  /* C
7f00: 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74  heck if an exist
7f10: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ing function is 
7f20: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
7f30: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
7f40: 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  so,.  ** and the
7f50: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
7f60: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53  s, then return S
7f70: 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61  QLITE_BUSY. If a
7f80: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
7f90: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
7fa0: 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74  en/deleted but t
7fb0: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
7fc0: 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68  ve VMs, allow th
7fd0: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  e.  ** operation
7fe0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74   to continue but
7ff0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
8000: 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  precompiled stat
8010: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
8020: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
8030: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
8040: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
8050: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
8060: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  0);.  if( p && p
8070: 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20  ->iPrefEnc==enc 
8080: 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  && p->nArg==nArg
8090: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
80a0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b  activeVdbeCnt ){
80b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
80c0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
80d0: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
80e0: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
80f0: 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63  modify user-func
8100: 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69  tion due to acti
8110: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
8120: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
8130: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8140: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
8150: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
8160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
8170: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
8180: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
8190: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
81a0: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
81b0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
81c0: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d  nctionName, nNam
81d0: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
81e0: 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , 1);.  assert(p
81f0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
8200: 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20  iled);.  if( !p 
8210: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8220: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
8230: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65  .  /* If an olde
8240: 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  r version of the
8250: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61   function with a
8260: 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74   configured dest
8270: 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62  ructor is.  ** b
8280: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e  eing replaced in
8290: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
82a0: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  tor function her
82b0: 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e  e. */.  function
82c0: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
82d0: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
82e0: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
82f0: 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  uctor->nRef++;. 
8300: 20 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63   }.  p->pDestruc
8310: 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f  tor = pDestructo
8320: 72 3b 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  r;.  p->flags = 
8330: 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20  0;.  p->xFunc = 
8340: 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65  xFunc;.  p->xSte
8350: 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  p = xStep;.  p->
8360: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
8370: 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  al;.  p->pUserDa
8380: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
8390: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36    p->nArg = (u16
83a0: 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  )nArg;.  return 
83b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
83c0: 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75  .** Create new u
83d0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ser functions..*
83e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
83f0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
8400: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
8410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
8420: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
8430: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
8440: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
8450: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
8460: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
8470: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
8480: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
8490: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
84a0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
84b0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
84c0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
84d0: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74  ntext*).){.  ret
84e0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61  urn sqlite3_crea
84f0: 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64  te_function_v2(d
8500: 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20  b, zFunc, nArg, 
8510: 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  enc, p, xFunc, x
8520: 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Step,.          
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c            xFinal
8550: 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  , 0);.}..int sql
8560: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8570: 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
8580: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
8590: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69  char *zFunc,.  i
85a0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
85b0: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  nc,.  void *p,. 
85c0: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
85d0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
85e0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
85f0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
8600: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
8610: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
8620: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
8630: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
8640: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
8650: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  ),.  void (*xDes
8660: 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b  troy)(void *).){
8670: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8680: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63  TE_ERROR;.  Func
8690: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67  Destructor *pArg
86a0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
86b0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
86c0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44  mutex);.  if( xD
86d0: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41  estroy ){.    pA
86e0: 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75  rg = (FuncDestru
86f0: 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62  ctor *)sqlite3Db
8700: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
8710: 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75  izeof(FuncDestru
8720: 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ctor));.    if( 
8730: 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78  !pArg ){.      x
8740: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
8750: 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20    goto out;.    
8760: 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73  }.    pArg->xDes
8770: 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b  troy = xDestroy;
8780: 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72  .    pArg->pUser
8790: 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Data = p;.  }.  
87a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
87b0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
87c0: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
87d0: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
87e0: 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69  inal, pArg);.  i
87f0: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
8800: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8810: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
8820: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65  TE_OK );.    xDe
8830: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71  stroy(p);.    sq
8840: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8850: 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74  pArg);.  }.. out
8860: 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  :.  rc = sqlite3
8870: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
8880: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8890: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
88a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
88b0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
88c0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74  E_OMIT_UTF16.int
88d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
88e0: 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71  function16(.  sq
88f0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
8900: 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69  st void *zFuncti
8910: 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  onName,.  int nA
8920: 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  rg,.  int eTextR
8930: 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  ep,.  void *p,. 
8940: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
8950: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
8960: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
8970: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
8980: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
8990: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
89a0: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
89b0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
89c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
89d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
89e0: 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73  har *zFunc8;.  s
89f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8a00: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
8a10: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
8a20: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8a30: 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33  zFunc8 = sqlite3
8a40: 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75  Utf16to8(db, zFu
8a50: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20  nctionName, -1, 
8a60: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
8a70: 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  VE);.  rc = sqli
8a80: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
8a90: 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20  , zFunc8, nArg, 
8aa0: 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75  eTextRep, p, xFu
8ab0: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
8ac0: 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  l,0);.  sqlite3D
8ad0: 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38  bFree(db, zFunc8
8ae0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8af0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
8b00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8b10: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8b20: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
8b30: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
8b40: 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61  * Declare that a
8b50: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
8b60: 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  en overloaded by
8b70: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
8b80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
8b90: 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  unction already 
8ba0: 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75  exists as a regu
8bb0: 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  lar global funct
8bc0: 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ion, then.** thi
8bd0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
8be0: 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75  o-op.  If the fu
8bf0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
8c00: 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61  exist, then crea
8c10: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20  te.** a new one 
8c20: 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f  that always thro
8c30: 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  ws a run-time er
8c40: 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  ror.  .**.** Whe
8c50: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
8c60: 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69   intend to provi
8c70: 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64  de an overloaded
8c80: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a   function, they.
8c90: 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74  ** should call t
8ca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d  his routine to m
8cb0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f  ake sure the glo
8cc0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  bal function exi
8cd0: 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  sts..** A global
8ce0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65   function must e
8cf0: 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  xist in order fo
8d00: 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
8d10: 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f  n to work.** pro
8d20: 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  perly..*/.int sq
8d30: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
8d40: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
8d50: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
8d60: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
8d70: 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74  nt nArg.){.  int
8d80: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
8d90: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
8da0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
8db0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8dc0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
8dd0: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75  f( sqlite3FindFu
8de0: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
8df0: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , nName, nArg, S
8e00: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d  QLITE_UTF8, 0)==
8e10: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8e20: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
8e30: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
8e40: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8e60: 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64  , sqlite3Invalid
8e70: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  Function, 0, 0, 
8e80: 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  0);.  }.  rc = s
8e90: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
8ea0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
8eb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8ec0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8ed0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8ee0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8ef0: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
8f00: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
8f10: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
8f20: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
8f30: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
8f40: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
8f50: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
8f60: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
8f70: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
8f80: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
8f90: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
8fa0: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
8fb0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
8fc0: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
8fd0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
8fe0: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
8ff0: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
9000: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
9010: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
9020: 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72   *db, void (*xTr
9030: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
9040: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
9050: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
9060: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
9070: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
9080: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
9090: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
90a0: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
90b0: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
90c0: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
90d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
90e0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
90f0: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
9100: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
9110: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
9120: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
9130: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
9140: 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20   registered .** 
9150: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
9160: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
9170: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f  **.** A NULL pro
9180: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  file function me
9190: 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66  ans that no prof
91a0: 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  iling is execute
91b0: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
91c0: 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70  * profile is a p
91d0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
91e0: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
91f0: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
9200: 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63  lusion of.** eac
9210: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
9220: 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  that is run..*/.
9230: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
9240: 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  ofile(.  sqlite3
9250: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78   *db,.  void (*x
9260: 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63  Profile)(void*,c
9270: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
9280: 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e_uint64),.  voi
9290: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69  d *pArg.){.  voi
92a0: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
92b0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
92c0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
92d0: 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
92e0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
92f0: 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
9300: 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
9310: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
9320: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9330: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
9340: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
9350: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9360: 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a  IT_TRACE */../**
9370: 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a  * EXPERIMENTAL *
9380: 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  **.**.** Registe
9390: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r a function to 
93a0: 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20  be invoked when 
93b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  a transaction co
93c0: 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68  mments..** If th
93d0: 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69  e invoked functi
93e0: 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
93f0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ero, then the co
9400: 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a  mmit becomes a.*
9410: 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76  * rollback..*/.v
9420: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d  oid *sqlite3_com
9430: 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  mit_hook(.  sqli
9440: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
9450: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
9460: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
9470: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
9480: 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  nt (*xCallback)(
9490: 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63  void*),  /* Func
94a0: 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f  tion to invoke o
94b0: 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f  n each commit */
94c0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94e0: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
94f0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
9500: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
9510: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9520: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
9530: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
9540: 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
9550: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
9560: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
9570: 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
9580: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
9590: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
95a0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
95b0: 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
95c0: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
95d0: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
95e0: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
95f0: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
9600: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
9610: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
9620: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
9630: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
9640: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
9650: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9670: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
9680: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
9690: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
96a0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
96b0: 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
96c0: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
96d0: 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
96e0: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
96f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
9700: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
9710: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
9720: 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
9730: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
9740: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
9750: 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
9760: 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
9770: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
9780: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
9790: 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
97a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
97b0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
97c0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
97d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
97e0: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
97f0: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
9800: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
9810: 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
9820: 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
9830: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
9840: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
9850: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
9860: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9880: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
9890: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
98a0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
98b0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
98c0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
98d0: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
98e0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
98f0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
9900: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
9910: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
9920: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
9930: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
9940: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
9950: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b  b->pRollbackArg;
9960: 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  .  db->xRollback
9970: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
9980: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c  back;.  db->pRol
9990: 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b  lbackArg = pArg;
99a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
99b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
99c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
99d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
99e0: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
99f0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
9a00: 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
9a10: 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
9a20: 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
9a30: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
9a40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
9a50: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
9a60: 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28  _preupdate_hook(
9a70: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a90: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
9aa0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
9ab0: 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c   */.  void(*xCal
9ac0: 6c 62 61 63 6b 29 28 20 20 20 20 20 20 20 20 20  lback)(         
9ad0: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
9ae0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  tion */.    void
9af0: 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63  *,sqlite3*,int,c
9b00: 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20  har const*,char 
9b10: 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69  const*,sqlite3_i
9b20: 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74  nt64,sqlite3_int
9b30: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
9b40: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
9b50: 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61   /* First callba
9b60: 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ck argument */.)
9b70: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
9b80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9b90: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
9ba0: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
9bb0: 50 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20  PreUpdateArg;.  
9bc0: 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61  db->xPreUpdateCa
9bd0: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
9be0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  ck;.  db->pPreUp
9bf0: 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  dateArg = pArg;.
9c00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9c10: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9c20: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
9c30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
9c40: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
9c50: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
9c60: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
9c70: 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74  ion or savepoint
9c80: 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 2c 20 63  .** is opened, c
9c90: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
9ca0: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ed back..*/.void
9cb0: 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 61   *sqlite3_transa
9cc0: 63 74 69 6f 6e 5f 68 6f 6f 6b 28 0a 20 20 73 71  ction_hook(.  sq
9cd0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
9d00: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
9d10: 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29  void(*xCallback)
9d20: 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 69 6e  (void *, int, in
9d30: 74 29 2c 20 20 20 20 20 20 20 2f 2a 20 43 61 6c  t),       /* Cal
9d40: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
9d50: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d80: 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 20   First callback 
9d90: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9da0: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
9db0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9dc0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
9dd0: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 54 72 61   pRet = db->pTra
9de0: 6e 73 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72  nsArg;.  db->xTr
9df0: 61 6e 73 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ansCallback = xC
9e00: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
9e10: 54 72 61 6e 73 41 72 67 20 3d 20 70 41 72 67 3b  TransArg = pArg;
9e20: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9e30: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9e40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
9e50: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9e60: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
9e70: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  ** The sqlite3_w
9e80: 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
9e90: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
9ea0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
9eb0: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a  ocheckpoint()..*
9ec0: 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  * Invoke sqlite3
9ed0: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
9ee0: 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
9ef0: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
9f00: 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  og file.** is gr
9f10: 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74  eater than sqlit
9f20: 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20  e3.pWalArg cast 
9f30: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74  to an integer (t
9f40: 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
9f50: 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75  red by.** wal_au
9f60: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e  tocheckpoint()).
9f70: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
9f80: 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a  WalDefaultHook(.
9f90: 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44    void *pClientD
9fa0: 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75  ata,     /* Argu
9fb0: 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ment */.  sqlite
9fc0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9fd0: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a   /* Connection *
9fe0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9ff0: 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  zDb,       /* Da
a000: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
a010: 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20  nFrame          
a020: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41     /* Size of WA
a030: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46  L */.){.  if( nF
a040: 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52  rame>=SQLITE_PTR
a050: 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44  _TO_INT(pClientD
a060: 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ata) ){.    sqli
a070: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
a080: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
a090: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
a0a0: 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20  nt(db, zDb);.   
a0b0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
a0c0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20  nMalloc();.  }. 
a0d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a0e0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
a0f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
a100: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  /../*.** Configu
a110: 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61  re an sqlite3_wa
a120: 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
a130: 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  k to automatical
a140: 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a  ly checkpoint.**
a150: 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65   a database afte
a160: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
a170: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
a180: 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f  ere are nFrame o
a190: 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73  r.** more frames
a1a0: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
a1b0: 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f  . Passing zero o
a1c0: 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c  r a negative val
a1d0: 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72  ue as the.** nFr
a1e0: 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69  ame parameter di
a1f0: 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63  sables automatic
a200: 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74   checkpoints ent
a210: 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  irely..**.** The
a220: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
a230: 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
a240: 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61  ction replaces a
a250: 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c  ny existing call
a260: 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72  back.** register
a270: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
a280: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b  _wal_hook(). Lik
a290: 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69  ewise, registeri
a2a0: 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ng a callback.**
a2b0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
a2c0: 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c  al_hook() disabl
a2d0: 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  es the automatic
a2e0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68   checkpoint mech
a2f0: 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75  anism.** configu
a300: 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
a310: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
a320: 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
a330: 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
a340: 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29  *db, int nFrame)
a350: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
a360: 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45  OMIT_WAL.  UNUSE
a370: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
a380: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a390: 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c  TER(nFrame);.#el
a3a0: 73 65 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  se.  if( nFrame>
a3b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
a3c0: 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71  _wal_hook(db, sq
a3d0: 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
a3e0: 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ook, SQLITE_INT_
a3f0: 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b  TO_PTR(nFrame));
a400: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
a410: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
a420: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  b, 0, 0);.  }.#e
a430: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
a440: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a450: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
a460: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
a470: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
a480: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77  transaction is w
a490: 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74  ritten.** into t
a4a0: 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c  he write-ahead-l
a4b0: 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62  og by this datab
a4c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
a4d0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
a4e0: 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  _wal_hook(.  sql
a4f0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a510: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
a520: 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c  to this db handl
a530: 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c  e */.  int(*xCal
a540: 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73  lback)(void *, s
a550: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
a560: 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f  har*, int),.  vo
a570: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a590: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
a5a0: 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62  passed to xCallb
a5b0: 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ack() */.){.#ifn
a5c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a5d0: 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  WAL.  void *pRet
a5e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a5f0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
a600: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
a610: 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e  >pWalArg;.  db->
a620: 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78  xWalCallback = x
a630: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
a640: 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a  pWalArg = pArg;.
a650: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a660: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
a670: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
a680: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
a690: 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
a6a0: 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
a6b0: 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69  tabase zDb..*/.i
a6c0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
a6d0: 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20  heckpoint_v2(.  
a6e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
a710: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
a720: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  ar *zDb,        
a730: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
a740: 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
a750: 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  base (or NULL) *
a760: 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20  /.  int eMode,  
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48      /* SQLITE_CH
a790: 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65  ECKPOINT_* value
a7a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67   */.  int *pnLog
a7b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a7c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
a7d0: 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e  ze of WAL log in
a7e0: 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74   frames */.  int
a7f0: 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20   *pnCkpt        
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a810: 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65  OUT: Total numbe
a820: 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63  r of frames chec
a830: 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23  kpointed */.){.#
a840: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
a850: 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53  T_WAL.  return S
a860: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
a870: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
a8a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
a8b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
a8c0: 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  HED;  /* sqlite3
a8d0: 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20  .aDb[] index of 
a8e0: 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  db to checkpoint
a8f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   */..  /* Initia
a900: 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20  lize the output 
a910: 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20  variables to -1 
a920: 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
a930: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66   occurs. */.  if
a940: 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67  ( pnLog ) *pnLog
a950: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43   = -1;.  if( pnC
a960: 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20  kpt ) *pnCkpt = 
a970: 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53  -1;..  assert( S
a980: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
a990: 5f 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45  _FULL>SQLITE_CHE
a9a0: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20  CKPOINT_PASSIVE 
a9b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
a9c0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
a9d0: 55 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b  ULL<SQLITE_CHECK
a9e0: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b  POINT_RESTART );
a9f0: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
aa00: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
aa10: 53 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43  SIVE+2==SQLITE_C
aa20: 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
aa30: 54 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  T );.  if( eMode
aa40: 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  <SQLITE_CHECKPOI
aa50: 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d  NT_PASSIVE || eM
aa60: 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode>SQLITE_CHECK
aa70: 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b  POINT_RESTART ){
aa80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
aa90: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a  TE_MISUSE;.  }..
aaa0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
aab0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
aac0: 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a  ;.  if( zDb && z
aad0: 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62  Db[0] ){.    iDb
aae0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
aaf0: 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
ab00: 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29   }.  if( iDb<0 )
ab10: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ab20: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
ab30: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
ab40: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
ab50: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
ab60: 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
ab70: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
ab80: 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  te3Checkpoint(db
ab90: 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e  , iDb, eMode, pn
aba0: 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
abb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
abc0: 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20  b, rc, 0);.  }. 
abd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
abe0: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
abf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ac00: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
ac10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
ac20: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
ac30: 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
ac40: 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73  e zDb. If zDb is
ac50: 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65   NULL, or if the
ac60: 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e   buffer zDb poin
ac70: 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e  ts.** to contain
ac80: 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  s a zero-length 
ac90: 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61  string, all atta
aca0: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
acb0: 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  re .** checkpoin
acc0: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
acd0: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
ace0: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
acf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
ad00: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
ad10: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
ad20: 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51  t_v2(db, zDb, SQ
ad30: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
ad40: 50 41 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a  PASSIVE, 0, 0);.
ad50: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ad60: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
ad70: 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e   Run a checkpoin
ad80: 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44  t on database iD
ad90: 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  b. This is a no-
ada0: 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69  op if database i
adb0: 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72  Db is.** not cur
adc0: 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57  rently open in W
add0: 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  AL mode..**.** I
ade0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
adf0: 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  is open on the d
ae00: 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68  atabase being ch
ae10: 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73  eckpointed, this
ae20: 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65   .** function re
ae30: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43  turns SQLITE_LOC
ae40: 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70  KED and a checkp
ae50: 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65  oint is not atte
ae60: 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e  mpted. If .** an
ae70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
ae80: 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  ile running the 
ae90: 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53  checkpoint, an S
aea0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
aeb0: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
aec0: 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f   (i.e. SQLITE_IO
aed0: 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c  ERR). Otherwise,
aee0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
aef0: 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  * The mutex on d
af00: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
af10: 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  b should be held
af20: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
af30: 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73  The mutex.** ass
af40: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
af50: 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65   specific b-tree
af60: 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
af70: 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a  ted is taken by.
af80: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
af90: 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b   while the check
afa0: 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67  point is running
afb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69  ..**.** If iDb i
afc0: 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f  s passed SQLITE_
afd0: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68  MAX_ATTACHED, th
afe0: 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  en all attached 
aff0: 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a  databases are.**
b000: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49   checkpointed. I
b010: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
b020: 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20  countered it is 
b030: 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61  returned immedia
b040: 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74  tely -.** no att
b050: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
b060: 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72  checkpoint any r
b070: 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73  emaining databas
b080: 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  es..**.** Parame
b090: 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65  ter eMode is one
b0a0: 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   of SQLITE_CHECK
b0b0: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46  POINT_PASSIVE, F
b0c0: 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a  ULL or RESTART..
b0d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
b0e0: 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
b0f0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
b100: 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70  nt eMode, int *p
b110: 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70  nLog, int *pnCkp
b120: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
b130: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
b140: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
b150: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  code */.  int i;
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
b180: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
b190: 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62  ough attached db
b1a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79  s */.  int bBusy
b1b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b1c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
b1d0: 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61  f SQLITE_BUSY ha
b1e0: 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  s been encounter
b1f0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
b200: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b210: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
b220: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c  ;.  assert( !pnL
b230: 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31  og || *pnLog==-1
b240: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
b250: 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74  nCkpt || *pnCkpt
b260: 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69  ==-1 );..  for(i
b270: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26  =0; i<db->nDb &&
b280: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
b290: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
b2a0: 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c  =iDb || iDb==SQL
b2b0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
b2c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
b2d0: 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b  qlite3BtreeCheck
b2e0: 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d  point(db->aDb[i]
b2f0: 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c  .pBt, eMode, pnL
b300: 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
b310: 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20     pnLog = 0;.  
b320: 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a      pnCkpt = 0;.
b330: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b340: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
b350: 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a       bBusy = 1;.
b360: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
b370: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
b380: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
b390: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
b3a0: 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53  OK && bBusy) ? S
b3b0: 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b  QLITE_BUSY : rc;
b3c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b3d0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
b3e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b3f0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75  tion returns tru
b400: 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79  e if main-memory
b410: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
b420: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20  instead of.** a 
b430: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66  temporary file f
b440: 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67  or transient pag
b450: 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61  er files and sta
b460: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
b470: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
b480: 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f  turned depends o
b490: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64  n the value of d
b4a0: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72  b->temp_store (r
b4b0: 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65  untime.** parame
b4c0: 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d  ter) and the com
b4d0: 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20  pile time value 
b4e0: 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  of SQLITE_TEMP_S
b4f0: 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c  TORE. The.** fol
b500: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
b510: 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74  cribes the relat
b520: 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
b530: 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73  these two values
b540: 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e  .** and this fun
b550: 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61  ctions return va
b560: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c  lue..**.**   SQL
b570: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20  ITE_TEMP_STORE  
b580: 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72     db->temp_stor
b590: 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f  e     Location o
b5a0: 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  f temporary data
b5b0: 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  base.**   ------
b5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
b5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
b5e0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
b5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b600: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
b640: 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
b670: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
b680: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20  turn 0).**   1  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
b6b0: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
b6c0: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
b6d0: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
b6e0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
b6f0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
b700: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
b710: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
b720: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
b730: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
b740: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
b750: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
b760: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
b780: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
b790: 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   1).**   2      
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
b7d0: 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20  urn 1).**   3   
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
b800: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
b810: 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74  return 1).*/.int
b820: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
b830: 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74  mory(const sqlit
b840: 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c  e3 *db){.#if SQL
b850: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
b860: 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  1.  return ( db-
b870: 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29  >temp_store==2 )
b880: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
b890: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
b8a0: 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d  2.  return ( db-
b8b0: 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29  >temp_store!=1 )
b8c0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
b8d0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
b8e0: 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  3.  return 1;.#e
b8f0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
b900: 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20  TEMP_STORE<1 || 
b910: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
b920: 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  E>3.  return 0;.
b930: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
b940: 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63  Return UTF-8 enc
b950: 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
b960: 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
b970: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
b980: 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
b990: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
b9a0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c  lite3_errmsg(sql
b9b0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e  ite3 *db){.  con
b9c0: 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  st char *z;.  if
b9d0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
b9e0: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
b9f0: 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
ba00: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
ba10: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
ba20: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
ba30: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
ba40: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49  ErrStr(SQLITE_MI
ba50: 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a  SUSE_BKPT);.  }.
ba60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ba70: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
ba80: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
ba90: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
baa0: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
bab0: 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
bac0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
bad0: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
bae0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e  _value_text(db->
baf0: 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72  pErr);.    asser
bb00: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
bb10: 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
bb20: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z==0 ){.      z 
bb30: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
bb40: 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20  db->errCode);.  
bb50: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
bb60: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
bb70: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
bb80: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
bb90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
bba0: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  16./*.** Return 
bbb0: 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45  UTF-16 encoded E
bbc0: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
bbd0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
bbe0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
bbf0: 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
bc00: 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  t void *sqlite3_
bc10: 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33  errmsg16(sqlite3
bc20: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
bc30: 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d  const u16 outOfM
bc40: 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27  em[] = {.    'o'
bc50: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
bc60: 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
bc70: 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27  'm', 'e', 'm', '
bc80: 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a  o', 'r', 'y', 0.
bc90: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
bca0: 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d  nst u16 misuse[]
bcb0: 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69   = {.    'l', 'i
bcc0: 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27  ', 'b', 'r', 'a'
bcd0: 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c  , 'r', 'y', ' ',
bce0: 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20   .    'r', 'o', 
bcf0: 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27  'u', 't', 'i', '
bd00: 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20  n', 'e', ' ', . 
bd10: 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27     'c', 'a', 'l'
bd20: 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c  , 'l', 'e', 'd',
bd30: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
bd40: 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a  'u', 't', ' ', .
bd50: 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20      'o', 'f', ' 
bd60: 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27  ', .    's', 'e'
bd70: 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c  , 'q', 'u', 'e',
bd80: 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20   'n', 'c', 'e', 
bd90: 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20  0.  };..  const 
bda0: 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21  void *z;.  if( !
bdb0: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
bdc0: 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
bdd0: 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  m;.  }.  if( !sq
bde0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
bdf0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
be00: 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
be10: 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20   *)misuse;.  }. 
be20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
be30: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
be40: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
be50: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
be60: 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66   = (void *)outOf
be70: 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Mem;.  }else{.  
be80: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
be90: 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
bea0: 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  Err);.    if( z=
beb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
bec0: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
bed0: 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c  b->pErr, -1, sql
bee0: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
bef0: 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20  rrCode),.       
bf00: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
bf10: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
bf20: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
bf30: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
bf40: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d  db->pErr);.    }
bf50: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  .    /* A malloc
bf60: 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c  () may have fail
bf70: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
bf80: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ll to sqlite3_va
bf90: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20  lue_text16().   
bfa0: 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68   ** above. If th
bfb0: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
bfc0: 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c  then the db->mal
bfd0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e  locFailed flag n
bfe0: 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
bff0: 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
c000: 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74   returning. Do t
c010: 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  his directly, in
c020: 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20  stead of via.   
c030: 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78   ** sqlite3ApiEx
c040: 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73  it(), to avoid s
c050: 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  etting the datab
c060: 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  ase handle error
c070: 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f   message..    */
c080: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
c090: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  ailed = 0;.  }. 
c0a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
c0b0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
c0c0: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
c0d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
c0e0: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
c0f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c100: 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
c110: 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  r code generated
c120: 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f   by an SQLite ro
c130: 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69  utine. If NULL i
c140: 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74  s.** passed to t
c150: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65  his function, we
c160: 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63   assume a malloc
c170: 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67  () failed during
c180: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
c190: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
c1a0: 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
c1b0: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
c1c0: 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
c1d0: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
c1e0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
c1f0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
c200: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
c210: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
c220: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
c230: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
c250: 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
c260: 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
c270: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
c280: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
c290: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
c2a0: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
c2b0: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
c2c0: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
c2d0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
c2e0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
c2f0: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
c300: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
c310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c320: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
c330: 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a  db->errCode;.}..
c340: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
c350: 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ew collating fun
c360: 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61  ction for databa
c370: 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61  se "db".  The na
c380: 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61  me is zName.** a
c390: 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  nd the encoding 
c3a0: 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69  is enc..*/.stati
c3b0: 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c  c int createColl
c3c0: 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
c3d0: 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  * db,.  const ch
c3e0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38  ar *zName, .  u8
c3f0: 20 65 6e 63 2c 0a 20 20 75 38 20 63 6f 6c 6c 54   enc,.  u8 collT
c400: 79 70 65 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74  ype,.  void* pCt
c410: 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
c420: 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
c430: 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
c440: 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
c450: 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
c460: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
c470: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32  Coll;.  int enc2
c480: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  ;.  int nName = 
c490: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c4a0: 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73  zName);.  .  ass
c4b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c4c0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
c4d0: 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  x) );..  /* If S
c4e0: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
c4f0: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
c500: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
c510: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
c520: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
c530: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
c540: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
c550: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
c560: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
c570: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
c580: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
c590: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
c5a0: 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20  .  enc2 = enc;. 
c5b0: 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
c5c0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b  =SQLITE_UTF16 );
c5d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
c5e0: 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
c5f0: 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28  ALIGNED );.  if(
c600: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
c610: 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c  F16 || enc2==SQL
c620: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
c630: 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20  D ){.    enc2 = 
c640: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
c650: 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e  VE;.  }.  if( en
c660: 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c2<SQLITE_UTF8 |
c670: 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54  | enc2>SQLITE_UT
c680: 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74  F16BE ){.    ret
c690: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
c6a0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BKPT;.  }..  /
c6b0: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
c6c0: 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67  call is removing
c6d0: 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e   or replacing an
c6e0: 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74   existing collat
c6f0: 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e  ion .  ** sequen
c700: 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74  ce. If so, and t
c710: 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
c720: 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79  VMs, return busy
c730: 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  . If there.  ** 
c740: 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d  are no active VM
c750: 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  s, invalidate an
c760: 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73  y pre-compiled s
c770: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
c780: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
c790: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
c7a0: 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
c7b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 0);.  if( pCol
c7c0: 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l && pColl->xCmp
c7d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
c7e0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b  activeVdbeCnt ){
c7f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
c800: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
c810: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
c820: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
c830: 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e  modify collation
c840: 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f   sequence due to
c850: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
c860: 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ts");.      retu
c870: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
c880: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c890: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
c8a0: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a  tatements(db);..
c8b0: 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74      /* If collat
c8c0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
c8d0: 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64  ll was created d
c8e0: 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c  irectly by a cal
c8f0: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
c900: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
c910: 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65  tion, and not ge
c920: 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68  nerated by synth
c930: 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a  CollSeq(),.    *
c940: 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65  * then any copie
c950: 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43  s made by synthC
c960: 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f  ollSeq() need to
c970: 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e   be invalidated.
c980: 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f  .    ** Also, co
c990: 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74  llation destruct
c9a0: 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65  or - CollSeq.xDe
c9b0: 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d  l() - function m
c9c0: 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  ay need.    ** t
c9d0: 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20  o be called..   
c9e0: 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43   */ .    if( (pC
c9f0: 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49  oll->enc & ~SQLI
ca00: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
ca10: 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20  )==enc2 ){.     
ca20: 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20   CollSeq *aColl 
ca30: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
ca40: 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c  d(&db->aCollSeq,
ca50: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a   zName, nName);.
ca60: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
ca70: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
ca80: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
ca90: 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f  ollSeq *p = &aCo
caa0: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
cab0: 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  f( p->enc==pColl
cac0: 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  ->enc ){.       
cad0: 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29     if( p->xDel )
cae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
caf0: 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b  >xDel(p->pUser);
cb00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
cb10: 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d         p->xCmp =
cb20: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
cb30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
cb40: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
cb50: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
cb60: 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
cb70: 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 1);.  if( pCo
cb80: 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
cb90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
cba0: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f  Coll->xCmp = xCo
cbb0: 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  mpare;.  pColl->
cbc0: 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20  pUser = pCtx;.  
cbd0: 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44  pColl->xDel = xD
cbe0: 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63  el;.  pColl->enc
cbf0: 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28   = (u8)(enc2 | (
cc00: 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46  enc & SQLITE_UTF
cc10: 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20  16_ALIGNED));.  
cc20: 70 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 63 6f  pColl->type = co
cc30: 6c 6c 54 79 70 65 3b 0a 20 20 73 71 6c 69 74 65  llType;.  sqlite
cc40: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
cc50: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75  E_OK, 0);.  retu
cc60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
cc70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
cc80: 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
cc90: 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
cca0: 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
ccb0: 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
ccc0: 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
ccd0: 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
cce0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
ccf0: 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
cd00: 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
cd10: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
cd20: 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
cd30: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
cd40: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
cd50: 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
cd60: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
cd70: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
cd80: 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
cd90: 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
cda0: 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
cdb0: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
cdc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
cdd0: 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
cde0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
cdf0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
ce00: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
ce10: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
ce20: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a  ARIABLE_NUMBER,.
ce30: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49    SQLITE_MAX_TRI
ce40: 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a  GGER_DEPTH,.};..
ce50: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
ce60: 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
ce70: 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
ce80: 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
ce90: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
cea0: 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
ceb0: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
cec0: 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
ced0: 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
cee0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
cef0: 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
cf00: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
cf10: 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
cf20: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
cf30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
cf40: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
cf50: 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
cf60: 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
cf70: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
cf80: 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
cf90: 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
cfa0: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
cfb0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
cfc0: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
cfd0: 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
cfe0: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
cff0: 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
d000: 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
d010: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d020: 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
d030: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
d040: 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
d050: 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
d060: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d070: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
d080: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
d090: 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a  NCTION_ARG>1000.
d0a0: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
d0b0: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
d0c0: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
d0d0: 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69  0 and 1000.#endi
d0e0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d0f0: 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
d100: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
d110: 45 44 3e 33 30 0a 23 20 65 72 72 6f 72 20 53 51  ED>30.# error SQ
d120: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
d130: 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
d140: 6e 20 30 20 61 6e 64 20 33 30 0a 23 65 6e 64 69  n 0 and 30.#endi
d150: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
d160: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
d170: 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  NGTH<1.# error S
d180: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
d190: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75  ATTERN_LENGTH mu
d1a0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
d1b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
d1c0: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32  TE_MAX_COLUMN>32
d1d0: 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  767.# error SQLI
d1e0: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75  TE_MAX_COLUMN mu
d1f0: 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32  st not exceed 32
d200: 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  767.#endif.#if S
d210: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
d220: 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f  R_DEPTH<1.# erro
d230: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  r SQLITE_MAX_TRI
d240: 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20  GGER_DEPTH must 
d250: 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
d260: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
d270: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
d280: 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72   a limit.  Repor
d290: 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e  t the old value.
d2a0: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69  .** If an invali
d2b0: 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73  d limit index is
d2c0: 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72   supplied, repor
d2d0: 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  t -1..** Make no
d2e0: 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69   changes but sti
d2f0: 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c  ll report the ol
d300: 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a  d value if the.*
d310: 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e  * new limit is n
d320: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41  egative..**.** A
d330: 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74   new lower limit
d340: 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b   does not shrink
d350: 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72   existing constr
d360: 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65  ucts..** It mere
d370: 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20  ly prevents new 
d380: 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20  constructs that 
d390: 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74  exceed the limit
d3a0: 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67  .** from forming
d3b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d3c0: 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  _limit(sqlite3 *
d3d0: 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c  db, int limitId,
d3e0: 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a   int newLimit){.
d3f0: 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a    int oldLimit;.
d400: 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
d410: 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
d420: 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
d430: 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
d440: 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
d450: 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
d460: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
d470: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
d480: 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
d490: 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
d4a0: 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
d4b0: 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
d4c0: 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
d4d0: 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
d4e0: 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
d4f0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
d500: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d510: 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
d520: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
d530: 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
d540: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d550: 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
d560: 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
d570: 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
d580: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
d590: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
d5a0: 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
d5b0: 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
d5c0: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
d5d0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
d5e0: 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
d5f0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
d600: 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
d610: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d620: 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
d630: 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
d640: 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
d650: 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
d660: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d670: 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
d680: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
d690: 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
d6a0: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
d6b0: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
d6c0: 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
d6d0: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
d6e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
d6f0: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d700: 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
d710: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
d720: 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
d730: 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
d740: 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
d750: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
d760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
d7a0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
d7b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
d7c0: 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
d7d0: 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
d7e0: 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
d7f0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
d800: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
d810: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d820: 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
d830: 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
d840: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
d850: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
d860: 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
d870: 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e  DEPTH==(SQLITE_N
d880: 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
d890: 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
d8a0: 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
d8b0: 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
d8c0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
d8d0: 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
d8e0: 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
d8f0: 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
d900: 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
d910: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
d920: 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
d930: 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
d940: 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
d950: 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
d960: 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
d970: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
d980: 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
d990: 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
d9a0: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
d9b0: 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
d9c0: 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
d9d0: 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9f0: 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
da00: 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
da10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
da20: 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f  es the work of o
da30: 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73  pening a databas
da40: 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a  e on behalf of.*
da50: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
da60: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65   and sqlite3_ope
da70: 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62  n16(). The datab
da80: 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46  ase filename "zF
da90: 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73  ilename"  .** is
daa0: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a   UTF-8 encoded..
dab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
dac0: 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f  enDatabase(.  co
dad0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
dae0: 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65  ame, /* Database
daf0: 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20   filename UTF-8 
db00: 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c  encoded */.  sql
db10: 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
db20: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
db30: 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61  rned database ha
db40: 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ndle */.  unsign
db50: 65 64 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  ed flags,       
db60: 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20   /* Operational 
db70: 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
db80: 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
db90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
dba0: 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29   VFS to use */.)
dbb0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
dbc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
dbd0: 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 0a 0a   isThreadsafe;..
dbe0: 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
dbf0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dc00: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
dc10: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
dc20: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
dc30: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
dc40: 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61  dif..  /* Only a
dc50: 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f  llow sensible co
dc60: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69  mbinations of bi
dc70: 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  ts in the flags 
dc80: 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a  argument.  .  **
dc90: 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
dca0: 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65  if any non-sense
dcb0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20   combination is 
dcc0: 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a  used.  If we.  *
dcd0: 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69  * do not block i
dce0: 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69  llegal combinati
dcf0: 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75  ons here, it cou
dd00: 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20  ld trigger.  ** 
dd10: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
dd20: 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61  nts in deeper la
dd30: 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20  yers.  Sensible 
dd40: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a  combinations.  *
dd50: 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  * are:.  **.  **
dd60: 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    1:  SQLITE_OPE
dd70: 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  N_READONLY.  ** 
dd80: 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   2:  SQLITE_OPEN
dd90: 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20  _READWRITE.  ** 
dda0: 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   6:  SQLITE_OPEN
ddb0: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
ddc0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
ddd0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53    */.  assert( S
dde0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
ddf0: 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
de00: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
de10: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
de20: 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
de30: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
de40: 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
de50: 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
de60: 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
de70: 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
de80: 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
de90: 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
dea0: 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
deb0: 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
dec0: 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
ded0: 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
dee0: 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
def0: 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
df00: 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
df10: 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65 74  & 0x46)==0 ) ret
df20: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
df30: 45 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  E;..  if( sqlite
df40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
df50: 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  oreMutex==0 ){. 
df60: 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
df70: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
df80: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
df90: 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a  OPEN_NOMUTEX ){.
dfa0: 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
dfb0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
dfc0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
dfd0: 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
dfe0: 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
dff0: 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  afe = 1;.  }else
e000: 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
e010: 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  fe = sqlite3Glob
e020: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
e030: 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  tex;.  }.  if( f
e040: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e050: 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
e060: 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ){.    flags &= 
e070: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41  ~SQLITE_OPEN_SHA
e080: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73  REDCACHE;.  }els
e090: 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
e0a0: 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
e0b0: 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
e0c0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
e0d0: 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
e0e0: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ACHE;.  }..  /* 
e0f0: 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62  Remove harmful b
e100: 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61  its from the fla
e110: 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  gs parameter.  *
e120: 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54  *.  ** The SQLIT
e130: 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61  E_OPEN_NOMUTEX a
e140: 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  nd SQLITE_OPEN_F
e150: 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77  ULLMUTEX flags w
e160: 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77  ere.  ** dealt w
e170: 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69  ith in the previ
e180: 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20  ous code block. 
e190: 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20   Besides these, 
e1a0: 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61  the only.  ** va
e1b0: 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20  lid input flags 
e1c0: 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  for sqlite3_open
e1d0: 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45  _v2() are SQLITE
e1e0: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a  _OPEN_READONLY,.
e1f0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
e200: 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49  _READWRITE, SQLI
e210: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
e220: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
e230: 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51  EDCACHE,.  ** SQ
e240: 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
e250: 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65  ECACHE, and some
e260: 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20   reserved bits. 
e270: 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20   Silently mask. 
e280: 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65   ** off all othe
e290: 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20  r flags..  */.  
e2a0: 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c  flags &=  ~( SQL
e2b0: 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
e2c0: 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
e2d0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
e2e0: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
e300: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
e310: 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
e320: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
e330: 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
e340: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
e350: 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
e360: 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
e370: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
e380: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
e390: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e3a0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
e3b0: 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
e3c0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
e3d0: 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
e3e0: 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
e3f0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
e400: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
e410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e420: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
e430: 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
e440: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
e450: 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20  _FULLMUTEX |.   
e460: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e470: 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20  TE_OPEN_WAL.    
e480: 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f           );..  /
e490: 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
e4a0: 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63  qlite data struc
e4b0: 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73  ture */.  db = s
e4c0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
e4d0: 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ( sizeof(sqlite3
e4e0: 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  ) );.  if( db==0
e4f0: 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f   ) goto opendb_o
e500: 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65  ut;.  if( isThre
e510: 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62  adsafe ){.    db
e520: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
e530: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
e540: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
e550: 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
e560: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
e570: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e580: 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20  db);.      db = 
e590: 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  0;.      goto op
e5a0: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
e5b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
e5c0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e5d0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
e5e0: 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62  ask = 0xff;.  db
e5f0: 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d  ->nDb = 2;.  db-
e600: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
e610: 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62  MAGIC_BUSY;.  db
e620: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
e630: 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74  tatic;..  assert
e640: 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  ( sizeof(db->aLi
e650: 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61  mit)==sizeof(aHa
e660: 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65  rdLimit) );.  me
e670: 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c  mcpy(db->aLimit,
e680: 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a   aHardLimit, siz
e690: 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29  eof(db->aLimit))
e6a0: 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
e6b0: 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65  it = 1;.  db->ne
e6c0: 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a  xtAutovac = -1;.
e6d0: 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69    db->nextPagesi
e6e0: 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c  ze = 0;.  db->fl
e6f0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
e700: 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51  ortColNames | SQ
e710: 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23  LITE_AutoIndex.#
e720: 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
e730: 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a  T_FILE_FORMAT<4.
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   | SQLITE_Legacy
e760: 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23  FileFmt.#endif.#
e770: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e780: 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
e790: 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
e7a0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61      | SQLITE_Loa
e7b0: 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69  dExtension.#endi
e7c0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
e7d0: 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54  AULT_RECURSIVE_T
e7e0: 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20  RIGGERS.        
e7f0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
e800: 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65  E_RecTriggers.#e
e810: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
e820: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
e830: 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26  FOREIGN_KEYS) &&
e840: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
e850: 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20  FOREIGN_KEYS.   
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
e870: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
e880: 79 73 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ys.#endif.      
e890: 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ;.  sqlite3HashI
e8a0: 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  nit(&db->aCollSe
e8b0: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
e8c0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
e8d0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61  ABLE.  sqlite3Ha
e8e0: 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64  shInit(&db->aMod
e8f0: 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ule);.#endif..  
e900: 64 62 2d 3e 70 56 66 73 20 3d 20 73 71 6c 69 74  db->pVfs = sqlit
e910: 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73  e3_vfs_find(zVfs
e920: 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56  );.  if( !db->pV
e930: 66 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  fs ){.    rc = S
e940: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
e950: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
e960: 2c 20 72 63 2c 20 22 6e 6f 20 73 75 63 68 20 76  , rc, "no such v
e970: 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a  fs: %s", zVfs);.
e980: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
e990: 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  out;.  }..  /* A
e9a0: 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
e9b0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
e9c0: 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
e9d0: 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
e9e0: 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
e9f0: 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
ea00: 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
ea10: 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
ea20: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
ea30: 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
ea40: 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
ea50: 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
ea60: 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
ea70: 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65  lure..  */.  cre
ea80: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
ea90: 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
eaa0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 43  E_UTF8, SQLITE_C
eab0: 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20  OLL_BINARY, 0,. 
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
eae0: 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
eaf0: 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
eb00: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
eb10: 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49  , SQLITE_COLL_BI
eb20: 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20  NARY, 0,.       
eb30: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f             binCo
eb40: 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
eb50: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
eb60: 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
eb70: 54 45 5f 55 54 46 31 36 4c 45 2c 20 53 51 4c 49  TE_UTF16LE, SQLI
eb80: 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20  TE_COLL_BINARY, 
eb90: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
eba0: 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63       binCollFunc
ebb0: 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
ebc0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52  llation(db, "RTR
ebd0: 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  IM", SQLITE_UTF8
ebe0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53  , SQLITE_COLL_US
ebf0: 45 52 2c 20 28 76 6f 69 64 2a 29 31 2c 0a 20 20  ER, (void*)1,.  
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
ec20: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
ec30: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
ec40: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
ec50: 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43    }.  db->pDfltC
ec60: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
ec70: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c  dCollSeq(db, SQL
ec80: 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52  ITE_UTF8, "BINAR
ec90: 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  Y", 0);.  assert
eca0: 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21  ( db->pDfltColl!
ecb0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  =0 );..  /* Also
ecc0: 20 61 64 64 20 61 20 55 54 46 2d 38 20 63 61 73   add a UTF-8 cas
ecd0: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f  e-insensitive co
ece0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
ecf0: 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c  . */.  createCol
ed00: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41  lation(db, "NOCA
ed10: 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  SE", SQLITE_UTF8
ed20: 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f  , SQLITE_COLL_NO
ed30: 43 41 53 45 2c 20 30 2c 0a 20 20 20 20 20 20 20  CASE, 0,.       
ed40: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 63 61 73             nocas
ed50: 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20  eCollatingFunc, 
ed60: 30 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  0);..  /* Open t
ed70: 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62  he backend datab
ed80: 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20  ase driver */.  
ed90: 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  db->openFlags = 
eda0: 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71  flags;.  rc = sq
edb0: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 7a  lite3BtreeOpen(z
edc0: 46 69 6c 65 6e 61 6d 65 2c 20 64 62 2c 20 26 64  Filename, db, &d
edd0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
ede0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
edf0: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
ee00: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
ee10: 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
ee20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ee30: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ee40: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
ee50: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
ee60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
ee70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ee80: 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  (db, rc, 0);.   
ee90: 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
eea0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b  ;.  }.  db->aDb[
eeb0: 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  0].pSchema = sql
eec0: 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
eed0: 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  , db->aDb[0].pBt
eee0: 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
eef0: 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
ef00: 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
ef10: 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  );...  /* The de
ef20: 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76  fault safety_lev
ef30: 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  el for the main 
ef40: 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c  database is 'ful
ef50: 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70  l'; for the temp
ef60: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69  .  ** database i
ef70: 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69  t is 'NONE'. Thi
ef80: 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  s matches the pa
ef90: 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c  ger layer defaul
efa0: 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ts.  .  */.  db-
efb0: 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[0].zName = 
efc0: 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44  "main";.  db->aD
efd0: 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[0].safety_leve
efe0: 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62  l = 3;.  db->aDb
eff0: 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
f000: 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
f010: 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
f020: 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  1;..  db->magic 
f030: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
f040: 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
f050: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f060: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
f070: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
f080: 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
f090: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
f0a0: 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
f0b0: 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
f0c0: 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
f0d0: 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
f0e0: 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
f0f0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
f100: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
f110: 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
f120: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
f130: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
f140: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
f150: 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74  sterBuiltinFunct
f160: 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ions(db);..  /* 
f170: 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65  Load automatic e
f180: 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65  xtensions - exte
f190: 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  nsions that have
f1a0: 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
f1b0: 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
f1c0: 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69  sqlite3_automati
f1d0: 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50  c_extension() AP
f1e0: 49 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  I..  */.  sqlite
f1f0: 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69  3AutoLoadExtensi
f200: 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  ons(db);.  rc = 
f210: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
f220: 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  db);.  if( rc!=S
f230: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f240: 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
f250: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
f260: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
f270: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
f280: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
f290: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
f2a0: 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
f2b0: 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
f2c0: 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
f2d0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
f2e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f2f0: 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
f300: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f310: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
f320: 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
f330: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
f340: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
f350: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
f360: 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
f370: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
f380: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
f390: 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S3.  if( !db->ma
f3a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
f3b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f3c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
f3d0: 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
f3e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
f3f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
f400: 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
f410: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
f420: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
f440: 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
f450: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
f460: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
f470: 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
f480: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
f490: 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
f4a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
f4b0: 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
f4c0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
f4d0: 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
f4e0: 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  );..  /* -DSQLIT
f4f0: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
f500: 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
f510: 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
f520: 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
f530: 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
f540: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
f550: 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
f560: 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
f570: 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
f580: 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
f590: 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
f5a0: 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
f5b0: 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
f5c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
f5d0: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
f5e0: 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
f5f0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
f600: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
f610: 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
f620: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
f630: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
f640: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f670: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
f680: 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
f690: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20    /* Enable the 
f6a0: 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63  lookaside-malloc
f6b0: 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20   subsystem */.  
f6c0: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
f6d0: 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f  b, 0, sqlite3Glo
f6e0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
f6f0: 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  aside,.         
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
f710: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
f720: 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a  ig.nLookaside);.
f730: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  .  sqlite3_wal_a
f740: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
f750: 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
f760: 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
f770: 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75  INT);..opendb_ou
f780: 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  t:.  if( db ){. 
f790: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
f7a0: 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72  utex!=0 || isThr
f7b0: 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71  eadsafe==0 || sq
f7c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
f7d0: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20  g.bFullMutex==0 
f7e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
f7f0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f800: 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20  utex);.  }.  rc 
f810: 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
f820: 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d  e(db);.  if( rc=
f830: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
f840: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
f850: 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
f860: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
f870: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f880: 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
f890: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
f8a0: 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20  CK;.  }.  *ppDb 
f8b0: 3d 20 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 73  = db;.  return s
f8c0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
f8d0: 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f   rc);.}../*.** O
f8e0: 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
f8f0: 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
f900: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a  t sqlite3_open(.
f910: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
f920: 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
f930: 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20  te3 **ppDb .){. 
f940: 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
f950: 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  base(zFilename, 
f960: 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
f970: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
f980: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
f990: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
f9a0: 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e  CREATE, 0);.}.in
f9b0: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  t sqlite3_open_v
f9c0: 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2(.  const char 
f9d0: 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  *filename,   /* 
f9e0: 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
f9f0: 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
fa00: 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
fa10: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
fa20: 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20  QLite db handle 
fa30: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fa50: 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  Flags */.  const
fa60: 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
fa70: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46     /* Name of VF
fa80: 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20  S module to use 
fa90: 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  */.){.  return o
faa0: 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65  penDatabase(file
fab0: 6e 61 6d 65 2c 20 70 70 44 62 2c 20 66 6c 61 67  name, ppDb, flag
fac0: 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
fad0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fae0: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
faf0: 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
fb00: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
fb10: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
fb20: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
fb30: 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
fb40: 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
fb50: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
fb60: 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
fb70: 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
fb80: 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
fb90: 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
fba0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
fbb0: 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
fbc0: 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
fbd0: 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  me );.  assert( 
fbe0: 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20  ppDb );.  *ppDb 
fbf0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
fc00: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
fc10: 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
fc20: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
fc30: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
fc40: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56   rc;.#endif.  pV
fc50: 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
fc60: 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
fc70: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
fc80: 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
fc90: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
fca0: 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
fcb0: 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
fcc0: 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
fcd0: 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
fce0: 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
fcf0: 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
fd00: 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
fd10: 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
fd20: 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
fd40: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
fd50: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
fd60: 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
fd70: 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
fd80: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
fd90: 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
fda0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
fdb0: 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
fdc0: 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
fdd0: 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
fde0: 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53    ENC(*ppDb) = S
fdf0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
fe00: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
fe10: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
fe20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
fe30: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
fe40: 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
fe50: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
fe60: 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
fe70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
fe80: 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
fe90: 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
fea0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
feb0: 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
fec0: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
fed0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
fee0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
fef0: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
ff00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
ff10: 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
ff20: 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
ff30: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
ff40: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
ff50: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
ff60: 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
ff70: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
ff80: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ff90: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
ffa0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
ffb0: 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
ffc0: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
ffd0: 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
ffe0: 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45   SQLITE_COLL_USE
fff0: 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  R, pCtx, xCompar
10000 65 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  e, 0);.  rc = sq
10010 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
10020 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
10030 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10040 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10050 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
10060 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
10070 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
10080 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
10090 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
100a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
100b0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
100c0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
100d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
100e0 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
100f0 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
10100 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
10110 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
10120 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
10130 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
10140 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
10150 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
10160 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10170 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10180 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
10190 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
101a0 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
101b0 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
101c0 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43  u8)enc, SQLITE_C
101d0 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c 20  OLL_USER, pCtx, 
101e0 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
101f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
10200 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
10210 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10220 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
10230 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10240 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10250 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
10260 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
10270 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
10280 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
10290 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
102a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
102b0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
102c0 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
102d0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  b, .  const void
102e0 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65   *zName,.  int e
102f0 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
10300 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
10310 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
10320 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
10330 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
10340 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10350 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  OK;.  char *zNam
10360 65 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e8;.  sqlite3_mu
10370 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10380 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
10390 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
103a0 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20  d );.  zName8 = 
103b0 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
103c0 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
103d0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
103e0 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  E);.  if( zName8
103f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
10400 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
10410 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63   zName8, (u8)enc
10420 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53  , SQLITE_COLL_US
10430 45 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  ER, pCtx, xCompa
10440 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
10450 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
10460 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
10470 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
10480 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
10490 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
104a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
104b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
104c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
104d0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
104e0 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
104f0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
10500 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
10510 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
10520 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
10530 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
10540 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
10550 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
10560 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
10570 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
10580 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
10590 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
105a0 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
105b0 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
105c0 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
105d0 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
105e0 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
105f0 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ar*).){.  sqlite
10600 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10610 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
10620 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
10630 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
10640 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
10650 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
10660 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
10670 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
10680 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10690 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
106a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
106b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
106c0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
106d0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
106e0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
106f0 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
10700 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
10710 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
10720 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
10730 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
10740 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
10750 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
10760 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
10770 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
10780 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
10790 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
107a0 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
107b0 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
107c0 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
107d0 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
107e0 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
107f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10800 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10810 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
10820 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43  ed = 0;.  db->xC
10830 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43  ollNeeded16 = xC
10840 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64  ollNeeded16;.  d
10850 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
10860 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
10870 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
10880 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10890 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
108a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
108b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
108c0 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e  T_UTF16 */..#ifn
108d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
108e0 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
108f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
10900 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
10910 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
10920 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
10930 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
10940 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
10950 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
10960 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
10970 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
10980 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
10990 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
109a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
109b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
109c0 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
109d0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
109e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
109f0 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
10a00 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
10a10 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
10a20 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
10a30 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
10a40 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
10a50 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
10a60 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
10a70 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
10a80 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
10a90 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
10aa0 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
10ab0 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a  ROLLBACK..**.***
10ac0 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20  **** THIS IS AN 
10ad0 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50 49  EXPERIMENTAL API
10ae0 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54 20   AND IS SUBJECT 
10af0 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a  TO CHANGE ******
10b00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
10b10 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
10b20 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
10b30 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
10b40 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
10b50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
10b60 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69 74  tines are subtit
10b70 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e  utes for constan
10b80 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ts SQLITE_CORRUP
10b90 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  T,.** SQLITE_MIS
10ba0 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  USE, SQLITE_CANT
10bb0 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45  OPEN, SQLITE_IOE
10bc0 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  RR and possibly 
10bd0 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
10be0 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20  onstants.  They 
10bf0 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70 6f  server two purpo
10c00 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
10c10 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
10c20 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
10c30 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
10c40 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
10c50 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
10c60 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
10c70 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
10c80 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
10c90 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
10ca0 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
10cb0 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
10cc0 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
10cd0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
10ce0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
10cf0 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
10d00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
10d10 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
10d20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
10d30 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
10d40 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
10d50 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
10d60 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  g(SQLITE_CORRUPT
10d70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10d80 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
10d90 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20  tion at line %d 
10da0 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
10db0 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
10dc0 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
10dd0 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
10de0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10df0 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  PT;.}.int sqlite
10e00 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74  3MisuseError(int
10e10 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
10e20 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
10e30 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
10e40 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
10e50 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  og(SQLITE_MISUSE
10e60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10e70 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65   "misuse at line
10e80 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
10e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
10ea0 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
10eb0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
10ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10ed0 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c  ISUSE;.}.int sql
10ee0 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f  ite3CantopenErro
10ef0 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
10f00 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
10f10 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
10f20 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
10f30 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
10f40 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20  ANTOPEN, .      
10f50 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
10f60 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e  open file at lin
10f70 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
10f80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10f90 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
10fa0 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
10fb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10fc0 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69  CANTOPEN;.}...#i
10fd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10fe0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
10ff0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
11000 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
11010 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
11020 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
11030 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
11040 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
11050 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
11060 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
11070 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
11080 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
11090 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
110a0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
110b0 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
110c0 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
110d0 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
110e0 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
110f0 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
11100 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
11110 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
11120 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
11130 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
11140 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
11150 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
11160 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
11170 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
11180 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
11190 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23  or details..*/.#
111a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
111b0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
111c0 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ATA.int sqlite3_
111d0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
111e0 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
111f0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
11200 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
11210 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
11220 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
11230 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
11240 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
11250 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
11260 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
11270 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
11280 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
11290 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
112a0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
112b0 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
112c0 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
112d0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
112e0 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
112f0 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
11300 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
11310 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
11320 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
11330 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
11340 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
11350 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
11360 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
11370 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
11380 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
11390 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
113a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
113b0 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
113c0 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
113d0 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
113e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
113f0 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
11400 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
11410 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
11420 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
11430 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
11440 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
11450 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
11460 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a   0;.  int iCol;.
11470 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
11480 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
11490 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
114a0 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
114b0 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
114c0 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
114d0 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
114e0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75   = 0;..  /* Ensu
114f0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
11500 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
11510 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
11520 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11530 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
11540 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
11550 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
11560 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
11570 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
11580 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
11590 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
115a0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
115b0 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
115c0 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
115d0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
115e0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
115f0 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
11600 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
11610 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
11620 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
11630 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
11640 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
11650 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
11660 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
11670 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
11680 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77  if( sqlite3IsRow
11690 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  id(zColumnName) 
116a0 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
116b0 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69  ab->iPKey;.    i
116c0 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
116d0 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
116e0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
116f0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
11700 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
11710 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
11720 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
11730 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
11740 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
11750 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
11760 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
11770 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
11780 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
11790 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
117a0 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
117b0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70  >nCol ){.      p
117c0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  Tab = 0;.      g
117d0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
117e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
117f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
11800 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
11810 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
11820 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
11830 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
11840 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
11850 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
11860 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
11870 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
11880 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
11890 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
118a0 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
118b0 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
118c0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
118d0 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
118e0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
118f0 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
11900 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
11910 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
11920 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
11930 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
11940 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
11950 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
11960 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
11970 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
11980 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
11990 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
119a0 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
119b0 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
119c0 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
119d0 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
119e0 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
119f0 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
11a00 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  e = pCol->zType;
11a10 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
11a20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20  pCol->zColl;.   
11a30 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d   notnull = pCol-
11a40 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20  >notNull!=0;.   
11a50 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 70   primarykey  = p
11a60 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d  Col->isPrimKey!=
11a70 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d  0;.    autoinc =
11a80 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43   pTab->iPKey==iC
11a90 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  ol && (pTab->tab
11aa0 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
11ab0 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20  ncrement)!=0;.  
11ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61  }else{.    zData
11ad0 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
11ae0 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
11af0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
11b00 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  !zCollSeq ){.   
11b10 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e   zCollSeq = "BIN
11b20 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72  ARY";.  }..error
11b30 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42  _out:.  sqlite3B
11b40 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
11b50 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20  ;..  /* Whether 
11b60 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  the function cal
11b70 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66  l succeeded or f
11b80 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f  ailed, set the o
11b90 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
11ba0 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65  .  ** to whateve
11bb0 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f  r their local co
11bc0 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61  unterparts conta
11bd0 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  in. If an error 
11be0 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20  did occur,.  ** 
11bf0 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66  this has the eff
11c00 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61  ect of zeroing a
11c10 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  ll output parame
11c20 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
11c30 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70   pzDataType ) *p
11c40 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74  zDataType = zDat
11c50 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43  aType;.  if( pzC
11c60 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c  ollSeq ) *pzColl
11c70 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a  Seq = zCollSeq;.
11c80 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29    if( pNotNull )
11c90 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74   *pNotNull = not
11ca0 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69  null;.  if( pPri
11cb0 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d  maryKey ) *pPrim
11cc0 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79  aryKey = primary
11cd0 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f  key;.  if( pAuto
11ce0 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20  inc ) *pAutoinc 
11cf0 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66  = autoinc;..  if
11d00 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
11d10 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
11d20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11d30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
11d40 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
11d50 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f  3MPrintf(db, "no
11d60 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75   such table colu
11d70 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62  mn: %s.%s", zTab
11d80 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  leName,.        
11d90 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20  zColumnName);.  
11da0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
11db0 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
11dc0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
11dd0 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29  (zErrMsg?"%s":0)
11de0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71  , zErrMsg);.  sq
11df0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11e00 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d  zErrMsg);.  rc =
11e10 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
11e20 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
11e30 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
11e40 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11e50 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
11e60 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
11e70 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
11e80 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
11e90 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
11ea0 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
11eb0 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29  e3_sleep(int ms)
11ec0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
11ed0 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVfs;.  int rc;
11ee0 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65  .  pVfs = sqlite
11ef0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
11f00 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72   if( pVfs==0 ) r
11f10 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54  eturn 0;..  /* T
11f20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
11f30 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e  ks in millisecon
11f40 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65  ds, but the unde
11f50 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29  rlying OsSleep()
11f60 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20   .  ** API uses 
11f70 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65  microseconds. He
11f80 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a  nce the 1000's..
11f90 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c    */.  rc = (sql
11fa0 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73  ite3OsSleep(pVfs
11fb0 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29  , 1000*ms)/1000)
11fc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11fd0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  ../*.** Enable o
11fe0 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78  r disable the ex
11ff0 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f  tended result co
12000 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  des..*/.int sqli
12010 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
12020 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65  ult_codes(sqlite
12030 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66  3 *db, int onoff
12040 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
12050 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
12060 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
12070 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66  sk = onoff ? 0xf
12080 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a  fffffff : 0xff;.
12090 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
120a0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
120b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
120c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
120d0 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43  nvoke the xFileC
120e0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e  ontrol method on
120f0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
12100 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
12110 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
12120 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  rol(sqlite3 *db,
12130 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
12140 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  Name, int op, vo
12150 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
12160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
12170 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20  OR;.  int iDb;. 
12180 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12190 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
121a0 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d  .  if( zDbName==
121b0 30 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 30  0 ){.    iDb = 0
121c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
121d0 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
121e0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
121f0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
12200 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
12210 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20  me, zDbName)==0 
12220 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
12230 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 64 62 2d   }.  if( iDb<db-
12240 3e 6e 44 62 20 29 7b 0a 20 20 20 20 42 74 72 65  >nDb ){.    Btre
12250 65 20 2a 70 42 74 72 65 65 20 3d 20 64 62 2d 3e  e *pBtree = db->
12260 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
12270 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
12280 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
12290 67 65 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ger;.      sqlit
122a0 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20  e3_file *fd;.   
122b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
122c0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
122d0 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
122e0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
122f0 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73  Btree);.      as
12300 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
12310 29 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 73 71  );.      fd = sq
12320 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
12330 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
12340 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20  sert( fd!=0 );. 
12350 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c       if( op==SQL
12360 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
12370 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
12380 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
12390 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
123a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
123b0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
123c0 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f  e if( fd->pMetho
123d0 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ds ){.        rc
123e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
123f0 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
12400 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pArg);.      }el
12410 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
12420 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
12430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12440 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12450 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d  e(pBtree);.    }
12460 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
12470 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
12480 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
12490 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rc;   .}../*.** 
124a0 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  Interface to the
124b0 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a   testing logic..
124c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
124d0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20  est_control(int 
124e0 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20  op, ...){.  int 
124f0 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rc = 0;.#ifndef 
12500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
12510 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69  TIN_TEST.  va_li
12520 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
12530 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
12540 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
12550 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74  /*.    ** Save t
12560 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
12570 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20   of the PRNG..  
12580 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
12590 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
125a0 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20  NG_SAVE: {.     
125b0 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65   sqlite3PrngSave
125c0 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
125d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
125e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f   /*.    ** Resto
125f0 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  re the state of 
12600 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20  the PRNG to the 
12610 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64  last state saved
12620 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52   using.    ** PR
12630 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e  NG_SAVE.  If PRN
12640 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72  G_SAVE has never
12650 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c   before been cal
12660 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
12670 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20   this verb acts 
12680 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e  like PRNG_RESET.
12690 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
126a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
126b0 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b  _PRNG_RESTORE: {
126c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
126d0 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29  ngRestoreState()
126e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
126f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
12700 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52   ** Reset the PR
12710 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75  NG back to its u
12720 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61  ninitialized sta
12730 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61  te.  The next ca
12740 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
12750 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
12760 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68  ) will reseed th
12770 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73  e PRNG using a s
12780 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a  ingle call.    *
12790 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d  * to the xRandom
127a0 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74  ness method of t
127b0 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a  he default VFS..
127c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
127d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
127e0 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20  PRNG_RESET: {.  
127f0 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
12800 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20 20 20  esetState();.   
12810 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12820 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
12830 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
12840 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54  trol(BITVEC_TEST
12850 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29  , size, program)
12860 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
12870 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73  un a test agains
12880 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63  t a Bitvec objec
12890 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20  t of size.  The 
128a0 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74  program argument
128b0 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72  .    ** is an ar
128c0 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
128d0 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
128e0 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d   test.  Return -
128f0 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65  1 on a.    ** me
12900 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
12910 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63  error, 0 on succ
12920 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  ess, or non-zero
12930 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
12940 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71     ** See the sq
12950 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
12960 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64  inTest() for add
12970 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
12980 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
12990 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
129a0 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
129b0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  : {.      int sz
129c0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
129d0 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  t);.      int *a
129e0 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  Prog = va_arg(ap
129f0 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72  , int*);.      r
12a00 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
12a10 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c  cBuiltinTest(sz,
12a20 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62   aProg);.      b
12a30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
12a40 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
12a50 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
12a60 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  (BENIGN_MALLOC_H
12a70 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45  OOKS, xBegin, xE
12a80 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd).    **.    *
12a90 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73  * Register hooks
12aa0 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69   to call to indi
12ab0 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f  cate which mallo
12ac0 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20  c() failures .  
12ad0 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e    ** are benign.
12ae0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
12af0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
12b00 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  _BENIGN_MALLOC_H
12b10 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79  OOKS: {.      ty
12b20 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69  pedef void (*voi
12b30 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64  d_function)(void
12b40 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  );.      void_fu
12b50 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65  nction xBenignBe
12b60 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  gin;.      void_
12b70 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
12b80 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  End;.      xBeni
12b90 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67  gnBegin = va_arg
12ba0 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
12bb0 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  on);.      xBeni
12bc0 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61  gnEnd = va_arg(a
12bd0 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
12be0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12bf0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b  BenignMallocHook
12c00 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20  s(xBenignBegin, 
12c10 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20  xBenignEnd);.   
12c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12c30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
12c40 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
12c50 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
12c60 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
12c70 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  E, unsigned int 
12c80 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
12c90 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47   Set the PENDING
12ca0 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c   byte to the val
12cb0 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ue in the argume
12cc0 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20  nt, if X>0..    
12cd0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
12ce0 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74  es if X==0.  Ret
12cf0 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
12d00 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74   the pending byt
12d10 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65  e.    ** as it e
12d20 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74  xisting before t
12d30 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
12d40 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  called..    **. 
12d50 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a     ** IMPORTANT:
12d60 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
12d70 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d  ENDING byte from
12d80 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75   0x40000000 resu
12d90 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e  lts in.    ** an
12da0 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61   incompatible da
12db0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d  tabase file form
12dc0 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68  at.  Changing th
12dd0 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20  e PENDING byte. 
12de0 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20     ** while any 
12df0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12e00 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75  ion is open resu
12e10 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64  lts in undefined
12e20 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65   and.    ** dile
12e30 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72  terious behavior
12e40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
12e50 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
12e60 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20  L_PENDING_BYTE: 
12e70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e  {.      rc = PEN
12e80 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64  DING_BYTE;.#ifnd
12e90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
12ea0 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  SD.      {.     
12eb0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
12ec0 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28  newVal = va_arg(
12ed0 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ap, unsigned int
12ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
12ef0 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50  ewVal ) sqlite3P
12f00 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77  endingByte = new
12f10 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Val;.      }.#en
12f20 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
12f30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
12f40 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
12f50 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
12f60 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
12f70 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  RT, int X).    *
12f80 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
12f90 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
12fa0 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
12fb0 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
12fc0 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  not.    ** asser
12fd0 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20  t() was enabled 
12fe0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
12ff0 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
13000 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20  nd assert().    
13010 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ** is enabled, t
13020 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
13030 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49  alue is true.  I
13040 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a  f X is true and.
13050 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
13060 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
13070 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
13080 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20  ue is zero.  If 
13090 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73  X is.    ** fals
130a0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
130b0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
130c0 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69  the assertion fi
130d0 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20  res and the.    
130e0 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74  ** process abort
130f0 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73  s.  If X is fals
13100 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
13110 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
13120 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75   the.    ** retu
13130 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
13140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
13150 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
13160 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20  L_ASSERT: {.    
13170 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78    volatile int x
13180 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
13190 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72 67 28  rt( (x = va_arg(
131a0 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20  ap,int))!=0 );. 
131b0 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20       rc = x;.   
131c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
131d0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
131e0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
131f0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
13200 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e  TCTRL_ALWAYS, in
13210 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
13220 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70  ** This action p
13230 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69  rovides a run-ti
13240 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68  me test to see h
13250 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e  ow the ALWAYS an
13260 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d  d.    ** NEVER m
13270 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e  acros were defin
13280 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
13290 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  me..    **.    *
132a0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
132b0 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e  ue is ALWAYS(X).
132c0 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
132d0 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64   The recommended
132e0 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20   test is X==2.  
132f0 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
13300 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d  lue is 2, that m
13310 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41  eans.    ** ALWA
13320 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
13330 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20   are both no-op 
13340 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
13350 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68  ros, which is th
13360 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74  e.    ** default
13370 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68   setting.  If th
13380 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
13390 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53  s 1, then ALWAYS
133a0 28 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20  () is either.   
133b0 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74   ** hard-coded t
133c0 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69  o true or else i
133d0 74 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73  t asserts if its
133e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
133f0 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  se..    ** The f
13400 69 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68  irst behavior (h
13410 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
13420 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
13430 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
13440 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
13450 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
13460 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20  t() is disabled 
13470 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  and the second. 
13480 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28     ** behavior (
13490 61 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72  assert if the ar
134a0 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53  gument to ALWAYS
134b0 28 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20  () is false) is 
134c0 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20  the case if.    
134d0 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ** SQLITE_TESTCT
134e0 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20  RL_ASSERT shows 
134f0 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73  that assert() is
13500 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a   enabled..    **
13510 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d  .    ** The run-
13520 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64  time test proced
13530 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73  ure might look s
13540 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68  omething like th
13550 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
13560 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  *    if( sqlite3
13570 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
13580 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
13590 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20  WAYS, 2)==2 ){. 
135a0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
135b0 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
135c0 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73  () are no-op pas
135d0 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73  s-through macros
135e0 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
135f0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
13600 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
13610 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
13620 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20  , 1) ){.    **  
13630 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29      // ALWAYS(x)
13640 20 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20   asserts that x 
13650 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78  is true. NEVER(x
13660 29 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66  ) asserts x is f
13670 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20  alse..    **    
13680 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20  }else{.    **   
13690 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
136a0 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e  is a constant 1.
136b0 20 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20    NEVER(x) is a 
136c0 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20  constant 0..    
136d0 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20  **    }.    */. 
136e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
136f0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20  ESTCTRL_ALWAYS: 
13700 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
13710 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
13720 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59        rc = ALWAY
13730 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  S(x);.      brea
13740 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
13750 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
13760 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
13770 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
13780 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
13790 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
137a0 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65  ** Set the nRese
137b0 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f  rve size to N fo
137c0 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
137d0 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ase on the datab
137e0 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65  ase.    ** conne
137f0 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f  ction db..    */
13800 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
13810 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
13820 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
13830 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
13840 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
13850 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f       int x = va_
13860 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
13870 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13880 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
13890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
138a0 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
138b0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  (db->aDb[0].pBt,
138c0 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20   0, x, 0);.     
138d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
138e0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
138f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13900 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
13910 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
13920 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
13930 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
13940 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e   sqlite3 *db, in
13950 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t N).    **.    
13960 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
13970 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74  able various opt
13980 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74  imizations for t
13990 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  esting purposes.
139a0 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72    The .    ** ar
139b0 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69  gument N is a bi
139c0 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a  tmask of optimiz
139d0 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73  ations to be dis
139e0 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d  abled.  For norm
139f0 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  al.    ** operat
13a00 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20  ion N should be 
13a10 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20  0.  The idea is 
13a20 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67  that a test prog
13a30 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20  ram (like the.  
13a40 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54    ** SQL Logic T
13a50 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20  est or SLT test 
13a60 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20  module) can run 
13a70 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c  the same SQL mul
13a80 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20  tiple times.    
13a90 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20  ** with various 
13aa0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69  optimizations di
13ab0 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79  sabled to verify
13ac0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61   that the same a
13ad0 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  nswer.    ** is 
13ae0 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72  obtained in ever
13af0 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  y case..    */. 
13b00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
13b10 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
13b20 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73  TIONS: {.      s
13b30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
13b40 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
13b50 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
13b60 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
13b70 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
13b80 20 3d 20 28 78 20 26 20 53 51 4c 49 54 45 5f 4f   = (x & SQLITE_O
13b90 70 74 4d 61 73 6b 29 20 7c 20 28 64 62 2d 3e 66  ptMask) | (db->f
13ba0 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
13bb0 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 62  ptMask);.      b
13bc0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
13bd0 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  def SQLITE_N_KEY
13be0 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69  WORD.    /* sqli
13bf0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
13c00 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
13c10 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73  _ISKEYWORD, cons
13c20 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20  t char *zWord). 
13c30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
13c40 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77 6f  zWord is a keywo
13c50 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62 79  rd recognized by
13c60 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
13c70 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20 20  n return the.   
13c80 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65   ** number of ke
13c90 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20 7a  ywords.  Or if z
13ca0 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b 65  Word is not a ke
13cb0 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30 2e  yword, return 0.
13cc0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
13cd0 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75 72  This test featur
13ce0 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  e is only availa
13cf0 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c 67  ble in the amalg
13d00 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20  amation since.  
13d10 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f    ** the SQLITE_
13d20 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f 20  N_KEYWORD macro 
13d30 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 69  is not defined i
13d40 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20 53  n this file if S
13d50 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73 20  QLite.    ** is 
13d60 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70 61  built using sepa
13d70 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c 65  rate source file
13d80 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
13d90 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
13da0 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a  RL_ISKEYWORD: {.
13db0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13dc0 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72 67   *zWord = va_arg
13dd0 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
13de0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
13df0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
13e00 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20 72  (zWord);.      r
13e10 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79 77  c = (sqlite3Keyw
13e20 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f  ordCode((u8*)zWo
13e30 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f  rd, n)!=TK_ID) ?
13e40 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
13e50 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72 65  D : 0;.      bre
13e60 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
13e70 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65   ..    /* sqlite
13e80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
13e90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
13ea0 47 48 44 52 53 5a 29 0a 20 20 20 20 2a 2a 0a 20  GHDRSZ).    **. 
13eb0 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65     ** Return the
13ec0 20 73 69 7a 65 20 6f 66 20 61 20 70 63 61 63 68   size of a pcach
13ed0 65 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65  e header in byte
13ee0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
13ef0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
13f00 52 4c 5f 50 47 48 44 52 53 5a 3a 20 7b 0a 20 20  RL_PGHDRSZ: {.  
13f10 20 20 20 20 72 63 20 3d 20 73 69 7a 65 6f 66 28      rc = sizeof(
13f20 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 62 72  PgHdr);.      br
13f30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
13f40 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
13f50 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
13f60 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
13f70 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
13f80 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
13f90 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
13fa0 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
13fb0 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
13fc0 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
13fd0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
13fe0 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
13ff0 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
14000 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14010 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
14020 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
14030 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
14040 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
14050 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
14060 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
14070 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
14080 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
14090 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
140a0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
140b0 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
140c0 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
140d0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
140e0 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
140f0 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
14100 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
14110 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20  ak;.    }..  }. 
14120 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
14130 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14140 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20  IT_BUILTIN_TEST 
14150 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
14160 7d 0a                                            }.