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

Artifact bed41512fabb19492b61d37fd988d79f6225e624:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35 34 38 32  ATION-OF: R-5482
06a0: 33 2d 34 31 33 34 33 20 54 68 65 20 73 71 6c 69  3-41343 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 6d 75 74  was compiled mut
0700: 65 78 69 6e 67 20 63 6f 64 65 20 6f 6d 69 74 74  exing code omitt
0710: 65 64 20 64 75 65 20 74 6f 0a 2a 2a 20 74 68 65  ed due to.** the
0720: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
0730: 46 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  FE compile-time 
0740: 6f 70 74 69 6f 6e 20 62 65 69 6e 67 20 73 65 74  option being set
0750: 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
0760: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0770: 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53  (void){ return S
0780: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
0790: 3b 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ; }..#if !define
07a0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
07b0: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
07c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
07d0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  TRACE)./*.** If 
07e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
07f0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
0800: 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
0810: 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f.** SQLITE_ENAB
0820: 4c 45 5f 49 4f 54 52 41 43 45 20 69 73 20 65 6e  LE_IOTRACE is en
0830: 61 62 6c 65 64 2c 20 74 68 65 6e 20 6d 65 73 73  abled, then mess
0840: 61 67 65 73 20 64 65 73 63 72 69 62 69 6e 67 0a  ages describing.
0850: 2a 2a 20 49 2f 4f 20 61 63 74 69 76 65 20 61 72  ** I/O active ar
0860: 65 20 77 72 69 74 74 65 6e 20 75 73 69 6e 67 20  e written using 
0870: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
0880: 54 68 65 73 65 20 6d 65 73 73 61 67 65 73 0a 2a  These messages.*
0890: 2a 20 61 72 65 20 69 6e 74 65 6e 64 65 64 20 66  * are intended f
08a0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61 63 74  or debugging act
08b0: 69 76 69 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76  ivity only..*/.v
08c0: 6f 69 64 20 28 2a 73 71 6c 69 74 65 33 49 6f 54  oid (*sqlite3IoT
08d0: 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72  race)(const char
08e0: 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e  *, ...) = 0;.#en
08f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
0900: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
0910: 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  al variable poin
0920: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77  ts to a string w
0930: 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e  hich is the.** n
0940: 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
0950: 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69  ry, then that di
0960: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
0970: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
0980: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
0990: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
09a0: 20 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d   the "PRAGMA tem
09b0: 70 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72  p_store_director
09c0: 79 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a  y" SQL command..
09d0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
09e0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
09f0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  = 0;../*.** Init
0a00: 69 61 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20  ialize SQLite.  
0a10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
0a20: 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
0a30: 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
0a40: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
0a50: 63 61 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20  cation,.** VFS, 
0a60: 61 6e 64 20 6d 75 74 65 78 20 73 75 62 73 79 73  and mutex subsys
0a70: 74 65 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f  tems prior to do
0a80: 69 6e 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20  ing any serious 
0a90: 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c  work with.** SQL
0aa0: 69 74 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e  ite.  But as lon
0ab0: 67 20 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20  g as you do not 
0ac0: 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c  compile with SQL
0ad0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
0ae0: 54 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  T.** this routin
0af0: 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
0b00: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62   automatically b
0b10: 79 20 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73  y key routines s
0b20: 75 63 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65  uch as.** sqlite
0b30: 33 5f 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a  3_open().  .**.*
0b40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0b50: 73 20 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74  s a no-op except
0b60: 20 6f 6e 20 69 74 73 20 76 65 72 79 20 66 69 72   on its very fir
0b70: 73 74 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20  st call for the 
0b80: 70 72 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66  process,.** or f
0b90: 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  or the first cal
0ba0: 6c 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  l after a call t
0bb0: 6f 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  o sqlite3_shutdo
0bc0: 77 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  wn..**.** The fi
0bd0: 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 63 61  rst thread to ca
0be0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
0bf0: 72 75 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c  runs the initial
0c00: 69 7a 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f  ization to.** co
0c10: 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75  mpletion.  If su
0c20: 62 73 65 71 75 65 6e 74 20 74 68 72 65 61 64 73  bsequent threads
0c30: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
0c40: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ne before the fi
0c50: 72 73 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61  rst.** thread ha
0c60: 73 20 66 69 6e 69 73 68 65 64 20 74 68 65 20 69  s finished the i
0c70: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
0c80: 6f 63 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20  ocess, then the 
0c90: 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68  subsequent.** th
0ca0: 72 65 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b  reads must block
0cb0: 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
0cc0: 20 74 68 72 65 61 64 20 66 69 6e 69 73 68 65 73   thread finishes
0cd0: 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
0ce0: 6c 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  lization..**.** 
0cf0: 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  The first thread
0d00: 20 6d 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73   might call this
0d10: 20 72 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69   routine recursi
0d20: 76 65 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65  vely.  Recursive
0d30: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  .** calls to thi
0d40: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
0d50: 20 6e 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63   not block, of c
0d60: 6f 75 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73  ourse.  Otherwis
0d70: 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
0d80: 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20  ization process 
0d90: 77 6f 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70  would never comp
0da0: 6c 65 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20  lete..**.** Let 
0db0: 58 20 62 65 20 74 68 65 20 66 69 72 73 74 20 74  X be the first t
0dc0: 68 72 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74  hread to enter t
0dd0: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65  his routine.  Le
0de0: 74 20 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65  t Y be some othe
0df0: 72 0a 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68  r.** thread.  Th
0e00: 65 6e 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69  en while the ini
0e10: 74 69 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tial invocation 
0e20: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
0e30: 62 79 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d  by X is.** incom
0e40: 70 6c 65 74 65 2c 20 69 74 20 69 73 20 72 65 71  plete, it is req
0e50: 75 69 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a  uired that:.**.*
0e60: 2a 20 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f  *    *  Calls to
0e70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72   this routine fr
0e80: 6f 6d 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20  om Y must block 
0e90: 75 6e 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d  until the outer-
0ea0: 6d 6f 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61  most.**       ca
0eb0: 6c 6c 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65  ll by X complete
0ec0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52  s..**.**    *  R
0ed0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74  ecursive calls t
0ee0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  o this routine f
0ef0: 72 6f 6d 20 74 68 72 65 61 64 20 58 20 72 65 74  rom thread X ret
0f00: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
0f10: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 6f 75 74  **       without
0f20: 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e   blocking..*/.in
0f30: 74 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  t sqlite3_initia
0f40: 6c 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 73 71  lize(void){.  sq
0f50: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61  lite3_mutex *pMa
0f60: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
0f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0f80: 65 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75  e main static mu
0f90: 74 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  tex */.  int rc;
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
0fd0: 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
0fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
0ff0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
1000: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
1010: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1020: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1030: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1040: 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c  dif..  /* If SQL
1050: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 63  ite is already c
1060: 6f 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61  ompletely initia
1070: 6c 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73  lized, then this
1080: 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71   call.  ** to sq
1090: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
10a0: 28 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e  () should be a n
10b0: 6f 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69  o-op.  But the i
10c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
10d0: 2a 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c  ** must be compl
10e0: 65 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20  ete.  So isInit 
10f0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20  must not be set 
1100: 75 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20 65  until the very e
1110: 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  nd.  ** of this 
1120: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
1130: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1140: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
1150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1160: 4b 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  K;..  /* Make su
1170: 72 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  re the mutex sub
1180: 73 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61  system is initia
1190: 6c 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c  lized.  If unabl
11a0: 65 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69  e to .  ** initi
11b0: 61 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20  alize the mutex 
11c0: 73 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72  subsystem, retur
11d0: 6e 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65  n early with the
11e0: 20 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20   error..  ** If 
11f0: 74 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f  the system is so
1200: 20 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72   sick that we ar
1210: 65 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  e unable to allo
1220: 63 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20  cate a mutex,.  
1230: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  ** there is not 
1240: 6d 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67  much SQLite is g
1250: 6f 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20  oing to be able 
1260: 74 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  to do..  **.  **
1270: 20 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   The mutex subsy
1280: 73 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63  stem must take c
1290: 61 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69  are of serializi
12a0: 6e 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20  ng its own.  ** 
12b0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
12c0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
12d0: 74 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a  te3MutexInit();.
12e0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12f0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  n rc;..  /* Init
1300: 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f  ialize the mallo
1310: 63 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74  c() system and t
1320: 68 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e  he recursive pIn
1330: 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20  itMutex mutex.. 
1340: 20 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69   ** This operati
1350: 6f 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  on is protected 
1360: 62 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41  by the STATIC_MA
1370: 53 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74  STER mutex.  Not
1380: 65 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65  e that.  ** Mute
1390: 78 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c  xAlloc() is call
13a0: 65 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20  ed for a static 
13b0: 6d 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69  mutex prior to i
13c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a  nitializing the.
13d0: 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73    ** malloc subs
13e0: 79 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70  ystem - this imp
13f0: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c  lies that the al
1400: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74  location of a st
1410: 61 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20  atic.  ** mutex 
1420: 6d 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65  must not require
1430: 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68   support from th
1440: 65 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  e malloc subsyst
1450: 65 6d 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  em..  */.  pMast
1460: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
1470: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
1480: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
1490: 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  R);.  sqlite3_mu
14a0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
14b0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
14c0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
14d0: 78 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  xInit = 1;.  if(
14e0: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
14f0: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
1500: 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  it ){.    rc = s
1510: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74  qlite3MallocInit
1520: 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ();.  }.  if( rc
1530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1540: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1550: 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49  Config.isMallocI
1560: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nit = 1;.    if(
1570: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1580: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1590: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
15b0: 6e 69 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20  nitMutex =.     
15c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74        sqlite3Mut
15d0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
15e0: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
15f0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1600: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
1610: 43 6f 72 65 4d 75 74 65 78 20 26 26 20 21 73 71  CoreMutex && !sq
1620: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1630: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1640: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1650: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1660: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
1670: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1680: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47   ){.    sqlite3G
1690: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
16a0: 49 6e 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d  InitMutex++;.  }
16b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16c0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
16d0: 0a 0a 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20  ..  /* If rc is 
16e0: 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74  not SQLITE_OK at
16f0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
1700: 6e 20 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c  n either the mal
1710: 6c 6f 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74  loc.  ** subsyst
1720: 65 6d 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  em could not be 
1730: 69 6e 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74  initialized or t
1740: 68 65 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64  he system failed
1750: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a   to allocate.  *
1760: 2a 20 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78  * the pInitMutex
1770: 20 6d 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61   mutex. Return a
1780: 6e 20 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65  n error in eithe
1790: 72 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66  r case.  */.  if
17a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74  ;.  }..  /* Do t
17d0: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 69  he rest of the i
17e0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e  nitialization un
17f0: 64 65 72 20 74 68 65 20 72 65 63 75 72 73 69 76  der the recursiv
1800: 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20  e mutex so.  ** 
1810: 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
1820: 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72  able to handle r
1830: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69  ecursive calls i
1840: 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1850: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
1860: 54 68 65 20 72 65 63 75 72 73 69 76 65 20 63 61  The recursive ca
1870: 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d  lls normally com
1880: 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73  e through.  ** s
1890: 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29  qlite3_os_init()
18a0: 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73   when it invokes
18b0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
18c0: 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68  ister(), but oth
18d0: 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76  er.  ** recursiv
18e0: 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c  e calls might al
18f0: 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a  so be possible..
1900: 20 20 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d    **.  ** IMPLEM
1910: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30  ENTATION-OF: R-0
1920: 30 31 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74  0140-37445 SQLit
1930: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
1940: 73 65 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73  serializes calls
1950: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e  .  ** to the xIn
1960: 69 74 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68  it method, so th
1970: 65 20 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e  e xInit method n
1980: 65 65 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61  eed not be threa
1990: 64 73 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dsafe..  **.  **
19a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   The following m
19b0: 75 74 65 78 20 69 73 20 77 68 61 74 20 73 65 72  utex is what ser
19c0: 69 61 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74  ializes access t
19d0: 6f 20 74 68 65 20 61 70 70 64 65 66 20 70 63 61  o the appdef pca
19e0: 63 68 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d  che xInit.  ** m
19f0: 65 74 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c  ethods.  The sql
1a00: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
1a10: 6f 64 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20  ods.xInit() all 
1a20: 69 73 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74  is embedded in t
1a30: 68 65 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  he.  ** call to 
1a40: 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69  sqlite3PcacheIni
1a50: 74 69 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a  tialize()..  */.
1a60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1a70: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f  enter(sqlite3Glo
1a80: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1a90: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
1aa0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ab0: 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71  .isInit==0 && sq
1ac0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ad0: 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20  g.inProgress==0 
1ae0: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61  ){.    FuncDefHa
1af0: 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f  sh *pHash = &GLO
1b00: 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c  BAL(FuncDefHash,
1b10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75   sqlite3GlobalFu
1b20: 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71  nctions);.    sq
1b30: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b40: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31  g.inProgress = 1
1b50: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61  ;.    memset(pHa
1b60: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  sh, 0, sizeof(sq
1b70: 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74  lite3GlobalFunct
1b80: 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69  ions));.    sqli
1b90: 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61  te3RegisterGloba
1ba0: 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20  lFunctions();.  
1bb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1bc0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1bd0: 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  heInit==0 ){.   
1be0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1bf0: 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28  cacheInitialize(
1c00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1c10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1c30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
1c40: 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20  acheInit = 1;.  
1c50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c60: 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a  OsInit();.    }.
1c70: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1c90: 71 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66  qlite3PCacheBuff
1ca0: 65 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33  erSetup( sqlite3
1cb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
1cc0: 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  ge, .          s
1cd0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ce0: 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74  ig.szPage, sqlit
1cf0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1d00: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Page);.      sql
1d10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1d20: 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  .isInit = 1;.   
1d30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c   }.    sqlite3Gl
1d40: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1d50: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  gress = 0;.  }. 
1d60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1d70: 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62  eave(sqlite3Glob
1d80: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1d90: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62  tex);..  /* Go b
1da0: 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74  ack under the st
1db0: 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63  atic mutex and c
1dc0: 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 63 75  lean up the recu
1dd0: 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78  rsive.  ** mutex
1de0: 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65   to prevent a re
1df0: 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a  source leak..  *
1e00: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1e10: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
1e20: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
1e30: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1e40: 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73  Mutex--;.  if( s
1e50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e60: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1e70: 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=0 ){.    asser
1e80: 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  t( sqlite3Global
1e90: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1ea0: 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
1eb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1ec0: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
1ed0: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1f00: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Mutex = 0;.  }. 
1f10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1f20: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1f30: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1f40: 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e  ng is just a san
1f50: 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ity check to mak
1f60: 65 20 73 75 72 65 20 53 51 4c 69 74 65 20 68 61  e sure SQLite ha
1f70: 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70  s.  ** been comp
1f80: 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  iled correctly. 
1f90: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
1fa0: 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64   to run this cod
1fb0: 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64  e, but.  ** we d
1fc0: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e  on't want to run
1fd0: 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e   it too often an
1fe0: 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79  d soak up CPU cy
1ff0: 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a  cles for no.  **
2000: 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20   reason.  So we 
2010: 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69  run it once duri
2020: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
2030: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
2040: 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53  NDEBUG.#ifndef S
2050: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
2060: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54  ING_POINT.  /* T
2070: 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63  his section of c
2080: 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70  ode's only "outp
2090: 75 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72  ut" is via asser
20a0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  t() statements. 
20b0: 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51  */.  if ( rc==SQ
20c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
20d0: 36 34 20 78 20 3d 20 28 28 28 75 36 34 29 31 29  64 x = (((u64)1)
20e0: 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75  <<63)-1;.    dou
20f0: 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72  ble y;.    asser
2100: 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b  t(sizeof(x)==8);
2110: 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65  .    assert(size
2120: 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29  of(x)==sizeof(y)
2130: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79  );.    memcpy(&y
2140: 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73  , &x, 8);.    as
2150: 73 65 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e  sert( sqlite3IsN
2160: 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  aN(y) );.  }.#en
2170: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  dif.#endif..  re
2180: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2190: 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63  * Undo the effec
21a0: 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e  ts of sqlite3_in
21b0: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73  itialize().  Mus
21c0: 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  t not be called 
21d0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61  while.** there a
21e0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
21f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2200: 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c  ons or memory al
2210: 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20  locations or.** 
2220: 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f  while any part o
2230: 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65  f SQLite is othe
2240: 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20  rwise in use in 
2250: 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69  any thread.  Thi
2260: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
2270: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20  not threadsafe. 
2280: 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20   But it is safe 
2290: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  to invoke this r
22a0: 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65  outine.** on whe
22b0: 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  n SQLite is alre
22c0: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20  ady shut down.  
22d0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  If SQLite is alr
22e0: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a  eady shut down.*
22f0: 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
2300: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  ine is invoked, 
2310: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
2320: 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
2330: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
2340: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76  lite3_shutdown(v
2350: 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  oid){.  if( sqli
2360: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2370: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  isInit ){.    sq
2380: 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a  lite3_os_end();.
2390: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
23a0: 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e  t_auto_extension
23b0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
23c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
23d0: 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  it = 0;.  }.  if
23e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
23f0: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
2400: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
2410: 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28  3PcacheShutdown(
2420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
2430: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61  obalConfig.isPCa
2440: 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  cheInit = 0;.  }
2450: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
2460: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
2470: 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  locInit ){.    s
2480: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28  qlite3MallocEnd(
2490: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
24a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
24b0: 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  locInit = 0;.  }
24c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
24d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74  obalConfig.isMut
24e0: 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  exInit ){.    sq
24f0: 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b  lite3MutexEnd();
2500: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2510: 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78  alConfig.isMutex
2520: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Init = 0;.  }.. 
2530: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2540: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
2550: 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c   API allows appl
2560: 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69  ications to modi
2570: 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f  fy the global co
2580: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a  nfiguration of.*
2590: 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62  * the SQLite lib
25a0: 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65  rary at run-time
25b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25c0: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
25d0: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
25e0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
25f0: 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61  standing.** data
2600: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
2610: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
2620: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f  ations.  This ro
2630: 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  utine is not.** 
2640: 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61 69  threadsafe.  Fai
2650: 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68 65  lure to heed the
2660: 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20  se warnings can 
2670: 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63  lead to unpredic
2680: 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f  table.** behavio
2690: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
26a0: 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c  3_config(int op,
26b0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
26c0: 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   ap;.  int rc = 
26d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
26e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
26f0: 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53  ) shall return S
2700: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20  QLITE_MISUSE if 
2710: 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68  it is invoked wh
2720: 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c  ile.  ** the SQL
2730: 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20 69  ite library is i
2740: 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20  n use. */.  if( 
2750: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2760: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
2770: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
2780: 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74  E_BKPT;..  va_st
2790: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
27a0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
27b0: 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69    /* Mutex confi
27c0: 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
27d0: 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61   are only availa
27e0: 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73  ble in a threads
27f0: 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  afe.    ** compi
2800: 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20  le. .    */.#if 
2810: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2820: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
2830: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
2840: 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  0.    case SQLIT
2850: 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54  E_CONFIG_SINGLET
2860: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
2870: 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75  * Disable all mu
2880: 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  texing */.      
2890: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
28a0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
28b0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
28c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
28d0: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20  ullMutex = 0;.  
28e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2900: 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52  _CONFIG_MULTITHR
2910: 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAD: {.      /* 
2920: 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67  Disable mutexing
2930: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
2940: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  nections */.    
2950: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
2960: 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74  xing of core dat
2970: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
2980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2990: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
29a0: 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  utex = 1;.      
29b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
29c0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
29d0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
29e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
29f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45  SQLITE_CONFIG_SE
2a00: 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20  RIALIZED: {.    
2a10: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20    /* Enable all 
2a20: 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20  mutexing */.    
2a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2a40: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
2a50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
2a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2a70: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a  bFullMutex = 1;.
2a80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a90: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2aa0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a  TE_CONFIG_MUTEX:
2ab0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
2ac0: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
2ad0: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
2ae0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
2af0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b00: 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61  nfig.mutex = *va
2b10: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
2b20: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
2b30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2b40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2b50: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
2b60: 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  UTEX: {.      /*
2b70: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
2b80: 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c  rrent mutex impl
2b90: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
2ba0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
2bb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
2bc0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
2bd0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
2be0: 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tex;.      break
2bf0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2c00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2c10: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20  _CONFIG_MALLOC: 
2c20: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
2c30: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
2c40: 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65  e malloc impleme
2c50: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
2c60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2c70: 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67  nfig.m = *va_arg
2c80: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
2c90: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
2ca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2cb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2cc0: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a  ONFIG_GETMALLOC:
2cd0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
2ce0: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
2cf0: 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d   malloc() implem
2d00: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2d10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2d20: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c  balConfig.m.xMal
2d30: 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  loc==0 ) sqlite3
2d40: 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b  MemSetDefault();
2d50: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
2d60: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  p, sqlite3_mem_m
2d70: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
2d80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2d90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2da0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2db0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53  LITE_CONFIG_MEMS
2dc0: 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f  TATUS: {.      /
2dd0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
2de0: 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73  ble the malloc s
2df0: 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e  tatus collection
2e00: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2e10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d  3GlobalConfig.bM
2e20: 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28  emstat = va_arg(
2e30: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
2e40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2e50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2e60: 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20  FIG_SCRATCH: {. 
2e70: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
2e80: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73  e a buffer for s
2e90: 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70  cratch memory sp
2ea0: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ace */.      sql
2eb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2ec0: 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .pScratch = va_a
2ed0: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
2ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2ef0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
2f00: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
2f10: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
2f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2f30: 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  nScratch = va_ar
2f40: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
2f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2f60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2f70: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a  ONFIG_PAGECACHE:
2f80: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69   {.      /* Desi
2f90: 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66  gnate a buffer f
2fa0: 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65  or page cache me
2fb0: 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20  mory space */.  
2fc0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2fd0: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20  lConfig.pPage = 
2fe0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
2ff0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3000: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50  GlobalConfig.szP
3010: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3020: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3030: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3040: 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28  .nPage = va_arg(
3050: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3060: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
3070: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3080: 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20  NFIG_PCACHE: {. 
3090: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
30a0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
30b0: 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d  age cache implem
30c0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
30d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
30e0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 20 3d 20 2a  onfig.pcache = *
30f0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3100: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
3110: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
3120: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
3130: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3140: 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20  GETPCACHE: {.   
3150: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3160: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3170: 65 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  e.xInit==0 ){.  
3180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
3190: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
31a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
31b0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
31c0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
31d0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
31e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
31f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3200: 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65     }..#if define
3210: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
3220: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
3230: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
3240: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
3250: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3260: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
3270: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
3280: 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d  uffer for heap m
3290: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
32a0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
32b0: 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d  alConfig.pHeap =
32c0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
32d0: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
32e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
32f0: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
3300: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3310: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3320: 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28  .mnReq = va_arg(
3330: 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20  ap, int);..     
3340: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3350: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31  alConfig.mnReq<1
3360: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3370: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3380: 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20  mnReq = 1;.     
3390: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
33a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
33b0: 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a  nReq>(1<<12) ){.
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d          /* cap m
33d0: 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65 20  in request size 
33e0: 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20  at 2^12 */.     
33f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3400: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28  Config.mnReq = (
3410: 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a  1<<12);.      }.
3420: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3430: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3440: 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Heap==0 ){.     
3450: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65 61     /* If the hea
3460: 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55 4c  p pointer is NUL
3470: 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20  L, then restore 
3480: 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65  the malloc imple
3490: 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20 20  mentation.      
34a0: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55 4c    ** back to NUL
34b0: 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e 20  L pointers too. 
34c0: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
34d0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20 67   the malloc to g
34e0: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63  o.        ** bac
34f0: 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74  k to its default
3500: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3510: 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69  when sqlite3_ini
3520: 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20 20  tialize() is.   
3530: 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20 20       ** run..   
3540: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
3550: 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47  memset(&sqlite3G
3560: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30  lobalConfig.m, 0
3570: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
3580: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29  GlobalConfig.m))
3590: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
35a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68 65         /* The he
35b0: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  ap pointer is no
35c0: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e 73  t NULL, then ins
35d0: 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65 0a  tall one of the.
35e0: 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35 2e          ** mem5.
35f0: 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64 73  c/mem3.c methods
3600: 2e 20 49 66 20 6e 65 69 74 68 65 72 20 45 4e 41  . If neither ENA
3610: 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72 0a  BLE_MEMSYS3 nor.
3620: 20 20 20 20 20 20 20 20 2a 2a 20 45 4e 41 42 4c          ** ENABL
3630: 45 5f 4d 45 4d 53 59 53 35 20 69 73 20 64 65 66  E_MEMSYS5 is def
3640: 69 6e 65 64 2c 20 72 65 74 75 72 6e 20 61 6e 20  ined, return an 
3650: 65 72 72 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  error..        *
3660: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3670: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20  ENABLE_MEMSYS3. 
3680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
3690: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a  obalConfig.m = *
36a0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d  sqlite3MemGetMem
36b0: 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23  sys3();.#endif.#
36c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
36d0: 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20  BLE_MEMSYS5.    
36e0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
36f0: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c  lConfig.m = *sql
3700: 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73  ite3MemGetMemsys
3710: 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  5();.#endif.    
3720: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3730: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
3740: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3750: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
3760: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
3770: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c  GlobalConfig.szL
3780: 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72  ookaside = va_ar
3790: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
37a0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
37b0: 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65  onfig.nLookaside
37c0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
37d0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
37e0: 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20  .    }.    .    
37f0: 2f 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e  /* Record a poin
3800: 74 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65  ter to the logge
3810: 72 20 66 75 6e 63 63 74 69 6f 6e 20 61 6e 64 20  r funcction and 
3820: 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65  its first argume
3830: 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64  nt..    ** The d
3840: 65 66 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20  efault is NULL. 
3850: 20 4c 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61   Logging is disa
3860: 62 6c 65 64 20 69 66 20 74 68 65 20 66 75 6e 63  bled if the func
3870: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a  tion pointer is.
3880: 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20      ** NULL..   
3890: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
38a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20  ITE_CONFIG_LOG: 
38b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
38c0: 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
38d0: 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
38e0: 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
38f0: 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
3900: 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
3910: 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
3920: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
3930: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
3940: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
3950: 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  id(*)(void*,int,
3960: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20  const char*));. 
3970: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79       */.      ty
3980: 70 65 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46  pedef void(*LOGF
3990: 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74  UNC_t)(void*,int
39a0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20  ,const char*);. 
39b0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
39c0: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20  alConfig.xLog = 
39d0: 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55  va_arg(ap, LOGFU
39e0: 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  NC_t);.      sql
39f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3a00: 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72  .pLogArg = va_ar
3a10: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3a20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3a30: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
3a40: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
3a50: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
3a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3a70: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
3a80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3a90: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20  *.** Set up the 
3aa0: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
3ab0: 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  s for a database
3ac0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20   connection..** 
3ad0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
3ae0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a   on success.  .*
3af0: 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69  * If lookaside i
3b00: 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
3b10: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
3b20: 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BUSY..**.** The 
3b30: 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  sz parameter is 
3b40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
3b50: 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b  tes in each look
3b60: 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54  aside slot..** T
3b70: 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72  he cnt parameter
3b80: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
3b90: 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74  f slots.  If pSt
3ba0: 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a  art is NULL the.
3bb0: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
3bc0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
3bd0: 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
3be0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
3bf0: 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72  c()..** If pStar
3c00: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
3c10: 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20  en it is sz*cnt 
3c20: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
3c30: 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68  to use for.** th
3c40: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
3c50: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
3c60: 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  t setupLookaside
3c70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
3c80: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a  id *pBuf, int sz
3c90: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f  , int cnt){.  vo
3ca0: 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66  id *pStart;.  if
3cb0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
3cc0: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  nOut ){.    retu
3cd0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
3ce0: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
3cf0: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
3d00: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
3d10: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
3d20: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
3d30: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
3d40: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
3d50: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
3d60: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
3d70: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
3d80: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
3d90: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
3da0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
3db0: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
3dc0: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
3dd0: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
3de0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
3df0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
3e00: 67 65 72 20 74 68 61 6e 20 61 20 70 6f 69 6e 74  ger than a point
3e10: 65 72 0a 20 20 2a 2a 20 74 6f 20 62 65 20 75 73  er.  ** to be us
3e20: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eful..  */.  if(
3e30: 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66   sz<=(int)sizeof
3e40: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
3e50: 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28   ) sz = 0;.  if(
3e60: 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30   cnt<0 ) cnt = 0
3e70: 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c  ;.  if( sz==0 ||
3e80: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73   cnt==0 ){.    s
3e90: 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  z = 0;.    pStar
3ea0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
3eb0: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
3ec0: 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e    sz = ROUNDDOWN
3ed0: 38 28 73 7a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  8(sz); /* IMP: R
3ee0: 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a  -33038-09382 */.
3ef0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
3f00: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
3f10: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
3f20: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
3f30: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
3f40: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
3f50: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
3f60: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
3f70: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 7a 20 3d 20  }else{.    sz = 
3f80: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
3f90: 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d  /* IMP: R-33038-
3fa0: 30 39 33 38 32 20 2a 2f 0a 20 20 20 20 70 53 74  09382 */.    pSt
3fb0: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
3fc0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
3fd0: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
3fe0: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
3ff0: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
4000: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
4010: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
4020: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
4030: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
4040: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
4050: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
4060: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
4070: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
4080: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
4090: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
40a0: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
40b0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
40c0: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
40d0: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
40e0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
40f0: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
4100: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4110: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
4120: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
4130: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4140: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
4150: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4160: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
4170: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
4180: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
4190: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
41a0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
41b0: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  End = 0;.    db-
41c0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
41d0: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
41e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
41f0: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
4200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4220: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
4230: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
4240: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4250: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
4260: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
4270: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
4280: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
4290: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
42a0: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   Configuration s
42b0: 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69  ettings for an i
42c0: 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61  ndividual databa
42d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f  se connection.*/
42e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
42f0: 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a  config(sqlite3 *
4300: 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  db, int op, ...)
4310: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
4320: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
4330: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
4340: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
4350: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42    case SQLITE_DB
4360: 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45  CONFIG_LOOKASIDE
4370: 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  : {.      void *
4380: 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70  pBuf = va_arg(ap
4390: 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50  , void*); /* IMP
43a0: 3a 20 52 2d 32 31 31 31 32 2d 31 32 32 37 35 20  : R-21112-12275 
43b0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  */.      int sz 
43c0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
43d0: 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a  );       /* IMP:
43e0: 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a   R-47871-25994 *
43f0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  /.      int cnt 
4400: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4410: 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  );      /* IMP: 
4420: 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f  R-04460-53386 */
4430: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75  .      rc = setu
4440: 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70  pLookaside(db, p
4450: 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20  Buf, sz, cnt);. 
4460: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4470: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
4480: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
4490: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
44a0: 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20       int op;    
44b0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
44c0: 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d  */.        u32 m
44d0: 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20  ask;    /* Mask 
44e0: 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71  of the bit in sq
44f0: 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73  lite3.flags to s
4500: 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20  et/clear */.    
4510: 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20    } aFlagOp[] = 
4520: 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  {.        { SQLI
4530: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
4540: 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49  LE_FKEY,    SQLI
4550: 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20  TE_ForeignKeys  
4560: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
4570: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
4580: 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53  NABLE_TRIGGER, S
4590: 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
45a0: 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b  ger  },.      };
45b0: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
45c0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20  int i;.      rc 
45d0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
45e0: 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d  /* IMP: R-42790-
45f0: 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66  23372 */.      f
4600: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
4610: 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b  ize(aFlagOp); i+
4620: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
4630: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f  aFlagOp[i].op==o
4640: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
4650: 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72  nt onoff = va_ar
4660: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
4670: 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20        int *pRes 
4680: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4690: 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  *);.          in
46a0: 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d  t oldFlags = db-
46b0: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
46c0: 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b    if( onoff>0 ){
46d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
46e0: 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f  >flags |= aFlagO
46f0: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
4700: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
4710: 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  noff==0 ){.     
4720: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
4730: 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e   &= ~aFlagOp[i].
4740: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
4750: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
4760: 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c  oldFlags!=db->fl
4770: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ags ){.         
4780: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
4790: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
47a0: 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
47b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
47c0: 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20  ( pRes ){.      
47d0: 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64        *pRes = (d
47e0: 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67  b->flags & aFlag
47f0: 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a  Op[i].mask)!=0;.
4800: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4810: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4820: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
4830: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4850: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4860: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
4870: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
4880: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
4890: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
48a0: 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e  [0..n-1] contain
48b0: 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f  s all spaces..*/
48c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53  .static int allS
48d0: 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72  paces(const char
48e0: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77   *z, int n){.  w
48f0: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e  hile( n>0 && z[n
4900: 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b  -1]==' ' ){ n--;
4910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30   }.  return n==0
4920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4930: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  is the default c
4940: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
4950: 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22  n named "BINARY"
4960: 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73   which is always
4970: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  .** available..*
4980: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46  *.** If the padF
4990: 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
49a0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70  not NULL then sp
49b0: 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74  ace padding at t
49c0: 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72  he end.** of str
49d0: 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e  ings is ignored.
49e0: 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74    This implement
49f0: 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c  s the RTRIM coll
4a00: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
4a10: 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63   int binCollFunc
4a20: 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61  (.  void *padFla
4a30: 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g,.  int nKey1, 
4a40: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
4a50: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
4a60: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
4a70: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  2.){.  int rc, n
4a80: 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b  ;.  n = nKey1<nK
4a90: 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b  ey2 ? nKey1 : nK
4aa0: 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  ey2;.  rc = memc
4ab0: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
4ac0: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
4ad0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46   ){.    if( padF
4ae0: 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  lag.     && allS
4af0: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
4b00: 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29  ey1)+n, nKey1-n)
4b10: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
4b20: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32  es(((char*)pKey2
4b30: 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20  )+n, nKey2-n).  
4b40: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65    ){.      /* Le
4b50: 61 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64  ave rc unchanged
4b60: 20 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c   at 0 */.    }el
4b70: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e  se{.      rc = n
4b80: 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20  Key1 - nKey2;.  
4b90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4ba0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e   rc;.}../*.** An
4bb0: 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63  other built-in c
4bc0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
4bd0: 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a  e: NOCASE. .**.*
4be0: 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67  * This collating
4bf0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74   sequence is int
4c00: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
4c10: 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70   for "case indep
4c20: 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72  endant.** compar
4c30: 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20  ison". SQLite's 
4c40: 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70  knowledge of upp
4c50: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73  er and lower cas
4c60: 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a  e equivalents.**
4c70: 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f   extends only to
4c80: 20 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65   the 26 characte
4c90: 72 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45  rs used in the E
4ca0: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e  nglish language.
4cb0: 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f  .**.** At the mo
4cc0: 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e  ment there is on
4cd0: 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65  ly a UTF-8 imple
4ce0: 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  mentation..*/.st
4cf0: 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43  atic int nocaseC
4d00: 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20  ollatingFunc(.  
4d10: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4d20: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
4d30: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
4d40: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
4d50: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
4d60: 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74  .  int r = sqlit
4d70: 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20  e3StrNICmp(.    
4d80: 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29    (const char *)
4d90: 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68  pKey1, (const ch
4da0: 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65  ar *)pKey2, (nKe
4db0: 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a  y1<nKey2)?nKey1:
4dc0: 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44  nKey2);.  UNUSED
4dd0: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
4de0: 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20  ed);.  if( 0==r 
4df0: 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31  ){.    r = nKey1
4e00: 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65  -nKey2;.  }.  re
4e10: 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn r;.}../*.**
4e20: 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49   Return the ROWI
4e30: 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  D of the most re
4e40: 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73  cent insert.*/.s
4e50: 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69  qlite_int64 sqli
4e60: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
4e70: 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  rowid(sqlite3 *d
4e80: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
4e90: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  >lastRowid;.}../
4ea0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4eb0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
4ec0: 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  s in the most re
4ed0: 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  cent call to sql
4ee0: 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a  ite3_exec()..*/.
4ef0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  int sqlite3_chan
4f00: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
4f10: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  {.  return db->n
4f20: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
4f30: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
4f40: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69  er of changes si
4f50: 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nce the database
4f60: 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e   handle was open
4f70: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
4f80: 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73  e3_total_changes
4f90: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4fa0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74   return db->nTot
4fb0: 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  alChange;.}../*.
4fc0: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65  ** Close all ope
4fd0: 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68  n savepoints. Th
4fe0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  is function only
4ff0: 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65   manipulates fie
5000: 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  lds of the.** da
5010: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62  tabase handle ob
5020: 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f  ject, it does no
5030: 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65  t close any save
5040: 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20  points that may 
5050: 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68  be open.** at th
5060: 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c  e b-tree/pager l
5070: 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  evel..*/.void sq
5080: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
5090: 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ints(sqlite3 *db
50a0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e  ){.  while( db->
50b0: 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
50c0: 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d    Savepoint *pTm
50d0: 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  p = db->pSavepoi
50e0: 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76  nt;.    db->pSav
50f0: 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70  epoint = pTmp->p
5100: 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Next;.    sqlite
5110: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70  3DbFree(db, pTmp
5120: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61  );.  }.  db->nSa
5130: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64  vepoint = 0;.  d
5140: 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20  b->nStatement = 
5150: 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73  0;.  db->isTrans
5160: 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20  actionSavepoint 
5170: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
5180: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
5190: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  tor function ass
51a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e  ociated with Fun
51b0: 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20  cDef p, if any. 
51c0: 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68  Except,.** if th
51d0: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  is is not the la
51e0: 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  st copy of the f
51f0: 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  unction, do not 
5200: 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69  invoke it. Multi
5210: 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66  ple.** copies of
5220: 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69   a single functi
5230: 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77  on are created w
5240: 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74  hen create_funct
5250: 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a  ion() is called.
5260: 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41  ** with SQLITE_A
5270: 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  NY as the encodi
5280: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
5290: 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72  id functionDestr
52a0: 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  oy(sqlite3 *db, 
52b0: 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46  FuncDef *p){.  F
52c0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
52d0: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e  Destructor = p->
52e0: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69  pDestructor;.  i
52f0: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
5300: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
5310: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  r->nRef--;.    i
5320: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  f( pDestructor->
5330: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
5340: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44   pDestructor->xD
5350: 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74  estroy(pDestruct
5360: 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a  or->pUserData);.
5370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5380: 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63  ree(db, pDestruc
5390: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tor);.    }.  }.
53a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
53b0: 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74  n existing SQLit
53c0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e  e database.*/.in
53d0: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  t sqlite3_close(
53e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
53f0: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20  HashElem *i;    
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5410: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74  /* Hash table it
5420: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  erator */.  int 
5430: 6a 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b  j;..  if( !db ){
5440: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5450: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
5460: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
5470: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
5480: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5490: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
54a0: 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
54b0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
54c0: 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 73 71 6c 69  >mutex);..  sqli
54d0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
54e0: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a  Schema(db, 0);..
54f0: 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
5500: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74  ction is open, t
5510: 68 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  he ResetInternal
5520: 53 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61 62  Schema() call ab
5530: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
5540: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
5550: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
5560: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
5570: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
5580: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
5590: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
55a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
55b0: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
55c0: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
55d0: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
55e0: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
55f0: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
5600: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
5610: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
5620: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
5630: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
5640: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
5650: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
5660: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
5670: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
5680: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
5690: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  ack(db);..  /* I
56a0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
56b0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73 2c  outstanding VMs,
56c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
56d0: 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62  USY. */.  if( db
56e0: 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73  ->pVdbe ){.    s
56f0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
5700: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
5710: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
5720: 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e   close due to un
5730: 66 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65 6d  finalised statem
5740: 65 6e 74 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  ents");.    sqli
5750: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
5760: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
5770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5780: 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  SY;.  }.  assert
5790: 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43  ( sqlite3SafetyC
57a0: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
57b0: 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20   );..  for(j=0; 
57c0: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
57d0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
57e0: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74  = db->aDb[j].pBt
57f0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  ;.    if( pBt &&
5800: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
5810: 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 7b 0a  nBackup(pBt) ){.
5820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5830: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
5840: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  SY, .          "
5850: 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20  unable to close 
5860: 64 75 65 20 74 6f 20 75 6e 66 69 6e 69 73 68 65  due to unfinishe
5870: 64 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69  d backup operati
5880: 6f 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  on");.      sqli
5890: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
58a0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
58b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
58c0: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BUSY;.    }.  }.
58d0: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
58e0: 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70  utstanding Savep
58f0: 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e  oint structures.
5900: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f   */.  sqlite3Clo
5910: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
5920: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  ;..  for(j=0; j<
5930: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
5940: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
5950: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b  b = &db->aDb[j];
5960: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
5970: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
5980: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
5990: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44  ->pBt);.      pD
59a0: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20  b->pBt = 0;.    
59b0: 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20    if( j!=1 ){.  
59c0: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
59d0: 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ma = 0;.      }.
59e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
59f0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
5a00: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a  Schema(db, 0);..
5a10: 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f    /* Tell the co
5a20: 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74  de in notify.c t
5a30: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  hat the connecti
5a40: 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c  on no longer hol
5a50: 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ds any.  ** lock
5a60: 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72  s and does not r
5a70: 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68  equire any furth
5a80: 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  er unlock-notify
5a90: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
5aa0: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  .  sqlite3Connec
5ab0: 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a  tionClosed(db);.
5ac0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
5ad0: 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  Db<=2 );.  asser
5ae0: 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e  t( db->aDb==db->
5af0: 61 44 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66  aDbStatic );.  f
5b00: 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53  or(j=0; j<ArrayS
5b10: 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29  ize(db->aFunc.a)
5b20: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63  ; j++){.    Func
5b30: 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61  Def *pNext, *pHa
5b40: 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  sh, *p;.    for(
5b50: 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d  p=db->aFunc.a[j]
5b60: 3b 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20  ; p; p=pHash){. 
5b70: 20 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e       pHash = p->
5b80: 70 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69  pHash;.      whi
5b90: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20  le( p ){.       
5ba0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
5bb0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
5bc0: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
5bd0: 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
5be0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
5bf0: 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65  .        p = pNe
5c00: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
5c10: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71  }.  }.  for(i=sq
5c20: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
5c30: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b  b->aCollSeq); i;
5c40: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
5c50: 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53  t(i)){.    CollS
5c60: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c  eq *pColl = (Col
5c70: 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73  lSeq *)sqliteHas
5c80: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a  hData(i);.    /*
5c90: 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74   Invoke any dest
5ca0: 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72  ructors register
5cb0: 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  ed for collation
5cc0: 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64   sequence user d
5cd0: 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ata. */.    for(
5ce0: 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a  j=0; j<3; j++){.
5cf0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b        if( pColl[
5d00: 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20  j].xDel ){.     
5d10: 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c     pColl[j].xDel
5d20: 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29  (pColl[j].pUser)
5d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5d40: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5d50: 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20  e(db, pColl);.  
5d60: 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43  }.  sqlite3HashC
5d70: 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  lear(&db->aCollS
5d80: 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eq);.#ifndef SQL
5d90: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
5da0: 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71  TABLE.  for(i=sq
5db0: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
5dc0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20  b->aModule); i; 
5dd0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
5de0: 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65  (i)){.    Module
5df0: 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65   *pMod = (Module
5e00: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
5e10: 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  a(i);.    if( pM
5e20: 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a  od->xDestroy ){.
5e30: 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73        pMod->xDes
5e40: 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29  troy(pMod->pAux)
5e50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5e60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d  te3DbFree(db, pM
5e70: 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  od);.  }.  sqlit
5e80: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
5e90: 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
5ea0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  f..  sqlite3Erro
5eb0: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
5ec0: 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61   0); /* Dealloca
5ed0: 74 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65  tes any cached e
5ee0: 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f  rror strings. */
5ef0: 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20  .  if( db->pErr 
5f00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
5f10: 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72  lueFree(db->pErr
5f20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
5f30: 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28  CloseExtensions(
5f40: 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  db);..  db->magi
5f50: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
5f60: 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68  _ERROR;..  /* Th
5f70: 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20  e temp-database 
5f80: 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61  schema is alloca
5f90: 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  ted differently 
5fa0: 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73  from the other s
5fb0: 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63  chema.  ** objec
5fc0: 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65  ts (using sqlite
5fd0: 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c  Malloc() directl
5fe0: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71  y, instead of sq
5ff0: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
6000: 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20  ())..  ** So it 
6010: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
6020: 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68  d here. Todo: Wh
6030: 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74  y not roll the t
6040: 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a  emp schema into.
6050: 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71    ** the same sq
6060: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20  liteMalloc() as 
6070: 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c  the one that all
6080: 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62  ocates the datab
6090: 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74  ase .  ** struct
60a0: 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ure?.  */.  sqli
60b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62  te3DbFree(db, db
60c0: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
60d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
60e0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
60f0: 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  ex);.  db->magic
6100: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
6110: 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65  CLOSED;.  sqlite
6120: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d  3_mutex_free(db-
6130: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
6140: 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  t( db->lookaside
6150: 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  .nOut==0 );  /* 
6160: 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61  Fails on a looka
6170: 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  side memory leak
6180: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f   */.  if( db->lo
6190: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
61a0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
61b0: 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73  _free(db->lookas
61c0: 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d  ide.pStart);.  }
61d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
61e0: 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  db);.  return SQ
61f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6200: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64  * Rollback all d
6210: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a  atabase files..*
6220: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
6230: 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65  llbackAll(sqlite
6240: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
6250: 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d  .  int inTrans =
6260: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
6270: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6280: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
6290: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
62a0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66  ignMalloc();.  f
62b0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
62c0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
62d0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20   db->aDb[i].pBt 
62e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
62f0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
6300: 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  ns(db->aDb[i].pB
6310: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  t) ){.        in
6320: 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  Trans = 1;.     
6330: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
6340: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62  BtreeRollback(db
6350: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  ->aDb[i].pBt);. 
6360: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e       db->aDb[i].
6370: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20  inTrans = 0;.   
6380: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6390: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
63a0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
63b0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
63c0: 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53   if( db->flags&S
63d0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
63e0: 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ges ){.    sqlit
63f0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
6400: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
6410: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
6420: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
6430: 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b, 0);.  }..  /*
6440: 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f   Any deferred co
6450: 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
6460: 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65  ons have now bee
6470: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20  n resolved. */. 
6480: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
6490: 6e 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ns = 0;..  /* If
64a0: 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f   one has been co
64b0: 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65  nfigured, invoke
64c0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f   the rollback-ho
64d0: 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ok callback */. 
64e0: 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61   if( db->xRollba
64f0: 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69  ckCallback && (i
6500: 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61  nTrans || !db->a
6510: 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20  utoCommit) ){.  
6520: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
6530: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c  allback(db->pRol
6540: 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d  lbackArg);.  }.}
6550: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6560: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74   static string t
6570: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
6580: 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
6590: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
65a0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
65b0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
65c0: 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72  ite3ErrStr(int r
65d0: 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  c){.  static con
65e0: 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61  st char* const a
65f0: 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  Msg[] = {.    /*
6600: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
6610: 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65      */ "not an e
6620: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
6630: 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20  LITE_ERROR      
6640: 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65   */ "SQL logic e
6650: 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20  rror or missing 
6660: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
6670: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  * SQLITE_INTERNA
6680: 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f  L    */ 0,.    /
6690: 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20  * SQLITE_PERM   
66a0: 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20       */ "access 
66b0: 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65  permission denie
66c0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
66d0: 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f  E_ABORT       */
66e0: 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65   "callback reque
66f0: 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74  sted query abort
6700: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6710: 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20  _BUSY        */ 
6720: 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  "database is loc
6730: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
6740: 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  ITE_LOCKED      
6750: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62  */ "database tab
6760: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  le is locked",. 
6770: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d     /* SQLITE_NOM
6780: 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74  EM       */ "out
6790: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20   of memory",.   
67a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f   /* SQLITE_READO
67b0: 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d  NLY    */ "attem
67c0: 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65  pt to write a re
67d0: 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22  adonly database"
67e0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
67f0: 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22  INTERRUPT   */ "
6800: 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20  interrupted",.  
6810: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52    /* SQLITE_IOER
6820: 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b  R       */ "disk
6830: 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20   I/O error",.   
6840: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   /* SQLITE_CORRU
6850: 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  PT     */ "datab
6860: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
6870: 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20  s malformed",.  
6880: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46    /* SQLITE_NOTF
6890: 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e  OUND    */ "unkn
68a0: 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a  own operation",.
68b0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55      /* SQLITE_FU
68c0: 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  LL        */ "da
68d0: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
68e0: 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20  s full",.    /* 
68f0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
6900: 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f     */ "unable to
6910: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
6920: 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ile",.    /* SQL
6930: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20  ITE_PROTOCOL    
6940: 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  */ "locking prot
6950: 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ocol",.    /* SQ
6960: 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20  LITE_EMPTY      
6970: 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61   */ "table conta
6980: 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20  ins no data",.  
6990: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45    /* SQLITE_SCHE
69a0: 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  MA      */ "data
69b0: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
69c0: 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a  changed",.    /*
69d0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20   SQLITE_TOOBIG  
69e0: 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f      */ "string o
69f0: 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c  r blob too big",
6a00: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
6a10: 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63  ONSTRAINT  */ "c
6a20: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
6a30: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
6a40: 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20  _MISMATCH    */ 
6a50: 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  "datatype mismat
6a60: 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ch",.    /* SQLI
6a70: 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a  TE_MISUSE      *
6a80: 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69  / "library routi
6a90: 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66  ne called out of
6aa0: 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20   sequence",.    
6ab0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20  /* SQLITE_NOLFS 
6ac0: 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20        */ "large 
6ad0: 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20  file support is 
6ae0: 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f  disabled",.    /
6af0: 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20  * SQLITE_AUTH   
6b00: 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69       */ "authori
6b10: 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  zation denied",.
6b20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
6b30: 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75  RMAT      */ "au
6b40: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
6b50: 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a   format error",.
6b60: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41      /* SQLITE_RA
6b70: 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69  NGE       */ "bi
6b80: 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64  nd or column ind
6b90: 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22  ex out of range"
6ba0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
6bb0: 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22  NOTADB      */ "
6bc0: 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65  file is encrypte
6bd0: 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61  d or is not a da
6be0: 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20  tabase",.  };.  
6bf0: 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 69 66  rc &= 0xff;.  if
6c00: 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20  ( ALWAYS(rc>=0) 
6c10: 26 26 20 72 63 3c 28 69 6e 74 29 28 73 69 7a 65  && rc<(int)(size
6c20: 6f 66 28 61 4d 73 67 29 2f 73 69 7a 65 6f 66 28  of(aMsg)/sizeof(
6c30: 61 4d 73 67 5b 30 5d 29 29 20 26 26 20 61 4d 73  aMsg[0])) && aMs
6c40: 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20  g[rc]!=0 ){.    
6c50: 72 65 74 75 72 6e 20 61 4d 73 67 5b 72 63 5d 3b  return aMsg[rc];
6c60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6c70: 74 75 72 6e 20 22 75 6e 6b 6e 6f 77 6e 20 65 72  turn "unknown er
6c80: 72 6f 72 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ror";.  }.}../*.
6c90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6ca0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
6cb0: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
6cc0: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
6cd0: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
6ce0: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
6cf0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
6d00: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
6d10: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
6d20: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
6d30: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
6d40: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
6d50: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
6d60: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
6d70: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
6d80: 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20  ck(. void *ptr, 
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6da0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
6db0: 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75  tion */. int cou
6dc0: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
6dd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
6de0: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
6df0: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23  een busy */.){.#
6e00: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6e10: 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56   || (defined(HAV
6e20: 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56  E_USLEEP) && HAV
6e30: 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74  E_USLEEP).  stat
6e40: 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61  ic const u8 dela
6e50: 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c  ys[] =.     { 1,
6e60: 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32   2, 5, 10, 15, 2
6e70: 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20  0, 25, 25,  25, 
6e80: 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b   50,  50, 100 };
6e90: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
6ea0: 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20  u8 totals[] =.  
6eb0: 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38     { 0, 1, 3,  8
6ec0: 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38  , 18, 33, 53, 78
6ed0: 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c  , 103, 128, 178,
6ee0: 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65   228 };.# define
6ef0: 20 4e 44 45 4c 41 59 20 28 73 69 7a 65 6f 66 28   NDELAY (sizeof(
6f00: 64 65 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28 64  delays)/sizeof(d
6f10: 65 6c 61 79 73 5b 30 5d 29 29 0a 20 20 73 71 6c  elays[0])).  sql
6f20: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
6f30: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
6f40: 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62   timeout = db->b
6f50: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e  usyTimeout;.  in
6f60: 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a  t delay, prior;.
6f70: 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
6f80: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75  >=0 );.  if( cou
6f90: 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20  nt < NDELAY ){. 
6fa0: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
6fb0: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72  s[count];.    pr
6fc0: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75  ior = totals[cou
6fd0: 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt];.  }else{.  
6fe0: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
6ff0: 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20  [NDELAY-1];.    
7000: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e  prior = totals[N
7010: 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79  DELAY-1] + delay
7020: 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d  *(count-(NDELAY-
7030: 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1));.  }.  if( p
7040: 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74  rior + delay > t
7050: 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65  imeout ){.    de
7060: 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20  lay = timeout - 
7070: 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64  prior;.    if( d
7080: 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e  elay<=0 ) return
7090: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
70a0: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
70b0: 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a  s, delay*1000);.
70c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73    return 1;.#els
70d0: 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  e.  sqlite3 *db 
70e0: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72  = (sqlite3 *)ptr
70f0: 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20  ;.  int timeout 
7100: 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74  = ((sqlite3 *)pt
7110: 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  r)->busyTimeout;
7120: 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29  .  if( (count+1)
7130: 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20  *1000 > timeout 
7140: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
7150: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
7160: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
7170: 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75  1000000);.  retu
7180: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
7190: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
71a0: 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64   given busy hand
71b0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ler..**.** This 
71c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
71d0: 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74  d when an operat
71e0: 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20  ion failed with 
71f0: 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68  a lock..** If th
7200: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
7210: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
7220: 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64   lock is retried
7230: 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75  .  If it.** retu
7240: 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61  rns 0, the opera
7250: 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68  tion aborts with
7260: 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20   an SQLITE_BUSY 
7270: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  error..*/.int sq
7280: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
7290: 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c  andler(BusyHandl
72a0: 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  er *p){.  int rc
72b0: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
72c0: 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d  =0) || p->xFunc=
72d0: 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30  =0 || p->nBusy<0
72e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
72f0: 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e  c = p->xFunc(p->
7300: 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b  pArg, p->nBusy);
7310: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
7320: 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d      p->nBusy = -
7330: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
7340: 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a  p->nBusy++;.  }.
7350: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a    return rc; .}.
7360: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
7370: 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73  ine sets the bus
7380: 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  y callback for a
7390: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
73a0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
73b0: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
73c0: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
73d0: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  en argument..*/.
73e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
73f0: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
7400: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28  te3 *db,.  int (
7410: 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e  *xBusy)(void*,in
7420: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
7430: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
7440: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7450: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79  tex);.  db->busy
7460: 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20  Handler.xFunc = 
7470: 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73  xBusy;.  db->bus
7480: 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20  yHandler.pArg = 
7490: 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79  pArg;.  db->busy
74a0: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
74b0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
74c0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
74d0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
74e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
74f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7500: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
7510: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
7520: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
7530: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
7540: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
7550: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
7560: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
7570: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
7580: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
7590: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
75a0: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
75b0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
75c0: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
75d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
75e0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
75f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
7600: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
7610: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
7620: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
7630: 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74  *pArg.){.  sqlit
7640: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
7650: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
7660: 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64   nOps>0 ){.    d
7670: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78  b->xProgress = x
7680: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62  Progress;.    db
7690: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
76a0: 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70   nOps;.    db->p
76b0: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41  ProgressArg = pA
76c0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
76d0: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
76e0: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f   0;.    db->nPro
76f0: 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20  gressOps = 0;.  
7700: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
7710: 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  rg = 0;.  }.  sq
7720: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7730: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  e(db->mutex);.}.
7740: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
7750: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74  his routine inst
7760: 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62  alls a default b
7770: 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74  usy handler that
7780: 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a   waits for the.*
7790: 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62  * specified numb
77a0: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
77b0: 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ds before return
77c0: 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ing 0..*/.int sq
77d0: 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
77e0: 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ut(sqlite3 *db, 
77f0: 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d  int ms){.  if( m
7800: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62  s>0 ){.    db->b
7810: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b  usyTimeout = ms;
7820: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
7830: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
7840: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
7850: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
7860: 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  db);.  }else{.  
7870: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
7880: 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29  andler(db, 0, 0)
7890: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
78a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
78b0: 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e  ** Cause any pen
78c0: 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74  ding operation t
78d0: 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61  o stop at its ea
78e0: 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69  rliest opportuni
78f0: 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
7900: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71  te3_interrupt(sq
7910: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
7920: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
7930: 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ed = 1;.}.../*.*
7940: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7950: 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  is exactly the s
7960: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63  ame as sqlite3_c
7970: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
7980: 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
7990: 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20   it is designed 
79a0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20  to be called by 
79b0: 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54  internal code. T
79c0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
79d0: 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61  .** that if a ma
79e0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20  lloc() fails in 
79f0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7a00: 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72  unction(), an er
7a10: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72  ror code.** is r
7a20: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
7a30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
7a40: 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69  g cleared. .*/.i
7a50: 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  nt sqlite3Create
7a60: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20  Func(.  sqlite3 
7a70: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
7a80: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  r *zFunctionName
7a90: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
7aa0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
7ab0: 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f  *pUserData,.  vo
7ac0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
7ad0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
7ae0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
7af0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
7b00: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
7b10: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
7b20: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
7b30: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
7b40: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
7b50: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
7b60: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b   *pDestructor.){
7b70: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
7b80: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61   int nName;..  a
7b90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7ba0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
7bb0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
7bc0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
7bd0: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
7be0: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
7bf0: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
7c00: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
7c10: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
7c20: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
7c30: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
7c40: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
7c50: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
7c60: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
7c70: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
7c80: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
7c90: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7ca0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
7cb0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
7cc0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
7cd0: 50 54 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64  PT;.  }.  .#ifnd
7ce0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
7cf0: 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c  TF16.  /* If SQL
7d00: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
7d10: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
7d20: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
7d30: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
7d40: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
7d50: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
7d60: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
7d70: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
7d80: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
7d90: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
7da0: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
7db0: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20  ternally..  **. 
7dc0: 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e   ** If SQLITE_AN
7dd0: 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  Y is specified, 
7de0: 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f  add three versio
7df0: 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ns of the functi
7e00: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68  on.  ** to the h
7e10: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
7e20: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
7e30: 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65  E_UTF16 ){.    e
7e40: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
7e50: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65  6NATIVE;.  }else
7e60: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
7e70: 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ANY ){.    int 
7e80: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
7e90: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
7ea0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
7eb0: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
7ec0: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 70 55  TF8,.         pU
7ed0: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
7ee0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
7ef0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
7f00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7f10: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
7f20: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
7f30: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
7f40: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
7f50: 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20 20  TE_UTF16LE,.    
7f60: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
7f70: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
7f80: 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74  Final, pDestruct
7f90: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  or);.    }.    i
7fa0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7fb0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7fc0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   rc;.    }.    e
7fd0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
7fe0: 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  6BE;.  }.#else. 
7ff0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
8000: 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  F8;.#endif.  .  
8010: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65  /* Check if an e
8020: 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  xisting function
8030: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
8040: 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e  dden or deleted.
8050: 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64   If so,.  ** and
8060: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
8070: 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75  e VMs, then retu
8080: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
8090: 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20  If a function.  
80a0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  ** is being over
80b0: 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62  ridden/deleted b
80c0: 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ut there are no 
80d0: 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f  active VMs, allo
80e0: 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  w the.  ** opera
80f0: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
8100: 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20   but invalidate 
8110: 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  all precompiled 
8120: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
8130: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
8140: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
8150: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e  FunctionName, nN
8160: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
8170: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
8180: 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d  && p->iPrefEnc==
8190: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
81a0: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
81b0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
81c0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
81d0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
81e0: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
81f0: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
8200: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
8210: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
8220: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
8230: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
8240: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
8250: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
8260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
8270: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8280: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
8290: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
82a0: 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ts(db);.    }.  
82b0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
82c0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
82d0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
82e0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
82f0: 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65  )enc, 1);.  asse
8300: 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  rt(p || db->mall
8310: 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28  ocFailed);.  if(
8320: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
8330: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8340: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
8350: 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66  older version of
8360: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69   the function wi
8370: 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20  th a configured 
8380: 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20  destructor is.  
8390: 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65  ** being replace
83a0: 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73  d invoke the des
83b0: 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e  tructor function
83c0: 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63   here. */.  func
83d0: 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20  tionDestroy(db, 
83e0: 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74  p);..  if( pDest
83f0: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
8400: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b  estructor->nRef+
8410: 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65 73  +;.  }.  p->pDes
8420: 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72  tructor = pDestr
8430: 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c 61 67  uctor;.  p->flag
8440: 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e  s = 0;.  p->xFun
8450: 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e  c = xFunc;.  p->
8460: 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20  xStep = xStep;. 
8470: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
8480: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
8490: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
84a0: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
84b0: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
84c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
84d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
84e0: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
84f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
8500: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8510: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
8520: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
8530: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
8540: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
8550: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
8560: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
8570: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
8580: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
8590: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
85a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
85b0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
85c0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
85d0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
85e0: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
85f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
8600: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
8610: 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  v2(db, zFunc, nA
8620: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
8630: 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20  c, xStep,.      
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46                xF
8660: 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74  inal, 0);.}..int
8670: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8680: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73  function_v2(.  s
8690: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
86a0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
86b0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
86c0: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
86d0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
86e0: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
86f0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8700: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
8710: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
8720: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
8730: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8740: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
8750: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
8760: 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ext*),.  void (*
8770: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
8780: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
8790: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
87a0: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
87b0: 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pArg = 0;.  sqli
87c0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
87d0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
87e0: 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( xDestroy ){.  
87f0: 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65    pArg = (FuncDe
8800: 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74  structor *)sqlit
8810: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
8820: 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  b, sizeof(FuncDe
8830: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
8840: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
8850: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
8860: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
8870: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
8880: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
8890: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
88a0: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
88b0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
88c0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
88d0: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
88e0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
88f0: 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b  , xFinal, pArg);
8900: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
8910: 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  Arg->nRef==0 ){.
8920: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
8930: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
8940: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
8950: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8960: 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a  db, pArg);.  }..
8970: 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c   out:.  rc = sql
8980: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
8990: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
89a0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
89b0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
89c0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
89d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
89e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
89f0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a  ate_function16(.
8a00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
8a10: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75   const void *zFu
8a20: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
8a30: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54  t nArg,.  int eT
8a40: 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a  extRep,.  void *
8a50: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e  p,.  void (*xFun
8a60: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
8a70: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
8a80: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
8a90: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
8aa0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
8ab0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
8ac0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
8ad0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
8ae0: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
8af0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b  .  char *zFunc8;
8b00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8b10: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8b20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
8b30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
8b40: 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c  ;.  zFunc8 = sql
8b50: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
8b60: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
8b70: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
8b80: 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20  NATIVE);.  rc = 
8b90: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
8ba0: 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
8bb0: 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
8bc0: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
8bd0: 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69  Final,0);.  sqli
8be0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46  te3DbFree(db, zF
8bf0: 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71  unc8);.  rc = sq
8c00: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
8c10: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
8c20: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8c30: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
8c40: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a   rc;.}.#endif...
8c50: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68  /*.** Declare th
8c60: 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  at a function ha
8c70: 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65  s been overloade
8c80: 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74  d by a virtual t
8c90: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
8ca0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65  he function alre
8cb0: 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20  ady exists as a 
8cc0: 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66  regular global f
8cd0: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a  unction, then.**
8ce0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8cf0: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68   a no-op.  If th
8d00: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
8d10: 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
8d20: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
8d30: 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20  one that always 
8d40: 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d  throws a run-tim
8d50: 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a  e error.  .**.**
8d60: 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61   When virtual ta
8d70: 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70  bles intend to p
8d80: 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f  rovide an overlo
8d90: 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74  aded function, t
8da0: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61  hey.** should ca
8db0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
8dc0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
8dd0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
8de0: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c   exists..** A gl
8df0: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75  obal function mu
8e00: 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65  st exist in orde
8e10: 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c  r for name resol
8e20: 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a  ution to work.**
8e30: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e   properly..*/.in
8e40: 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  t sqlite3_overlo
8e50: 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ad_function(.  s
8e60: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
8e70: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
8e80: 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20  .  int nArg.){. 
8e90: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
8ea0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
8eb0: 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  me);.  int rc;. 
8ec0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8ed0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8ee0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
8ef0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
8f00: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
8f10: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
8f20: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  0)==0 ){.    sql
8f30: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
8f40: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
8f50: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76     0, sqlite3Inv
8f80: 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  alidFunction, 0,
8f90: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63   0, 0);.  }.  rc
8fa0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
8fb0: 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  t(db, SQLITE_OK)
8fc0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
8fd0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
8fe0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
8ff0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
9000: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
9010: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
9020: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
9030: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
9040: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
9050: 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
9060: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
9070: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
9080: 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
9090: 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
90a0: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
90b0: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
90c0: 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
90d0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
90e0: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
90f0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
9100: 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
9110: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ment..*/.void *s
9120: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
9130: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28  ite3 *db, void (
9140: 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
9150: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
9160: 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
9170: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
9180: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
9190: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
91a0: 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67   = db->pTraceArg
91b0: 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
91c0: 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70   xTrace;.  db->p
91d0: 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
91e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
91f0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9200: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
9210: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ;.}./*.** Regist
9220: 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e  er a profile fun
9230: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
9240: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
9250: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
9260: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  .** profile func
9270: 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
9280: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
9290: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
92a0: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
92b0: 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65  profiling is exe
92c0: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
92d0: 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73  LL.** profile is
92e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
92f0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
9300: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
9310: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a  conclusion of.**
9320: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
9330: 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e  ent that is run.
9340: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
9350: 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c  3_profile(.  sql
9360: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
9370: 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69   (*xProfile)(voi
9380: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  d*,const char*,s
9390: 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20  qlite_uint64),. 
93a0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
93b0: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
93c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
93d0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
93e0: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
93f0: 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
9400: 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
9410: 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
9420: 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
9430: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9440: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9450: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
9460: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9470: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
9480: 0a 2f 2a 2a 2a 20 45 58 50 45 52 49 4d 45 4e 54  ./*** EXPERIMENT
9490: 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67  AL ***.**.** Reg
94a0: 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e  ister a function
94b0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77   to be invoked w
94c0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
94d0: 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49  n comments..** I
94e0: 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75  f the invoked fu
94f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
9500: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
9510: 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73  e commit becomes
9520: 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a   a.** rollback..
9530: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
9540: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20  _commit_hook(.  
9550: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
9560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
9570: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
9580: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
9590: 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
95a0: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20  ck)(void*),  /* 
95b0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f  Function to invo
95c0: 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69  ke on each commi
95d0: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  t */.  void *pAr
95e0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
95f0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
9600: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
9610: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
9620: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9630: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9640: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
9650: 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62  pCommitArg;.  db
9660: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
9670: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
9680: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20   db->pCommitArg 
9690: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
96a0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
96b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
96c0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pOld;.}../*.*
96d0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
96e0: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
96f0: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
9700: 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
9710: 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
9720: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
9730: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
9740: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
9750: 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68  sqlite3_update_h
9760: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
9770: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
9780: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
9790: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
97a0: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
97b0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
97c0: 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
97d0: 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c   *,char const *,
97e0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20  sqlite_int64),. 
97f0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
9800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
9810: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
9820: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
9830: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
9840: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
9850: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
9860: 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74  Ret = db->pUpdat
9870: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64  eArg;.  db->xUpd
9880: 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  ateCallback = xC
9890: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
98a0: 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67  UpdateArg = pArg
98b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
98c0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
98d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
98e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  t;.}../*.** Regi
98f0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
9900: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
9910: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
9920: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a  ction is rolled.
9930: 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20  ** back by this 
9940: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
9950: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
9960: 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68  lite3_rollback_h
9970: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
9980: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
9990: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
99a0: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
99b0: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
99c0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
99d0: 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  *), /* Callback 
99e0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
99f0: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
9a00: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
9a10: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
9a20: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
9a30: 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
9a40: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
9a50: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
9a60: 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   = db->pRollback
9a70: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c  Arg;.  db->xRoll
9a80: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78  backCallback = x
9a90: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
9aa0: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70  pRollbackArg = p
9ab0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
9ac0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9ad0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9ae0: 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  pRet;.}..#ifdef 
9af0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
9b00: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a  EUPDATE_HOOK./*.
9b10: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
9b20: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
9b30: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
9b40: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
9b50: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
9b60: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
9b70: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
9b80: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
9b90: 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61  *sqlite3_preupda
9ba0: 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  te_hook(.  sqlit
9bb0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9bc0: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
9bd0: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
9be0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
9bf0: 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 20  id(*xCallback)( 
9c00: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 62          /* Callb
9c10: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
9c20: 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74 65      void*,sqlite
9c30: 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  3*,int,char cons
9c40: 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 73  t*,char const*,s
9c50: 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71 6c  qlite3_int64,sql
9c60: 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20 76  ite3_int64),.  v
9c70: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
9c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
9c90: 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d  t callback argum
9ca0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ent */.){.  void
9cb0: 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
9cc0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
9cd0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
9ce0: 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74   = db->pPreUpdat
9cf0: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 65  eArg;.  db->xPre
9d00: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
9d10: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
9d20: 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 20  ->pPreUpdateArg 
9d30: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
9d40: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
9d50: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
9d60: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
9d70: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
9d80: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
9d90: 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
9da0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
9db0: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
9dc0: 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
9dd0: 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
9de0: 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  y sqlite3_wal_au
9df0: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a  tocheckpoint()..
9e00: 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ** Invoke sqlite
9e10: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
9e20: 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
9e30: 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  f frames in the 
9e40: 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67  log file.** is g
9e50: 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69  reater than sqli
9e60: 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74  te3.pWalArg cast
9e70: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28   to an integer (
9e80: 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
9e90: 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61  ured by.** wal_a
9ea0: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29  utocheckpoint())
9eb0: 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65  ..*/ .int sqlite
9ec0: 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28  3WalDefaultHook(
9ed0: 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74  .  void *pClient
9ee0: 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67  Data,     /* Arg
9ef0: 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ument */.  sqlit
9f00: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9f10: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
9f20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9f30: 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44  *zDb,       /* D
9f40: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
9f50: 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20 20   nFrame         
9f60: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57      /* Size of W
9f70: 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e  AL */.){.  if( n
9f80: 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54  Frame>=SQLITE_PT
9f90: 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74  R_TO_INT(pClient
9fa0: 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c  Data) ){.    sql
9fb0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
9fc0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
9fd0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
9fe0: 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
9ff0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
a000: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
a010: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a020: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
a030: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
a040: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  */../*.** Config
a050: 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77  ure an sqlite3_w
a060: 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61  al_hook() callba
a070: 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61  ck to automatica
a080: 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  lly checkpoint.*
a090: 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66 74  * a database aft
a0a0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
a0b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
a0c0: 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20  here are nFrame 
a0d0: 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65  or.** more frame
a0e0: 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
a0f0: 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20  e. Passing zero 
a100: 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  or a negative va
a110: 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46  lue as the.** nF
a120: 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64  rame parameter d
a130: 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69  isables automati
a140: 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e  c checkpoints en
a150: 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  tirely..**.** Th
a160: 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  e callback regis
a170: 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
a180: 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20  nction replaces 
a190: 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c  any existing cal
a1a0: 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65  lback.** registe
a1b0: 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  red using sqlite
a1c0: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69  3_wal_hook(). Li
a1d0: 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65 72  kewise, register
a1e0: 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a  ing a callback.*
a1f0: 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  * using sqlite3_
a200: 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62  wal_hook() disab
a210: 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69  les the automati
a220: 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63  c checkpoint mec
a230: 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67  hanism.** config
a240: 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ured by this fun
a250: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
a260: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
a270: 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
a280: 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65   *db, int nFrame
a290: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
a2a0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53  _OMIT_WAL.  UNUS
a2b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
a2c0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
a2d0: 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65  ETER(nFrame);.#e
a2e0: 6c 73 65 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  lse.  if( nFrame
a2f0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
a300: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73  3_wal_hook(db, s
a310: 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
a320: 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54  Hook, SQLITE_INT
a330: 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29  _TO_PTR(nFrame))
a340: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
a350: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
a360: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23  db, 0, 0);.  }.#
a370: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
a380: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a390: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
a3a0: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
a3b0: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
a3c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
a3d0: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
a3e0: 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d  the write-ahead-
a3f0: 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61  log by this data
a400: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
a410: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
a420: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71  3_wal_hook(.  sq
a430: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a450: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
a460: 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64   to this db hand
a470: 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61  le */.  int(*xCa
a480: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20  llback)(void *, 
a490: 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20  sqlite3*, const 
a4a0: 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76  char*, int),.  v
a4b0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a4d0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
a4e0: 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c   passed to xCall
a4f0: 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66  back() */.){.#if
a500: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a510: 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65  _WAL.  void *pRe
a520: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
a530: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
a540: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
a550: 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d  ->pWalArg;.  db-
a560: 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20  >xWalCallback = 
a570: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
a580: 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b  >pWalArg = pArg;
a590: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a5a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a5b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
a5c0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
a5d0: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
a5e0: 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
a5f0: 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a  atabase zDb..*/.
a600: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
a610: 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20  checkpoint_v2(. 
a620: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
a650: 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
a660: 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
a670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
a680: 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
a690: 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20  abase (or NULL) 
a6a0: 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20  */.  int eMode, 
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6c0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43       /* SQLITE_C
a6d0: 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75  HECKPOINT_* valu
a6e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f  e */.  int *pnLo
a6f0: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
a700: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
a710: 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69  ize of WAL log i
a720: 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  n frames */.  in
a730: 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20  t *pnCkpt       
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a750: 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62   OUT: Total numb
a760: 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65  er of frames che
a770: 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a  ckpointed */.){.
a780: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
a790: 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20  IT_WAL.  return 
a7a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
a7b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
a7e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  e */.  int iDb =
a7f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
a800: 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65  CHED;  /* sqlite
a810: 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66  3.aDb[] index of
a820: 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e   db to checkpoin
a830: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  t */..  /* Initi
a840: 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
a850: 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31   variables to -1
a860: 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
a870: 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69  r occurs. */.  i
a880: 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f  f( pnLog ) *pnLo
a890: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e  g = -1;.  if( pn
a8a0: 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d  Ckpt ) *pnCkpt =
a8b0: 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   -1;..  assert( 
a8c0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
a8d0: 54 5f 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48  T_FULL>SQLITE_CH
a8e0: 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
a8f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
a900: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
a910: 46 55 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43  FULL<SQLITE_CHEC
a920: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29  KPOINT_RESTART )
a930: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
a940: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
a950: 53 53 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f  SSIVE+2==SQLITE_
a960: 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41  CHECKPOINT_RESTA
a970: 52 54 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  RT );.  if( eMod
a980: 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e<SQLITE_CHECKPO
a990: 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65  INT_PASSIVE || e
a9a0: 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43  Mode>SQLITE_CHEC
a9b0: 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29  KPOINT_RESTART )
a9c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a9d0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
a9e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a9f0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
aa00: 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20  );.  if( zDb && 
aa10: 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44  zDb[0] ){.    iD
aa20: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
aa30: 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
aa40: 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20    }.  if( iDb<0 
aa50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
aa60: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
aa70: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
aa80: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e  QLITE_ERROR, "un
aa90: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20  known database: 
aaa0: 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c  %s", zDb);.  }el
aab0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
aac0: 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64  ite3Checkpoint(d
aad0: 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70  b, iDb, eMode, p
aae0: 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
aaf0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
ab00: 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a  db, rc, 0);.  }.
ab10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
ab20: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
ab30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ab40: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
ab50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
ab60: 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.}.../*.** C
ab70: 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61  heckpoint databa
ab80: 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69  se zDb. If zDb i
ab90: 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68  s NULL, or if th
aba0: 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69  e buffer zDb poi
abb0: 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69  nts.** to contai
abc0: 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ns a zero-length
abd0: 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74   string, all att
abe0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
abf0: 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69  are .** checkpoi
ac00: 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nted..*/.int sql
ac10: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
ac20: 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
ac30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
ac40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
ac50: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
ac60: 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 53  nt_v2(db, zDb, S
ac70: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
ac80: 5f 50 41 53 53 49 56 45 2c 20 30 2c 20 30 29 3b  _PASSIVE, 0, 0);
ac90: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
aca0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
acb0: 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69  * Run a checkpoi
acc0: 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69  nt on database i
acd0: 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  Db. This is a no
ace0: 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20  -op if database 
acf0: 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75  iDb is.** not cu
ad00: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20  rrently open in 
ad10: 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  WAL mode..**.** 
ad20: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
ad30: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   is open on the 
ad40: 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63  database being c
ad50: 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69  heckpointed, thi
ad60: 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
ad70: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f  eturns SQLITE_LO
ad80: 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b  CKED and a check
ad90: 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74  point is not att
ada0: 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61  empted. If .** a
adb0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
adc0: 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65  hile running the
add0: 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20   checkpoint, an 
ade0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
adf0: 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
ae00: 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49  d (i.e. SQLITE_I
ae10: 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65  OERR). Otherwise
ae20: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
ae30: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20  ** The mutex on 
ae40: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
ae50: 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  db should be hel
ae60: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
ae70: 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73   The mutex.** as
ae80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
ae90: 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65  e specific b-tre
aea0: 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
aeb0: 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79  nted is taken by
aec0: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
aed0: 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63  n while the chec
aee0: 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e  kpoint is runnin
aef0: 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20  g..**.** If iDb 
af00: 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45  is passed SQLITE
af10: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74  _MAX_ATTACHED, t
af20: 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64  hen all attached
af30: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a   databases are.*
af40: 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20  * checkpointed. 
af50: 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
af60: 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
af70: 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
af80: 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74  ately -.** no at
af90: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
afa0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20   checkpoint any 
afb0: 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61  remaining databa
afc0: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ses..**.** Param
afd0: 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e  eter eMode is on
afe0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43  e of SQLITE_CHEC
aff0: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
b000: 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e  FULL or RESTART.
b010: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
b020: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
b030: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
b040: 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a  int eMode, int *
b050: 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b  pnLog, int *pnCk
b060: 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pt){.  int rc = 
b070: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
b080: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
b090: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
b0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b0b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
b0c0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
b0d0: 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64  rough attached d
b0e0: 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73  bs */.  int bBus
b0f0: 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
b100: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
b110: 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68  if SQLITE_BUSY h
b120: 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  as been encounte
b130: 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  red */..  assert
b140: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b150: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
b160: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
b170: 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d  Log || *pnLog==-
b180: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
b190: 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70  pnCkpt || *pnCkp
b1a0: 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28  t==-1 );..  for(
b1b0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26  i=0; i<db->nDb &
b1c0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
b1d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
b1e0: 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51  ==iDb || iDb==SQ
b1f0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
b200: 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
b210: 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63  sqlite3BtreeChec
b220: 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69  kpoint(db->aDb[i
b230: 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e  ].pBt, eMode, pn
b240: 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
b250: 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20      pnLog = 0;. 
b260: 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b       pnCkpt = 0;
b270: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b280: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
b290: 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b        bBusy = 1;
b2a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
b2b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
b2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
b2d0: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
b2e0: 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20  _OK && bBusy) ? 
b2f0: 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
b300: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
b310: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
b320: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b330: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
b340: 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72  ue if main-memor
b350: 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
b360: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61   instead of.** a
b370: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
b380: 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61  for transient pa
b390: 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74  ger files and st
b3a0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
b3b0: 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
b3c0: 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20  eturned depends 
b3d0: 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
b3e0: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28  db->temp_store (
b3f0: 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d  runtime.** param
b400: 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f  eter) and the co
b410: 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
b420: 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   of SQLITE_TEMP_
b430: 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f  STORE. The.** fo
b440: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
b450: 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61  scribes the rela
b460: 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
b470: 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65   these two value
b480: 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75  s.** and this fu
b490: 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76  nctions return v
b4a0: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51  alue..**.**   SQ
b4b0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
b4c0: 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
b4d0: 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
b4e0: 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
b4f0: 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
b500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
b510: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
b520: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
b530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b540: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
b560: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
b570: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
b580: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5a0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
b5b0: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
b5c0: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
b5f0: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
b600: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
b610: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
b620: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
b630: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
b640: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
b650: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
b660: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
b680: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
b690: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
b6d0: 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 1).**   2     
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
b700: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
b710: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20  turn 1).**   3  
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
b740: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
b750: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e  (return 1).*/.in
b760: 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  t sqlite3TempInM
b770: 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69  emory(const sqli
b780: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51  te3 *db){.#if SQ
b790: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
b7a0: 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =1.  return ( db
b7b0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
b7c0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
b7d0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
b7e0: 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =2.  return ( db
b7f0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
b800: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
b810: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
b820: 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  =3.  return 1;.#
b830: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
b840: 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c  _TEMP_STORE<1 ||
b850: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
b860: 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b  RE>3.  return 0;
b870: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
b880: 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e   Return UTF-8 en
b890: 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
b8a0: 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
b8b0: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
b8c0: 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
b8d0: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
b8e0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71  qlite3_errmsg(sq
b8f0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
b900: 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
b910: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
b920: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
b930: 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
b940: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
b950: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
b960: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
b970: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
b980: 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d  3ErrStr(SQLITE_M
b990: 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d  ISUSE_BKPT);.  }
b9a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b9b0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
b9c0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
b9d0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b9e0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
b9f0: 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
ba00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
ba10: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
ba20: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d  3_value_text(db-
ba30: 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65  >pErr);.    asse
ba40: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
ba50: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
ba60: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   z==0 ){.      z
ba70: 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
ba80: 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20  (db->errCode);. 
ba90: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
baa0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
bab0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
bac0: 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
bad0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
bae0: 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  F16./*.** Return
baf0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
bb00: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
bb10: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
bb20: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
bb30: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
bb40: 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
bb50: 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65  _errmsg16(sqlite
bb60: 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
bb70: 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66   const u16 outOf
bb80: 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f  Mem[] = {.    'o
bb90: 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
bba0: 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c  , 'o', 'f', ' ',
bbb0: 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20   'm', 'e', 'm', 
bbc0: 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30  'o', 'r', 'y', 0
bbd0: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
bbe0: 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b  onst u16 misuse[
bbf0: 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27  ] = {.    'l', '
bc00: 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61  i', 'b', 'r', 'a
bc10: 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27  ', 'r', 'y', ' '
bc20: 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c  , .    'r', 'o',
bc30: 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20   'u', 't', 'i', 
bc40: 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a  'n', 'e', ' ', .
bc50: 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c      'c', 'a', 'l
bc60: 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27  ', 'l', 'e', 'd'
bc70: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
bc80: 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
bc90: 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27  .    'o', 'f', '
bca0: 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65   ', .    's', 'e
bcb0: 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27  ', 'q', 'u', 'e'
bcc0: 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c  , 'n', 'c', 'e',
bcd0: 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
bce0: 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
bcf0: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
bd00: 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
bd10: 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
bd20: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
bd30: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
bd40: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
bd50: 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
bd60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bd70: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
bd80: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
bd90: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
bda0: 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
bdb0: 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
bdc0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
bdd0: 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
bde0: 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
bdf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
be00: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
be10: 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71  db->pErr, -1, sq
be20: 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
be30: 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20  errCode),.      
be40: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
be50: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
be60: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
be70: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
be80: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
be90: 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  }.    /* A mallo
bea0: 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69  c() may have fai
beb0: 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  led within the c
bec0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  all to sqlite3_v
bed0: 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20  alue_text16().  
bee0: 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
bef0: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
bf00: 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
bf10: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
bf20: 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
bf30: 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
bf40: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20  e returning. Do 
bf50: 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69  this directly, i
bf60: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20  nstead of via.  
bf70: 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45    ** sqlite3ApiE
bf80: 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20  xit(), to avoid 
bf90: 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61  setting the data
bfa0: 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f  base handle erro
bfb0: 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a  r message..    *
bfc0: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
bfd0: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  Failed = 0;.  }.
bfe0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bff0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
c000: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
c010: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
c020: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
c030: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
c040: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
c050: 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
c060: 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
c070: 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
c080: 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
c090: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
c0a0: 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
c0b0: 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
c0c0: 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
c0d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c0e0: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
c0f0: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
c100: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
c110: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
c120: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
c130: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
c140: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
c150: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
c160: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
c170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
c180: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
c190: 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
c1a0: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
c1b0: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
c1c0: 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
c1d0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
c1e0: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
c1f0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
c200: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
c210: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
c220: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
c230: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
c240: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
c250: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
c260: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
c270: 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a   db->errCode;.}.
c280: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
c290: 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  new collating fu
c2a0: 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62  nction for datab
c2b0: 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e  ase "db".  The n
c2c0: 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20  ame is zName.** 
c2d0: 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  and the encoding
c2e0: 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74   is enc..*/.stat
c2f0: 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c  ic int createCol
c300: 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
c310: 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3* db,.  const c
c320: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75  har *zName, .  u
c330: 38 20 65 6e 63 2c 0a 20 20 75 38 20 63 6f 6c 6c  8 enc,.  u8 coll
c340: 54 79 70 65 2c 0a 20 20 76 6f 69 64 2a 20 70 43  Type,.  void* pC
c350: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
c360: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
c370: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
c380: 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
c390: 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
c3a0: 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
c3b0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
c3c0: 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  2;.  int nName =
c3d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c3e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73  (zName);.  .  as
c3f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c400: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
c410: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
c420: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
c430: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
c440: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
c450: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
c460: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
c470: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
c480: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
c490: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
c4a0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
c4b0: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
c4c0: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
c4d0: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
c4e0: 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a  /.  enc2 = enc;.
c4f0: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
c500: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
c510: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
c520: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
c530: 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66  _ALIGNED );.  if
c540: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
c550: 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51  TF16 || enc2==SQ
c560: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
c570: 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d  ED ){.    enc2 =
c580: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
c590: 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  IVE;.  }.  if( e
c5a0: 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20  nc2<SQLITE_UTF8 
c5b0: 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55  || enc2>SQLITE_U
c5c0: 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65  TF16BE ){.    re
c5d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
c5e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
c5f0: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
c600: 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
c610: 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
c620: 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
c630: 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
c640: 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
c650: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
c660: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
c670: 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
c680: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
c690: 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
c6a0: 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
c6b0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
c6c0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
c6d0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
c6e0: 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
c6f0: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 0);.  if( pCo
c700: 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
c710: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  p ){.    if( db-
c720: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 29  >activeVdbeCnt )
c730: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c740: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
c750: 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
c760: 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
c770: 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f  /modify collatio
c780: 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74  n sequence due t
c790: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
c7a0: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  nts");.      ret
c7b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
c7c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c7d0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
c7e0: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
c7f0: 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
c800: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
c810: 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
c820: 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
c830: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
c840: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c850: 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
c860: 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
c870: 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
c880: 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
c890: 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
c8a0: 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
c8b0: 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
c8c0: 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
c8d0: 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
c8e0: 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
c8f0: 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
c900: 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
c910: 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
c920: 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
c930: 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
c940: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
c950: 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
c960: 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
c970: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
c980: 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
c990: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
c9a0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
c9b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33      for(j=0; j<3
c9c0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
c9d0: 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43  CollSeq *p = &aC
c9e0: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
c9f0: 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  if( p->enc==pCol
ca00: 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20  l->enc ){.      
ca10: 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20      if( p->xDel 
ca20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
ca30: 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29  ->xDel(p->pUser)
ca40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ca50: 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20          p->xCmp 
ca60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
ca70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ca80: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ..  pColl = sqli
ca90: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
caa0: 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
cab0: 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
cac0: 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oll==0 ) return 
cad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cae0: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43  pColl->xCmp = xC
caf0: 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d  ompare;.  pColl-
cb00: 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20  >pUser = pCtx;. 
cb10: 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78   pColl->xDel = x
cb20: 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e  Del;.  pColl->en
cb30: 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20  c = (u8)(enc2 | 
cb40: 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54  (enc & SQLITE_UT
cb50: 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20  F16_ALIGNED));. 
cb60: 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 63   pColl->type = c
cb70: 6f 6c 6c 54 79 70 65 3b 0a 20 20 73 71 6c 69 74  ollType;.  sqlit
cb80: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
cb90: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74  TE_OK, 0);.  ret
cba0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cbb0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72  .../*.** This ar
cbc0: 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64  ray defines hard
cbd0: 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e   upper bounds on
cbe0: 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20   limit values.  
cbf0: 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  The.** initializ
cc00: 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20  er must be kept 
cc10: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
cc20: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a   SQLITE_LIMIT_*.
cc30: 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73  ** #defines in s
cc40: 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61  qlite3.h..*/.sta
cc50: 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48  tic const int aH
cc60: 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  ardLimit[] = {. 
cc70: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
cc80: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
cc90: 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _SQL_LENGTH,.  S
cca0: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
ccb0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ,.  SQLITE_MAX_E
ccc0: 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  XPR_DEPTH,.  SQL
ccd0: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
cce0: 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54  _SELECT,.  SQLIT
ccf0: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20  E_MAX_VDBE_OP,. 
cd00: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
cd10: 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49  TION_ARG,.  SQLI
cd20: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
cd30: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  .  SQLITE_MAX_LI
cd40: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
cd50: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
cd60: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
cd70: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  .  SQLITE_MAX_TR
cd80: 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a  IGGER_DEPTH,.};.
cd90: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
cda0: 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
cdb0: 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
cdc0: 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
cdd0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
cde0: 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
cdf0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
ce00: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
ce10: 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
ce20: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
ce30: 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
ce40: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
ce50: 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
ce60: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
ce70: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
ce80: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
ce90: 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
cea0: 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
ceb0: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
cec0: 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
ced0: 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
cee0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
cef0: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
cf00: 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
cf10: 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
cf20: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
cf30: 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
cf40: 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
cf50: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
cf60: 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
cf70: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
cf80: 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
cf90: 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
cfa0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
cfb0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
cfc0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
cfd0: 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30  UNCTION_ARG>1000
cfe0: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
cff0: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
d000: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
d010: 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64   0 and 1000.#end
d020: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
d030: 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
d040: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
d050: 48 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53  HED>62.# error S
d060: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
d070: 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
d080: 65 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64  en 0 and 62.#end
d090: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
d0a0: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
d0b0: 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  ENGTH<1.# error 
d0c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
d0d0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d  PATTERN_LENGTH m
d0e0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
d0f0: 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
d100: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33  ITE_MAX_COLUMN>3
d110: 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  2767.# error SQL
d120: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d  ITE_MAX_COLUMN m
d130: 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33  ust not exceed 3
d140: 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20  2767.#endif.#if 
d150: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
d160: 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72  ER_DEPTH<1.# err
d170: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  or SQLITE_MAX_TR
d180: 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74  IGGER_DEPTH must
d190: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
d1a0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
d1b0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
d1c0: 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f  f a limit.  Repo
d1d0: 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
d1e0: 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c  ..** If an inval
d1f0: 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69  id limit index i
d200: 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f  s supplied, repo
d210: 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e  rt -1..** Make n
d220: 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74  o changes but st
d230: 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f  ill report the o
d240: 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a  ld value if the.
d250: 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20  ** new limit is 
d260: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
d270: 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69  A new lower limi
d280: 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e  t does not shrin
d290: 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74  k existing const
d2a0: 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72  ructs..** It mer
d2b0: 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ely prevents new
d2c0: 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74   constructs that
d2d0: 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69   exceed the limi
d2e0: 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e  t.** from formin
d2f0: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
d300: 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20  3_limit(sqlite3 
d310: 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64  *db, int limitId
d320: 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b  , int newLimit){
d330: 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b  .  int oldLimit;
d340: 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ...  /* EVIDENCE
d350: 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
d360: 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
d370: 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
d380: 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
d390: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
d3a0: 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
d3b0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
d3c0: 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
d3d0: 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
d3e0: 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
d3f0: 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
d400: 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
d410: 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
d420: 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
d430: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d440: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d450: 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
d460: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
d470: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
d480: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d490: 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
d4a0: 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
d4b0: 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
d4c0: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
d4d0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
d4e0: 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
d4f0: 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
d500: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
d510: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
d520: 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
d530: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
d540: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
d550: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
d560: 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
d570: 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
d580: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
d590: 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
d5a0: 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
d5b0: 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
d5c0: 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
d5d0: 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
d5e0: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
d5f0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
d600: 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
d610: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
d620: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
d630: 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
d640: 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
d650: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
d660: 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
d670: 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
d680: 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
d690: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
d6a0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
d6e0: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
d6f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
d700: 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
d710: 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
d720: 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
d730: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
d740: 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
d750: 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
d760: 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
d770: 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
d780: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
d790: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
d7a0: 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
d7b0: 5f 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f  _DEPTH==(SQLITE_
d7c0: 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
d7d0: 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
d7e0: 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
d7f0: 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
d800: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
d810: 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
d820: 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
d830: 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
d840: 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
d850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
d860: 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
d870: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
d880: 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
d890: 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
d8a0: 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
d8b0: 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
d8c0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
d8d0: 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
d8e0: 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
d8f0: 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
d900: 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
d910: 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
d940: 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  35419 */.}../*.*
d950: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
d960: 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
d970: 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61  opening a databa
d980: 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a  se on behalf of.
d990: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
d9a0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70  ) and sqlite3_op
d9b0: 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61  en16(). The data
d9c0: 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a  base filename "z
d9d0: 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69  Filename"  .** i
d9e0: 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e  s UTF-8 encoded.
d9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
da00: 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63  penDatabase(.  c
da10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
da20: 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73  name, /* Databas
da30: 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38  e filename UTF-8
da40: 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71   encoded */.  sq
da50: 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
da60: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
da70: 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68  urned database h
da80: 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67  andle */.  unsig
da90: 6e 65 64 20 66 6c 61 67 73 2c 20 20 20 20 20 20  ned flags,      
daa0: 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c    /* Operational
dab0: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
dac0: 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
dad0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
dae0: 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  e VFS to use */.
daf0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
db00: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
db10: 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 0a  t isThreadsafe;.
db20: 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
db30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
db40: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
db50: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
db60: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
db70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
db80: 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ndif..  /* Only 
db90: 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
dba0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
dbb0: 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
dbc0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
dbd0: 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
dbe0: 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
dbf0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
dc00: 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
dc10: 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
dc20: 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
dc30: 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
dc40: 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
dc50: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
dc60: 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
dc70: 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
dc80: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
dc90: 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
dca0: 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
dcb0: 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
dcc0: 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
dcd0: 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
dce0: 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
dcf0: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
dd00: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
dd10: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
dd20: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
dd30: 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
dd40: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
dd50: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
dd60: 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
dd70: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
dd80: 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
dd90: 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
dda0: 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
ddb0: 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
ddc0: 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
ddd0: 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
dde0: 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
ddf0: 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
de00: 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
de10: 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
de20: 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
de30: 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
de40: 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
de50: 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72 65   & 0x46)==0 ) re
de60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
de70: 53 45 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  SE;..  if( sqlit
de80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
de90: 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a  CoreMutex==0 ){.
dea0: 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
deb0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
dec0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
ded0: 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b  _OPEN_NOMUTEX ){
dee0: 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
def0: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
df00: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
df10: 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
df20: 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
df30: 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  safe = 1;.  }els
df40: 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  e{.    isThreads
df50: 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  afe = sqlite3Glo
df60: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
df70: 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  utex;.  }.  if( 
df80: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
df90: 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
dfa0: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d   ){.    flags &=
dfb0: 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48   ~SQLITE_OPEN_SH
dfc0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c  AREDCACHE;.  }el
dfd0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  se if( sqlite3Gl
dfe0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
dff0: 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b  dCacheEnabled ){
e000: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
e010: 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
e020: 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CACHE;.  }..  /*
e030: 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20   Remove harmful 
e040: 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c  bits from the fl
e050: 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ags parameter.  
e060: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49  **.  ** The SQLI
e070: 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
e080: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  and SQLITE_OPEN_
e090: 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20  FULLMUTEX flags 
e0a0: 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20  were.  ** dealt 
e0b0: 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76  with in the prev
e0c0: 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e  ious code block.
e0d0: 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c    Besides these,
e0e0: 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76   the only.  ** v
e0f0: 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73  alid input flags
e100: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65   for sqlite3_ope
e110: 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54  n_v2() are SQLIT
e120: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
e130: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
e140: 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c  N_READWRITE, SQL
e150: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
e160: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
e170: 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53  REDCACHE,.  ** S
e180: 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
e190: 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d  TECACHE, and som
e1a0: 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e  e reserved bits.
e1b0: 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a    Silently mask.
e1c0: 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68    ** off all oth
e1d0: 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20  er flags..  */. 
e1e0: 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51   flags &=  ~( SQ
e1f0: 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
e200: 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
e210: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
e220: 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
e230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e240: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
e250: 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20  _DB |.          
e260: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
e270: 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20  _TEMP_DB | .    
e280: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
e290: 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
e2a0: 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
e2b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
e2c0: 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
e2d0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
e2e0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
e2f0: 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  P_JOURNAL | .   
e300: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e310: 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
e320: 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
e330: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
e340: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
e350: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
e360: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
e370: 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20  UTEX |.         
e380: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
e390: 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20  N_FULLMUTEX |.  
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
e3b0: 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20  ITE_OPEN_WAL.   
e3c0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20            );..  
e3d0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
e3e0: 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75  sqlite data stru
e3f0: 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20  cture */.  db = 
e400: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
e410: 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  o( sizeof(sqlite
e420: 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d  3) );.  if( db==
e430: 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f  0 ) goto opendb_
e440: 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72  out;.  if( isThr
e450: 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64  eadsafe ){.    d
e460: 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  b->mutex = sqlit
e470: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
e480: 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
e490: 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62  IVE);.    if( db
e4a0: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
e4b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e4c0: 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d  (db);.      db =
e4d0: 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   0;.      goto o
e4e0: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
e4f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
e500: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
e510: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
e520: 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64  Mask = 0xff;.  d
e530: 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62  b->nDb = 2;.  db
e540: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
e550: 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64  _MAGIC_BUSY;.  d
e560: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
e570: 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72  Static;..  asser
e580: 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t( sizeof(db->aL
e590: 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48  imit)==sizeof(aH
e5a0: 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d  ardLimit) );.  m
e5b0: 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74  emcpy(db->aLimit
e5c0: 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69  , aHardLimit, si
e5d0: 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
e5e0: 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  );.  db->autoCom
e5f0: 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e  mit = 1;.  db->n
e600: 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b  extAutovac = -1;
e610: 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  .  db->nextPages
e620: 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66  ize = 0;.  db->f
e630: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
e640: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
e650: 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 20  QLITE_AutoIndex 
e660: 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
e670: 72 69 67 67 65 72 0a 23 69 66 20 53 51 4c 49 54  rigger.#if SQLIT
e680: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
e690: 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
e6a0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
e6b0: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
e6c0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
e6d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
e6e0: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
e700: 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
e710: 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
e720: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
e730: 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
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 52 65 63 54 72 69   | SQLITE_RecTri
e760: 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
e770: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
e780: 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
e790: 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
e7a0: 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
e7b0: 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
e7c0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
e7d0: 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
e7e0: 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
e7f0: 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
e800: 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
e810: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e820: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
e830: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
e840: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
e850: 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73  ndif..  db->pVfs
e860: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
e870: 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
e880: 20 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20   !db->pVfs ){.  
e890: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
e8a0: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
e8b0: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e  Error(db, rc, "n
e8c0: 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
e8d0: 20 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f   zVfs);.    goto
e8e0: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
e8f0: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64  ..  /* Add the d
e900: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
e910: 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
e920: 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66  . BINARY works f
e930: 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20  or both UTF-8.  
e940: 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73  ** and UTF-16, s
e950: 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20  o add a version 
e960: 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69  for each to avoi
e970: 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72  d any unnecessar
e980: 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f  y.  ** conversio
e990: 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72  ns. The only err
e9a0: 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75  or that can occu
e9b0: 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c  r here is a mall
e9c0: 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20  oc() failure..  
e9d0: 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  */.  createColla
e9e0: 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
e9f0: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
ea00: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41  SQLITE_COLL_BINA
ea10: 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  RY, 0,.         
ea20: 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c           binColl
ea30: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
ea40: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
ea50: 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
ea60: 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45  _UTF16BE, SQLITE
ea70: 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c  _COLL_BINARY, 0,
ea80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ea90: 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20     binCollFunc, 
eaa0: 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
eab0: 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
eac0: 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  Y", SQLITE_UTF16
ead0: 4c 45 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  LE, SQLITE_COLL_
eae0: 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20  BINARY, 0,.     
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e               bin
eb00: 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
eb10: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
eb20: 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
eb30: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
eb40: 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 28 76 6f 69  _COLL_USER, (voi
eb50: 64 2a 29 31 2c 0a 20 20 20 20 20 20 20 20 20 20  d*)1,.          
eb60: 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46          binCollF
eb70: 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  unc, 0);.  if( d
eb80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
eb90: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
eba0: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62  db_out;.  }.  db
ebb0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71  ->pDfltColl = sq
ebc0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
ebd0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
ebe0: 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a  , "BINARY", 0);.
ebf0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44    assert( db->pD
ec00: 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20  fltColl!=0 );.. 
ec10: 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55   /* Also add a U
ec20: 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73  TF-8 case-insens
ec30: 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  itive collation 
ec40: 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63  sequence. */.  c
ec50: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
ec60: 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c  b, "NOCASE", SQL
ec70: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
ec80: 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30 2c  _COLL_NOCASE, 0,
ec90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eca0: 20 20 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69     nocaseCollati
ecb0: 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f  ngFunc, 0);..  /
ecc0: 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65  * Open the backe
ecd0: 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76  nd database driv
ece0: 65 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  er */.  db->open
ecf0: 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
ed00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
ed10: 65 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  eeOpen(zFilename
ed20: 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30  , db, &db->aDb[0
ed30: 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20  ].pBt, 0,.      
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45    flags | SQLITE
ed60: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a  _OPEN_MAIN_DB);.
ed70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ed80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
ed90: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
eda0: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72  NOMEM ){.      r
edb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
edc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
edd0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
ede0: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70   0);.    goto op
edf0: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
ee00: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
ee10: 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
ee20: 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44  maGet(db, db->aD
ee30: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
ee40: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
ee50: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
ee60: 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f  et(db, 0);...  /
ee70: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61  * The default sa
ee80: 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74  fety_level for t
ee90: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
eea0: 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20   is 'full'; for 
eeb0: 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61  the temp.  ** da
eec0: 74 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f  tabase it is 'NO
eed0: 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65  NE'. This matche
eee0: 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  s the pager laye
eef0: 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20  r defaults.  .  
ef00: 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  */.  db->aDb[0].
ef10: 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  zName = "main";.
ef20: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66    db->aDb[0].saf
ef30: 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20  ety_level = 3;. 
ef40: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d   db->aDb[1].zNam
ef50: 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62  e = "temp";.  db
ef60: 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f  ->aDb[1].safety_
ef70: 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62  level = 1;..  db
ef80: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
ef90: 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69  _MAGIC_OPEN;.  i
efa0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
efb0: 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
efc0: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
efd0: 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
efe0: 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63  ll built-in func
eff0: 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f  tions, but do no
f000: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  t attempt to rea
f010: 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  d the.  ** datab
f020: 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20  ase schema yet. 
f030: 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20  This is delayed 
f040: 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
f050: 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
f060: 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73  e.  ** is access
f070: 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
f080: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
f090: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  TE_OK, 0);.  sql
f0a0: 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c  ite3RegisterBuil
f0b0: 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  tinFunctions(db)
f0c0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74  ;..  /* Load aut
f0d0: 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
f0e0: 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  s - extensions t
f0f0: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  hat have been re
f100: 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73  gistered.  ** us
f110: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
f120: 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73  automatic_extens
f130: 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a  ion() API..  */.
f140: 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61    sqlite3AutoLoa
f150: 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  dExtensions(db);
f160: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
f170: 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69  errcode(db);.  i
f180: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f190: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
f1a0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69  ndb_out;.  }..#i
f1b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f1c0: 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64  LE_FTS1.  if( !d
f1d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f1e0: 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
f1f0: 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  t sqlite3Fts1Ini
f200: 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
f210: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
f220: 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  1Init(db);.  }.#
f230: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
f240: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32  LITE_ENABLE_FTS2
f250: 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
f260: 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
f270: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f280: 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
f290: 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69  te3Fts2Init(sqli
f2a0: 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
f2b0: 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
f2c0: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
f2d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f2e0: 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28  NABLE_FTS3.  if(
f2f0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
f300: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
f310: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
f320: 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
f330: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
f340: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f350: 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20  NABLE_ICU.  if( 
f360: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
f370: 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
f380: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
f390: 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
f3a0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
f3b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f3c0: 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
f3d0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
f3e0: 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
f3f0: 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
f400: 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
f410: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
f420: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
f430: 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a  b, rc, 0);..  /*
f440: 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
f450: 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31  T_LOCKING_MODE=1
f460: 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45   makes EXCLUSIVE
f470: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
f480: 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
f490: 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   -DSQLITE_DEFAUL
f4a0: 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30  T_LOCKING_MODE=0
f4b0: 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65   make NORMAL the
f4c0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
f4d0: 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69  .  ** mode.  Doi
f4e0: 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c  ng nothing at al
f4f0: 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52  l also makes NOR
f500: 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e  MAL the default.
f510: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
f520: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
f530: 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64  ING_MODE.  db->d
f540: 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51  fltLockMode = SQ
f550: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
f560: 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c  KING_MODE;.  sql
f570: 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
f580: 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65  Mode(sqlite3Btre
f590: 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30  ePager(db->aDb[0
f5a0: 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20  ].pBt),.        
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
f5d0: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a  _LOCKING_MODE);.
f5e0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61  #endif..  /* Ena
f5f0: 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  ble the lookasid
f600: 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  e-malloc subsyst
f610: 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f  em */.  setupLoo
f620: 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71  kaside(db, 0, sq
f630: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
f640: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20  g.szLookaside,. 
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 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
f670: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
f680: 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74  aside);..  sqlit
f690: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
f6a0: 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45  point(db, SQLITE
f6b0: 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54  _DEFAULT_WAL_AUT
f6c0: 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f  OCHECKPOINT);..o
f6d0: 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28  pendb_out:.  if(
f6e0: 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72   db ){.    asser
f6f0: 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20  t( db->mutex!=0 
f700: 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d  || isThreadsafe=
f710: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f  =0 || sqlite3Glo
f720: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
f730: 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
f740: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f750: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f760: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
f770: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
f780: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f790: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
f7a0: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
f7b0: 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65      db = 0;.  }e
f7c0: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
f7d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
f7e0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
f7f0: 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a  MAGIC_SICK;.  }.
f800: 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20 20    *ppDb = db;.  
f810: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70  return sqlite3Ap
f820: 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a  iExit(0, rc);.}.
f830: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
f840: 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
f850: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
f860: 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20  3_open(.  const 
f870: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
f880: 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
f890: 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Db .){.  return 
f8a0: 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
f8b0: 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20  lename, ppDb,.  
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8d0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
f8e0: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
f8f0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
f900: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
f910: 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e  3_open_v2(.  con
f920: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
f930: 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  e,   /* Database
f940: 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38   filename (UTF-8
f950: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
f960: 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f  *ppDb,         /
f970: 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62  * OUT: SQLite db
f980: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
f990: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
f9a0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f       /* Flags */
f9b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f9c0: 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  Vfs        /* Na
f9d0: 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65  me of VFS module
f9e0: 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
f9f0: 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
fa00: 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70  ase(filename, pp
fa10: 44 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29  Db, flags, zVfs)
fa20: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
fa30: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
fa40: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
fa50: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
fa60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
fa70: 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
fa80: 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
fa90: 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
faa0: 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
fab0: 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
fac0: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
fad0: 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
fae0: 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
faf0: 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
fb00: 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
fb10: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
fb20: 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   zFilename );.  
fb30: 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a  assert( ppDb );.
fb40: 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
fb50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fb60: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
fb70: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
fb80: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
fb90: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
fba0: 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  dif.  pVal = sql
fbb0: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
fbc0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
fbd0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
fbe0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
fbf0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
fc00: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
fc10: 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
fc20: 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
fc30: 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
fc40: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
fc50: 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
fc60: 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
fc70: 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
fca0: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
fcb0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
fcc0: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
fcd0: 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
fce0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
fcf0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
fd00: 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
fd10: 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
fd20: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
fd30: 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70   ){.      ENC(*p
fd40: 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
fd50: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
fd60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
fd70: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
fd80: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
fd90: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
fda0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
fdb0: 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
fdc0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
fdd0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
fde0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
fdf0: 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
fe00: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
fe10: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
fe20: 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
fe30: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
fe40: 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
fe50: 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
fe60: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
fe70: 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
fe80: 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
fe90: 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
fea0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
feb0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
fec0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
fed0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fee0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
fef0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
ff00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
ff10: 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
ff20: 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
ff30: 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f  (u8)enc, SQLITE_
ff40: 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c  COLL_USER, pCtx,
ff50: 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
ff60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
ff70: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
ff80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ff90: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
ffa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ffb0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
ffc0: 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
ffd0: 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
ffe0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
fff0: 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
10000 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
10010 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
10020 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
10030 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
10040 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
10050 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
10060 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
10070 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
10080 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
10090 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
100a0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
100b0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
100c0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
100d0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
100e0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
100f0 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
10100 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
10110 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20  zName, (u8)enc, 
10120 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52  SQLITE_COLL_USER
10130 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
10140 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20  , xDel);.  rc = 
10150 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
10160 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
10170 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
10180 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
10190 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
101a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
101b0 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
101c0 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
101d0 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
101e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
101f0 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
10200 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
10210 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71  ollation16(.  sq
10220 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
10230 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c  nst void *zName,
10240 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
10250 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
10260 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
10270 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
10280 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
10290 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *).){.  int rc =
102a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
102b0 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71  ar *zName8;.  sq
102c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
102d0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
102e0 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
102f0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
10300 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55  Name8 = sqlite3U
10310 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d  tf16to8(db, zNam
10320 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
10330 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66  F16NATIVE);.  if
10340 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ( zName8 ){.    
10350 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
10360 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c  tion(db, zName8,
10370 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45   (u8)enc, SQLITE
10380 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78  _COLL_USER, pCtx
10390 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
103a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
103b0 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20  e(db, zName8);. 
103c0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
103d0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
103e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
103f0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
10400 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
10410 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
10420 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
10430 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
10440 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
10450 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
10460 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
10470 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
10480 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
10490 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
104a0 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
104b0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
104c0 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
104d0 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
104e0 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20  eded(.  sqlite3 
104f0 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
10500 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
10510 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
10520 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  ed)(void*,sqlite
10530 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
10540 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
10550 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10560 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10570 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
10580 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  ded = xCollNeede
10590 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  d;.  db->xCollNe
105a0 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62  eded16 = 0;.  db
105b0 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
105c0 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
105d0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
105e0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
105f0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
10600 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
10610 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10620 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
10630 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
10640 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
10650 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
10660 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
10670 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
10680 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
10690 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
106a0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
106b0 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
106c0 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
106d0 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c  _needed16(.  sql
106e0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
106f0 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
10700 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
10710 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a  lNeeded16)(void*
10720 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
10730 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69  extRep,const voi
10740 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  d*).){.  sqlite3
10750 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
10760 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
10770 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a  CollNeeded = 0;.
10780 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
10790 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  d16 = xCollNeede
107a0 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  d16;.  db->pColl
107b0 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
107c0 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
107d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
107e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
107f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10800 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
10810 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
10820 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
10830 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
10840 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ED./*.** This fu
10850 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
10860 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
10870 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
10880 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
10890 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
108a0 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
108b0 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
108c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
108d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
108e0 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
108f0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
10900 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
10910 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
10920 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
10930 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
10940 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
10950 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
10960 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
10970 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
10980 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
10990 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
109a0 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
109b0 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
109c0 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
109d0 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
109e0 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
109f0 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
10a00 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
10a10 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49  ..**.******* THI
10a20 53 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45  S IS AN EXPERIME
10a30 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20  NTAL API AND IS 
10a40 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47  SUBJECT TO CHANG
10a50 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20  E ******.*/.int 
10a60 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
10a70 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
10a80 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
10a90 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
10aa0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
10ab0 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
10ac0 65 20 73 75 62 74 69 74 75 74 65 73 20 66 6f 72  e subtitutes for
10ad0 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54   constants SQLIT
10ae0 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51  E_CORRUPT,.** SQ
10af0 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c  LITE_MISUSE, SQL
10b00 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51  ITE_CANTOPEN, SQ
10b10 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70  LITE_IOERR and p
10b20 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72  ossibly other er
10b30 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  ror.** constants
10b40 2e 20 20 54 68 65 79 20 73 65 72 76 65 72 20 74  .  They server t
10b50 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
10b60 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
10b70 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
10b80 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
10b90 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
10ba0 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
10bb0 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
10bc0 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
10bd0 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
10be0 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
10bf0 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
10c00 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
10c10 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
10c20 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
10c30 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
10c40 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
10c50 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
10c60 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
10c70 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
10c80 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
10c90 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
10ca0 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
10cb0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
10cc0 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20  _CORRUPT,.      
10cd0 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73          "databas
10ce0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20  e corruption at 
10cf0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
10d00 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
10d10 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
10d20 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
10d30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10d40 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e  TE_CORRUPT;.}.in
10d50 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
10d60 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
10d70 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
10d80 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
10d90 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
10da0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
10db0 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20  E_MISUSE, .     
10dc0 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65           "misuse
10dd0 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
10de0 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
10df0 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
10e00 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
10e10 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
10e20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d  SQLITE_MISUSE;.}
10e30 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74  .int sqlite3Cant
10e40 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69  openError(int li
10e50 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
10e60 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
10e70 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
10e80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
10e90 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
10ea0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
10eb0 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
10ec0 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
10ed0 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
10ee0 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
10ef0 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
10f00 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
10f10 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
10f20 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
10f30 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
10f40 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
10f50 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  is a convenience
10f60 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61   routine that ma
10f70 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c  kes sure that al
10f80 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  l thread-specifi
10f90 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68  c.** data for th
10fa0 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65  is thread has be
10fb0 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a  en deallocated..
10fc0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20  **.** SQLite no 
10fd0 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65  longer uses thre
10fe0 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
10ff0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
11000 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d   is now a.** no-
11010 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69  op.  It is retai
11020 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ned for historic
11030 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  al compatibility
11040 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11050 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
11060 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66  (void){.}.#endif
11070 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d  ../*.** Return m
11080 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
11090 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63  about a specific
110a0 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74   column of a dat
110b0 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
110c0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73  See comment in s
110d0 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65  qlite3.h (sqlite
110e0 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69  .h.in) for detai
110f0 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ls..*/.#ifdef SQ
11100 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
11110 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20  MN_METADATA.int 
11120 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
11130 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
11140 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11160 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  Connection handl
11170 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
11180 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20  r *zDbName,     
11190 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
111a0 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ame or NULL */. 
111b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
111c0 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
111d0 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
111e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
111f0 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43  umnName,    /* C
11200 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
11210 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44  char const **pzD
11220 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f  ataType,    /* O
11230 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20  UTPUT: Declared 
11240 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  data type */.  c
11250 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f  har const **pzCo
11260 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55  llSeq,     /* OU
11270 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20  TPUT: Collation 
11280 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
11290 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c  .  int *pNotNull
112a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
112b0 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
112c0 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  f NOT NULL const
112d0 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  raint exists */.
112e0 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b    int *pPrimaryK
112f0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
11300 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
11310 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20   column part of 
11320 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75  PK */.  int *pAu
11330 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20  toinc           
11340 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
11350 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73  rue if column is
11360 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20   auto-increment 
11370 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
11380 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
11390 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
113a0 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
113b0 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
113c0 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20  t iCol;..  char 
113d0 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65  const *zDataType
113e0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
113f0 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30  st *zCollSeq = 0
11400 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20  ;.  int notnull 
11410 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61  = 0;.  int prima
11420 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  rykey = 0;.  int
11430 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20   autoinc = 0;.. 
11440 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64   /* Ensure the d
11450 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
11460 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a  as been loaded *
11470 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
11480 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
11490 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
114a0 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
114b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
114c0 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29  it(db, &zErrMsg)
114d0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
114e0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74  K!=rc ){.    got
114f0 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
11500 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
11510 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74  e table in quest
11520 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  ion */.  pTab = 
11530 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
11540 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  (db, zTableName,
11550 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
11560 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e   !pTab || pTab->
11570 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70  pSelect ){.    p
11580 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  Tab = 0;.    got
11590 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d  o error_out;.  }
115a0 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
115b0 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68  column for which
115c0 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74   info is request
115d0 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ed */.  if( sqli
115e0 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75  te3IsRowid(zColu
115f0 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69  mnName) ){.    i
11600 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
11610 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  y;.    if( iCol>
11620 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  =0 ){.      pCol
11630 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
11640 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Col];.    }.  }e
11650 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
11660 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
11670 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
11680 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
11690 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
116a0 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
116b0 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
116c0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
116d0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
116e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
116f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
11700 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
11710 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b  .      pTab = 0;
11720 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  .      goto erro
11730 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  r_out;.    }.  }
11740 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
11750 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
11760 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
11770 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
11780 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
11790 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
117a0 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
117b0 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
117c0 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
117d0 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
117e0 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
117f0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
11800 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
11810 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
11820 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
11830 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
11840 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
11850 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
11860 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
11870 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
11880 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
11890 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
118a0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
118b0 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
118c0 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
118d0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
118e0 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
118f0 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
11900 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
11910 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
11920 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
11930 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
11940 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
11950 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c  zDataType = pCol
11960 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f  ->zType;.    zCo
11970 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
11980 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
11990 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c   = pCol->notNull
119a0 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  !=0;.    primary
119b0 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50  key  = pCol->isP
119c0 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61  rimKey!=0;.    a
119d0 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69  utoinc = pTab->i
119e0 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70  PKey==iCol && (p
119f0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
11a00 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
11a10 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
11a20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22     zDataType = "
11a30 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72  INTEGER";.    pr
11a40 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20  imarykey = 1;.  
11a50 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65  }.  if( !zCollSe
11a60 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  q ){.    zCollSe
11a70 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  q = "BINARY";.  
11a80 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20  }..error_out:.  
11a90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11aa0 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
11ab0 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63  Whether the func
11ac0 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65  tion call succee
11ad0 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73  ded or failed, s
11ae0 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  et the output pa
11af0 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f  rameters.  ** to
11b00 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20   whatever their 
11b10 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72  local counterpar
11b20 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61  ts contain. If a
11b30 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
11b40 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73  r,.  ** this has
11b50 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a   the effect of z
11b60 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75  eroing all outpu
11b70 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  t parameters..  
11b80 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54  */.  if( pzDataT
11b90 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70  ype ) *pzDataTyp
11ba0 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20  e = zDataType;. 
11bb0 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29   if( pzCollSeq )
11bc0 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43   *pzCollSeq = zC
11bd0 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e  ollSeq;.  if( pN
11be0 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75  otNull ) *pNotNu
11bf0 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20  ll = notnull;.  
11c00 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20  if( pPrimaryKey 
11c10 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d  ) *pPrimaryKey =
11c20 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
11c30 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70  f( pAutoinc ) *p
11c40 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e  Autoinc = autoin
11c50 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  c;..  if( SQLITE
11c60 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62  _OK==rc && !pTab
11c70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
11c80 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
11c90 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  g);.    zErrMsg 
11ca0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
11cb0 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  (db, "no such ta
11cc0 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25  ble column: %s.%
11cd0 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a  s", zTableName,.
11ce0 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e          zColumnN
11cf0 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
11d00 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
11d10 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
11d20 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
11d30 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
11d40 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
11d50 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
11d60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11d70 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
11d80 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11d90 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
11da0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11db0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
11dc0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
11dd0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
11de0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
11df0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69  time slept..*/.i
11e00 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  nt sqlite3_sleep
11e10 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69  (int ms){.  sqli
11e20 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
11e30 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20   int rc;.  pVfs 
11e40 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
11e50 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66  nd(0);.  if( pVf
11e60 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
11e70 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
11e80 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69  tion works in mi
11e90 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20  lliseconds, but 
11ea0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f  the underlying O
11eb0 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41  sSleep() .  ** A
11ec0 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63  PI uses microsec
11ed0 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20  onds. Hence the 
11ee0 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72  1000's..  */.  r
11ef0 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c  c = (sqlite3OsSl
11f00 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d  eep(pVfs, 1000*m
11f10 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  s)/1000);.  retu
11f20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11f30 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
11f40 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  e the extended r
11f50 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a  esult codes..*/.
11f60 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
11f70 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
11f80 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
11f90 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c  nt onoff){.  sql
11fa0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
11fb0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
11fc0 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f  b->errMask = ono
11fd0 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  ff ? 0xffffffff 
11fe0 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65  : 0xff;.  sqlite
11ff0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
12000 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
12010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12020 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
12030 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d  e xFileControl m
12040 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69  ethod on a parti
12050 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a  cular database..
12060 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  */.int sqlite3_f
12070 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69  ile_control(sqli
12080 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
12090 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e  har *zDbName, in
120a0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
120b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
120c0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e  LITE_ERROR;.  in
120d0 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
120e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
120f0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
12100 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  DbName==0 ){.   
12110 20 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   iDb = 0;.  }els
12120 65 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30  e{.    for(iDb=0
12130 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
12140 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Db++){.      if(
12150 20 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b   strcmp(db->aDb[
12160 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e  iDb].zName, zDbN
12170 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
12180 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12190 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a   iDb<db->nDb ){.
121a0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 72 65      Btree *pBtre
121b0 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  e = db->aDb[iDb]
121c0 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
121d0 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61  tree ){.      Pa
121e0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
121f0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
12200 2a 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  *fd;.      sqlit
12210 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
12220 72 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ree);.      pPag
12230 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
12240 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a  ePager(pBtree);.
12250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12260 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  ager!=0 );.     
12270 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67   fd = sqlite3Pag
12280 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
12290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 64        assert( fd
122a0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
122b0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
122c0 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
122d0 7b 0a 20 20 20 20 20 20 20 20 2a 28 73 71 6c 69  {.        *(sqli
122e0 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
122f0 3d 20 66 64 3b 0a 20 20 20 20 20 20 20 20 72 63  = fd;.        rc
12300 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64      }else if( fd
12320 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
12330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12340 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
12350 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20  fd, op, pArg);. 
12360 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12370 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12380 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 20 20  NOTFOUND;.      
12390 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
123a0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
123b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
123c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
123d0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
123e0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d   return rc;   .}
123f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ../*.** Interfac
12400 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67  e to the testing
12410 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73   logic..*/.int s
12420 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
12430 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  rol(int op, ...)
12440 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
12450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12460 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
12470 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
12480 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
12490 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
124a0 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  ){..    /*.    *
124b0 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
124c0 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
124d0 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  PRNG..    */.   
124e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
124f0 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a  TCTRL_PRNG_SAVE:
12500 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
12510 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b  PrngSaveState();
12520 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12530 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
12540 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73  ** Restore the s
12550 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
12560 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61   to the last sta
12570 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20  te saved using. 
12580 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e     ** PRNG_SAVE.
12590 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68    If PRNG_SAVE h
125a0 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
125b0 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65  been called, the
125c0 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65  n.    ** this ve
125d0 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e  rb acts like PRN
125e0 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a  G_RESET..    */.
125f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12600 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
12610 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73  STORE: {.      s
12620 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72  qlite3PrngRestor
12630 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
12640 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
12650 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65    /*.    ** Rese
12660 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20  t the PRNG back 
12670 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c  to its uninitial
12680 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65  ized state.  The
12690 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a   next call.    *
126a0 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e  * to sqlite3_ran
126b0 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72  domness() will r
126c0 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75  eseed the PRNG u
126d0 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61  sing a single ca
126e0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  ll.    ** to the
126f0 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74   xRandomness met
12700 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75  hod of the defau
12710 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20  lt VFS..    */. 
12720 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
12730 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
12740 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ET: {.      sqli
12750 74 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74  te3PrngResetStat
12760 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
12770 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
12780 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
12790 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54  test_control(BIT
127a0 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20  VEC_TEST, size, 
127b0 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a  program).    **.
127c0 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73      ** Run a tes
127d0 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76  t against a Bitv
127e0 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a  ec object of siz
127f0 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20  e.  The program 
12800 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20  argument.    ** 
12810 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  is an array of i
12820 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66  ntegers that def
12830 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20  ines the test.  
12840 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20  Return -1 on a. 
12850 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c     ** memory all
12860 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30  ocation error, 0
12870 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20   on success, or 
12880 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20  non-zero for an 
12890 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65  error..    ** Se
128a0 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74  e the sqlite3Bit
128b0 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29  vecBuiltinTest()
128c0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
128d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
128e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
128f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54  ITE_TESTCTRL_BIT
12900 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20  VEC_TEST: {.    
12910 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72    int sz = va_ar
12920 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
12930 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76    int *aProg = v
12940 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
12950 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12960 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
12970 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b  Test(sz, aProg);
12980 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12990 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
129a0 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
129b0 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f  _control(BENIGN_
129c0 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42  MALLOC_HOOKS, xB
129d0 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20  egin, xEnd).    
129e0 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74  **.    ** Regist
129f0 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c  er hooks to call
12a00 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69   to indicate whi
12a10 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ch malloc() fail
12a20 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65  ures .    ** are
12a30 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a   benign..    */.
12a40 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12a50 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f  TESTCTRL_BENIGN_
12a60 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a  MALLOC_HOOKS: {.
12a70 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
12a80 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69  id (*void_functi
12a90 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20  on)(void);.     
12aa0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
12ab0 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20  BenignBegin;.   
12ac0 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e     void_function
12ad0 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20   xBenignEnd;.   
12ae0 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20     xBenignBegin 
12af0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
12b00 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20  d_function);.   
12b10 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20     xBenignEnd = 
12b20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
12b30 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
12b40 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61   sqlite3BenignMa
12b50 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67  llocHooks(xBenig
12b60 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45  nBegin, xBenignE
12b70 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nd);.      break
12b80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
12b90 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
12ba0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
12bb0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
12bc0 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67  DING_BYTE, unsig
12bd0 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  ned int X).    *
12be0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
12bf0 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f   PENDING byte to
12c00 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
12c10 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58  e argument, if X
12c20 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20  >0..    ** Make 
12c30 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d  no changes if X=
12c40 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  =0.  Return the 
12c50 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e  value of the pen
12c60 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a  ding byte.    **
12c70 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20   as it existing 
12c80 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
12c90 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ine was called..
12ca0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d      **.    ** IM
12cb0 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69  PORTANT:  Changi
12cc0 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
12cd0 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30  yte from 0x40000
12ce0 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20  000 results in. 
12cf0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61     ** an incompa
12d00 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66  tible database f
12d10 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61  ile format.  Cha
12d20 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
12d30 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68  G byte.    ** wh
12d40 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65  ile any database
12d50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
12d60 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75  pen results in u
12d70 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20  ndefined and.   
12d80 20 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20   ** dileterious 
12d90 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f  behavior..    */
12da0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
12db0 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
12dc0 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20  G_BYTE: {.      
12dd0 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rc = PENDING_BYT
12de0 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  E;.#ifndef SQLIT
12df0 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20  E_OMIT_WSD.     
12e00 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67   {.        unsig
12e10 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d  ned int newVal =
12e20 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69   va_arg(ap, unsi
12e30 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20  gned int);.     
12e40 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
12e50 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
12e60 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
12e70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
12e80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
12e90 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
12ea0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
12eb0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
12ec0 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
12ed0 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
12ee0 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
12ef0 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
12f00 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
12f10 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
12f20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
12f30 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
12f40 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
12f50 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
12f60 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
12f70 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
12f80 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
12f90 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
12fa0 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
12fb0 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
12fc0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
12fd0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
12fe0 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
12ff0 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
13000 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
13010 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
13020 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
13030 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
13040 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
13050 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
13060 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
13070 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
13080 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
13090 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
130a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
130b0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
130c0 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
130d0 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
130e0 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
130f0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
13100 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
13110 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
13120 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
13130 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
13140 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
13150 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
13160 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
13170 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
13180 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
13190 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
131a0 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
131b0 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
131c0 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
131d0 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
131e0 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
131f0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
13200 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
13210 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
13220 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
13230 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
13240 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
13250 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
13260 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
13270 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
13280 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
13290 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
132a0 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
132b0 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
132c0 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
132d0 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
132e0 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
132f0 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
13300 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
13310 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
13320 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
13330 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
13340 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
13350 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
13360 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
13370 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
13380 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
13390 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
133a0 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
133b0 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
133c0 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
133d0 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
133e0 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
133f0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
13400 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
13410 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
13420 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
13430 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
13440 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
13450 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
13460 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13470 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
13480 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
13490 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
134a0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
134b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
134c0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
134d0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
134e0 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
134f0 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
13500 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
13510 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
13520 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
13530 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
13540 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
13550 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
13560 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
13570 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
13580 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
13590 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
135a0 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
135b0 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
135c0 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
135d0 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
135e0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
135f0 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
13600 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
13610 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
13620 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
13630 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
13640 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
13650 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
13660 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
13670 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
13680 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
13690 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
136a0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
136b0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
136c0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
136d0 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33  RESERVE, sqlite3
136e0 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
136f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
13700 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65  he nReserve size
13710 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61   to N for the ma
13720 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74  in database on t
13730 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
13740 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
13750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
13760 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
13770 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20  L_RESERVE: {.   
13780 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
13790 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
137a0 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  te3*);.      int
137b0 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   x = va_arg(ap,i
137c0 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
137d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
137e0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
137f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13800 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  PageSize(db->aDb
13810 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30  [0].pBt, 0, x, 0
13820 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13830 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
13840 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
13850 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
13860 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   /*  sqlite3_tes
13870 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
13880 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
13890 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33  ZATIONS, sqlite3
138a0 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
138b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
138c0 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72  e or disable var
138d0 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
138e0 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ns for testing p
138f0 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20  urposes.  The . 
13900 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e     ** argument N
13910 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
13920 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
13930 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20  o be disabled.  
13940 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a  For normal.    *
13950 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68  * operation N sh
13960 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
13970 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74  idea is that a t
13980 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b  est program (lik
13990 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  e the.    ** SQL
139a0 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53   Logic Test or S
139b0 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20  LT test module) 
139c0 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65  can run the same
139d0 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69   SQL multiple ti
139e0 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  mes.    ** with 
139f0 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
13a00 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74  tions disabled t
13a10 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
13a20 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
13a30 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64    ** is obtained
13a40 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a   in every case..
13a50 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
13a60 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
13a70 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b  OPTIMIZATIONS: {
13a80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
13a90 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
13aa0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
13ab0 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
13ac0 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64  ap,int);.      d
13ad0 62 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26 20  b->flags = (x & 
13ae0 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 20  SQLITE_OptMask) 
13af0 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 7e  | (db->flags & ~
13b00 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 3b  SQLITE_OptMask);
13b10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13b20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
13b30 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
13b40 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
13b50 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
13b60 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
13b70 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  RD, const char *
13b80 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20  zWord).    **.  
13b90 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73    ** If zWord is
13ba0 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67   a keyword recog
13bb0 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72  nized by the par
13bc0 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ser, then return
13bd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
13be0 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20  er of keywords. 
13bf0 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20   Or if zWord is 
13c00 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72  not a keyword, r
13c10 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20  eturn 0..    ** 
13c20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
13c30 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c  t feature is onl
13c40 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
13c50 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
13c60 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  since.    ** the
13c70 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
13c80 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64  D macro is not d
13c90 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
13ca0 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20  ile if SQLite.  
13cb0 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73    ** is built us
13cc0 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75  ing separate sou
13cd0 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  rce files..    *
13ce0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
13cf0 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
13d00 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f  WORD: {.      co
13d10 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  nst char *zWord 
13d20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
13d30 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
13d40 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
13d50 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b  Strlen30(zWord);
13d60 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c  .      rc = (sql
13d70 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
13d80 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d  (u8*)zWord, n)!=
13d90 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f  TK_ID) ? SQLITE_
13da0 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20  N_KEYWORD : 0;. 
13db0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13dc0 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f  }.#endif ..    /
13dd0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
13de0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
13df0 53 54 43 54 52 4c 5f 50 47 48 44 52 53 5a 29 0a  STCTRL_PGHDRSZ).
13e00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
13e10 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
13e20 20 61 20 70 63 61 63 68 65 20 68 65 61 64 65 72   a pcache header
13e30 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 20 20 2a   in bytes..    *
13e40 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
13e50 45 5f 54 45 53 54 43 54 52 4c 5f 50 47 48 44 52  E_TESTCTRL_PGHDR
13e60 53 5a 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  SZ: {.      rc =
13e70 20 73 69 7a 65 6f 66 28 50 67 48 64 72 29 3b 0a   sizeof(PgHdr);.
13e80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13e90 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   }..    /* sqlit
13ea0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
13eb0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
13ec0 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73  SCRATCHMALLOC, s
13ed0 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29  z, &pNew, pFree)
13ee0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
13ef0 50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20  Pass pFree into 
13f00 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
13f10 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66  ee(). .    ** If
13f20 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63   sz>0 then alloc
13f30 61 74 65 20 61 20 73 63 72 61 74 63 68 20 62 75  ate a scratch bu
13f40 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20  ffer into pNew. 
13f50 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73   .    */.    cas
13f60 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
13f70 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a  L_SCRATCHMALLOC:
13f80 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
13f90 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20  Free, **ppNew;. 
13fa0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
13fb0 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61     sz = va_arg(a
13fc0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70  p, int);.      p
13fd0 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70  pNew = va_arg(ap
13fe0 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20  , void**);.     
13ff0 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28   pFree = va_arg(
14000 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
14010 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65    if( sz ) *ppNe
14020 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  w = sqlite3Scrat
14030 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20  chMalloc(sz);.  
14040 20 20 20 20 73 71 6c 69 74 65 33 53 63 72 61 74      sqlite3Scrat
14050 63 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  chFree(pFree);. 
14060 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14070 7d 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  }..  }.  va_end(
14080 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ap);.#endif /* S
14090 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54  QLITE_OMIT_BUILT
140a0 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74  IN_TEST */.  ret
140b0 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.