/ Hex Artifact Content
Login

Artifact 569561a238a0bb6d55affbaa224ddc885c91df2b:


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 2f 2a 0a  u.h".#endif../*.
0320: 2a 2a 20 54 68 65 20 76 65 72 73 69 6f 6e 20 6f  ** The version o
0330: 66 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2f  f the library.*/
0340: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0350: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 63 6f 6e  AMALGAMATION.con
0360: 73 74 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f  st char sqlite3_
0370: 76 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49  version[] = SQLI
0380: 54 45 5f 56 45 52 53 49 4f 4e 3b 0a 23 65 6e 64  TE_VERSION;.#end
0390: 69 66 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  if.const char *s
03a0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
03b0: 6e 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  n(void){ return 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 3b  sqlite3_version;
03d0: 20 7d 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73   }.const char *s
03e0: 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
03f0: 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51  void){ return SQ
0400: 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 3b 20  LITE_SOURCE_ID; 
0410: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  }.int sqlite3_li
0420: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
0430: 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51  void){ return SQ
0440: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
0450: 42 45 52 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74  BER; }.int sqlit
0460: 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 76 6f  e3_threadsafe(vo
0470: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
0480: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3b 20 7d  TE_THREADSAFE; }
0490: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
04a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
04b0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
04c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
04d0: 43 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  CE)./*.** If the
04e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
04f0: 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  ion pointer is n
0500: 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a  ot NULL and if.*
0510: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0520: 49 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c  IOTRACE is enabl
0530: 65 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65  ed, then message
0540: 73 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20  s describing.** 
0550: 49 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77  I/O active are w
0560: 72 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69  ritten using thi
0570: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  s function.  The
0580: 73 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61  se messages.** a
0590: 72 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20  re intended for 
05a0: 64 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69  debugging activi
05b0: 74 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ty only..*/.void
05c0: 20 28 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63   (*sqlite3IoTrac
05d0: 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  e)(const char*, 
05e0: 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ...) = 0;.#endif
05f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ../*.** If the f
0600: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
0610: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
0620: 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  to a string whic
0630: 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  h is the.** name
0640: 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 2c   of a directory,
0650: 20 74 68 65 6e 20 74 68 61 74 20 64 69 72 65 63   then that direc
0660: 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75 73 65  tory will be use
0670: 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 74 65  d to store.** te
0680: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
0690: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68  *.** See also th
06a0: 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70 5f 73  e "PRAGMA temp_s
06b0: 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20  tore_directory" 
06c0: 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  SQL command..*/.
06d0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65  char *sqlite3_te
06e0: 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30  mp_directory = 0
06f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  ;../*.** Initial
0700: 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a  ize SQLite.  .**
0710: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0720: 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
0730: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
0740: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
0750: 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64  ion,.** VFS, and
0760: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
0770: 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  s prior to doing
0780: 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72   any serious wor
0790: 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65  k with.** SQLite
07a0: 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61  .  But as long a
07b0: 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d  s you do not com
07c0: 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45  pile with SQLITE
07d0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a  _OMIT_AUTOINIT.*
07e0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
07f0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75  ill be called au
0800: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b  tomatically by k
0810: 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68  ey routines such
0820: 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   as.** sqlite3_o
0830: 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  pen().  .**.** T
0840: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
0850: 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e   no-op except on
0860: 20 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20   its very first 
0870: 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f  call for the pro
0880: 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20  cess,.** or for 
0890: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61  the first call a
08a0: 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
08b0: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e  qlite3_shutdown.
08c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
08d0: 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20   thread to call 
08e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
08f0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  s the initializa
0900: 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c  tion to.** compl
0910: 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65  etion.  If subse
0920: 71 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61  quent threads ca
0930: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
0940: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
0950: 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66  .** thread has f
0960: 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74  inished the init
0970: 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65  ialization proce
0980: 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  ss, then the sub
0990: 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61  sequent.** threa
09a0: 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e  ds must block un
09b0: 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68  til the first th
09c0: 72 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69  read finishes wi
09d0: 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  th the initializ
09e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
09f0: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69   first thread mi
0a00: 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  ght call this ro
0a10: 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c  utine recursivel
0a20: 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a  y.  Recursive.**
0a30: 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72   calls to this r
0a40: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f  outine should no
0a50: 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72  t block, of cour
0a60: 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  se.  Otherwise t
0a70: 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61  he.** initializa
0a80: 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75  tion process wou
0a90: 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74  ld never complet
0aa0: 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62  e..**.** Let X b
0ab0: 65 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  e the first thre
0ac0: 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73  ad to enter this
0ad0: 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59   routine.  Let Y
0ae0: 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   be some other.*
0af0: 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20  * thread.  Then 
0b00: 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61  while the initia
0b10: 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  l invocation of 
0b20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20  this routine by 
0b30: 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65  X is.** incomple
0b40: 74 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72  te, it is requir
0b50: 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  ed that:.**.**  
0b60: 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68    *  Calls to th
0b70: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
0b80: 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  Y must block unt
0b90: 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73  il the outer-mos
0ba0: 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20  t.**       call 
0bb0: 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a  by X completes..
0bc0: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75  **.**    *  Recu
0bd0: 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74  rsive calls to t
0be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  his routine from
0bf0: 20 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e   thread X return
0c00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
0c10: 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c        without bl
0c20: 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
0c30: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
0c40: 65 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  e(void){.  sqlit
0c50: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
0c60: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
0c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
0c80: 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78  ain static mutex
0c90: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cc0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
0cd0: 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
0ce0: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72  ITE_OMIT_WSD.  r
0cf0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f  c = sqlite3_wsd_
0d00: 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a  init(4096, 24);.
0d10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
0d20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
0d30: 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
0d40: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65  ..  /* If SQLite
0d50: 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70   is already comp
0d60: 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a  letely initializ
0d70: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  ed, then this ca
0d80: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  ll.  ** to sqlit
0d90: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
0da0: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f  should be a no-o
0db0: 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74  p.  But the init
0dc0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
0dd0: 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  must be complete
0de0: 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73  .  So isInit mus
0df0: 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74  t not be set unt
0e00: 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a  il the very end.
0e10: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75    ** of this rou
0e20: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
0e30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
0e40: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
0e50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0e60: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
0e70: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
0e80: 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tem is initializ
0e90: 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74  ed.  If unable t
0ea0: 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  o .  ** initiali
0eb0: 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  ze the mutex sub
0ec0: 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65  system, return e
0ed0: 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72  arly with the er
0ee0: 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ror..  ** If the
0ef0: 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69   system is so si
0f00: 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75  ck that we are u
0f10: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
0f20: 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20  e a mutex,.  ** 
0f30: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  there is not muc
0f40: 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e  h SQLite is goin
0f50: 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  g to be able to 
0f60: 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  do..  **.  ** Th
0f70: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
0f80: 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65  m must take care
0f90: 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20   of serializing 
0fa0: 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69  its own.  ** ini
0fb0: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a  tialization..  *
0fc0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
0fd0: 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69  MutexInit();.  i
0fe0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
0ff0: 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  c;..  /* Initial
1000: 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29  ize the malloc()
1010: 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20   system and the 
1020: 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d  recursive pInitM
1030: 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a  utex mutex..  **
1040: 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
1050: 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1060: 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45  the STATIC_MASTE
1070: 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74  R mutex.  Note t
1080: 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c  hat.  ** MutexAl
1090: 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20  loc() is called 
10a0: 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74  for a static mut
10b0: 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74  ex prior to init
10c0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a  ializing the.  *
10d0: 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  * malloc subsyst
10e0: 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65  em - this implie
10f0: 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  s that the alloc
1100: 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69  ation of a stati
1110: 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73  c.  ** mutex mus
1120: 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75  t not require su
1130: 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d  pport from the m
1140: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e  alloc subsystem.
1150: 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
1160: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
1170: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1180: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
1190: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11a0: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
11b0: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
11c0: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
11d0: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
11e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
11f0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1200: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1210: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
1220: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1230: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1240: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1250: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1260: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1270: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1280: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
12a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
12b0: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
12c0: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
12d0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
12e0: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
12f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1300: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1310: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
1320: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1330: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1340: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1350: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1360: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1370: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1380: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1390: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
13a0: 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20  tMutex++;.  }.  
13b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13c0: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20  ave(pMaster);.. 
13d0: 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74   /* If rc is not
13e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68   SQLITE_OK at th
13f0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65  is point, then e
1400: 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63  ither the malloc
1410: 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20  .  ** subsystem 
1420: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69  could not be ini
1430: 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20  tialized or the 
1440: 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f  system failed to
1450: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74   allocate.  ** t
1460: 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75  he pInitMutex mu
1470: 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  tex. Return an e
1480: 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63  rror in either c
1490: 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  ase.  */.  if( r
14a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14b0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14c0: 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20   }..  /* Do the 
14d0: 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74  rest of the init
14e0: 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72  ialization under
14f0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d   the recursive m
1500: 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61  utex so.  ** tha
1510: 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c  t we will be abl
1520: 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75  e to handle recu
1530: 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f  rsive calls into
1540: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e  .  ** sqlite3_in
1550: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65  itialize().  The
1560: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1570: 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74   normally come t
1580: 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69  hrough.  ** sqli
1590: 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68  te3_os_init() wh
15a0: 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71  en it invokes sq
15b0: 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
15c0: 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a  er(), but other.
15d0: 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63    ** recursive c
15e0: 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20  alls might also 
15f0: 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  be possible..  *
1600: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1610: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47  x_enter(sqlite3G
1620: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
1630: 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73  tMutex);.  if( s
1640: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1650: 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20  ig.isInit==0 && 
1660: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1670: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d  fig.inProgress==
1680: 30 20 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  0 ){.    FuncDef
1690: 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47  Hash *pHash = &G
16a0: 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73  LOBAL(FuncDefHas
16b0: 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  h, sqlite3Global
16c0: 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20  Functions);.    
16d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16e0: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d  fig.inProgress =
16f0: 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   1;.    memset(p
1700: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
1710: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
1720: 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71  ctions));.    sq
1730: 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f  lite3RegisterGlo
1740: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  balFunctions();.
1750: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1760: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
1770: 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  acheInit==0 ){. 
1780: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1790: 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a  3PcacheInitializ
17a0: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e();.    }.    i
17b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
17e0: 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a  PCacheInit = 1;.
17f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1800: 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20  e3OsInit();.    
1810: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1820: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1830: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75   sqlite3PCacheBu
1840: 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69 74  fferSetup( sqlit
1850: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1860: 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Page, .         
1870: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1880: 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c  nfig.szPage, sql
1890: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18a0: 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73  .nPage);.      s
18b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18c0: 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  ig.isInit = 1;. 
18d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
18e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
18f0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d  rogress = 0;.  }
1900: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1910: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c  _leave(sqlite3Gl
1920: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1930: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f  Mutex);..  /* Go
1940: 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20   back under the 
1950: 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64  static mutex and
1960: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
1970: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74  cursive.  ** mut
1980: 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20  ex to prevent a 
1990: 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20  resource leak.. 
19a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
19b0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
19c0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
19d0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
19e0: 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28  itMutex--;.  if(
19f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a00: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1a10: 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ex<=0 ){.    ass
1a20: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
1a30: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
1a40: 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  tMutex==0 );.   
1a50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
1a60: 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ree(sqlite3Globa
1a70: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1a80: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
1a90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1aa0: 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d  itMutex = 0;.  }
1ab0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ac0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
1ad0: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1ae0: 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73  wing is just a s
1af0: 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d  anity check to m
1b00: 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20  ake sure SQLite 
1b10: 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
1b20: 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  mpiled correctly
1b30: 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  .  It is importa
1b40: 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63  nt to run this c
1b50: 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65  ode, but.  ** we
1b60: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
1b70: 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20  un it too often 
1b80: 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20  and soak up CPU 
1b90: 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20  cycles for no.  
1ba0: 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77  ** reason.  So w
1bb0: 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75  e run it once du
1bc0: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
1bd0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
1be0: 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66  f NDEBUG.#ifndef
1bf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1c00: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a  ATING_POINT.  /*
1c10: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66   This section of
1c20: 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75   code's only "ou
1c30: 74 70 75 74 22 20 69 73 20 76 69 61 20 61 73 73  tput" is via ass
1c40: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1c50: 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d  . */.  if ( rc==
1c60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c70: 20 75 36 34 20 78 20 3d 20 28 28 28 75 36 34 29   u64 x = (((u64)
1c80: 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64  1)<<63)-1;.    d
1c90: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73  ouble y;.    ass
1ca0: 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38  ert(sizeof(x)==8
1cb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69  );.    assert(si
1cc0: 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28  zeof(x)==sizeof(
1cd0: 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  y));.    memcpy(
1ce0: 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  &y, &x, 8);.    
1cf0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49  assert( sqlite3I
1d00: 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23  sNaN(y) );.  }.#
1d10: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
1d20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d30: 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66  .** Undo the eff
1d40: 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ects of sqlite3_
1d50: 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d  initialize().  M
1d60: 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  ust not be calle
1d70: 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65  d while.** there
1d80: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
1d90: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1da0: 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20  tions or memory 
1db0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a  allocations or.*
1dc0: 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74  * while any part
1dd0: 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74   of SQLite is ot
1de0: 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69  herwise in use i
1df0: 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54  n any thread.  T
1e00: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
1e10: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
1e20: 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61 66  .  But it is saf
1e30: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73  e to invoke this
1e40: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77   routine.** on w
1e50: 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c  hen SQLite is al
1e60: 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e  ready shut down.
1e70: 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61    If SQLite is a
1e80: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
1e90: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
1ea0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
1eb0: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
1ec0: 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
1ed0: 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  s no-op..*/.int 
1ee0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1ef0: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71  (void){.  if( sq
1f00: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f10: 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  g.isInit ){.    
1f20: 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29  sqlite3_os_end()
1f30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
1f40: 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69  set_auto_extensi
1f50: 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  on();.    sqlite
1f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1f70: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
1f80: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1f90: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1fa0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
1fb0: 74 65 33 50 63 61 63 68 65 53 68 75 74 64 6f 77  te3PcacheShutdow
1fc0: 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n();.    sqlite3
1fd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50  GlobalConfig.isP
1fe0: 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20  CacheInit = 0;. 
1ff0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2000: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2010: 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20  allocInit ){.   
2020: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e   sqlite3MallocEn
2030: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2040: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2050: 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20  allocInit = 0;. 
2060: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2070: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2080: 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20  utexInit ){.    
2090: 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28  sqlite3MutexEnd(
20a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
20b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74  obalConfig.isMut
20c0: 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  exInit = 0;.  }.
20d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
20f0: 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70  is API allows ap
2100: 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f  plications to mo
2110: 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20  dify the global 
2120: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66  configuration of
2130: 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c  .** the SQLite l
2140: 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69  ibrary at run-ti
2150: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  me..**.** This r
2160: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
2170: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ly be called whe
2180: 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  n there are no o
2190: 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61  utstanding.** da
21a0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
21b0: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
21c0: 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20  ocations.  This 
21d0: 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a  routine is not.*
21e0: 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46  * threadsafe.  F
21f0: 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74  ailure to heed t
2200: 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61  hese warnings ca
2210: 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64  n lead to unpred
2220: 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76  ictable.** behav
2230: 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
2240: 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f  te3_config(int o
2250: 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  p, ...){.  va_li
2260: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20  st ap;.  int rc 
2270: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2280: 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  /* sqlite3_confi
2290: 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e  g() shall return
22a0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69   SQLITE_MISUSE i
22b0: 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  f it is invoked 
22c0: 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53  while.  ** the S
22d0: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73  QLite library is
22e0: 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66   in use. */.  if
22f0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2300: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72  onfig.isInit ) r
2310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
2320: 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f  USE_BKPT;..  va_
2330: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
2340: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a   switch( op ){..
2350: 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e      /* Mutex con
2360: 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
2370: 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69  ns are only avai
2380: 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61  lable in a threa
2390: 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  dsafe.    ** com
23a0: 70 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69  pile. .    */.#i
23b0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
23c0: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
23d0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
23e0: 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c  E>0.    case SQL
23f0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c  ITE_CONFIG_SINGL
2400: 45 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20  ETHREAD: {.     
2410: 20 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20   /* Disable all 
2420: 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20  mutexing */.    
2430: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2440: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
2450: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
2460: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2470: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a  bFullMutex = 0;.
2480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2490: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24a0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
24b0: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
24c0: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69  * Disable mutexi
24d0: 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ng of database c
24e0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
24f0: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75      /* Enable mu
2500: 74 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64  texing of core d
2510: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a  ata structures *
2520: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2530: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
2540: 65 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20  eMutex = 1;.    
2550: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2560: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
2570: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
2580: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2590: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
25a0: 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20  SERIALIZED: {.  
25b0: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c      /* Enable al
25c0: 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20  l mutexing */.  
25d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
25e0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
25f0: 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ex = 1;.      sq
2600: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2610: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31  g.bFullMutex = 1
2620: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2630: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2640: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45  LITE_CONFIG_MUTE
2650: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70  X: {.      /* Sp
2660: 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61  ecify an alterna
2670: 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65  tive mutex imple
2680: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
2690: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
26a0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a  Config.mutex = *
26b0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
26c0: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
26d0: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
26e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
26f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
2700: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
2710: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
2720: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
2730: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
2740: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
2750: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
2760: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
2770: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2780: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
2790: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
27a0: 0a 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ...    case SQLI
27b0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
27c0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
27d0: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
27e0: 69 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65  ive malloc imple
27f0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
2800: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2810: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61  Config.m = *va_a
2820: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
2830: 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  em_methods*);.  
2840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2850: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2860: 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f  _CONFIG_GETMALLO
2870: 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  C: {.      /* Re
2880: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
2890: 6e 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c  nt malloc() impl
28a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
28b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
28c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d  lobalConfig.m.xM
28d0: 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74  alloc==0 ) sqlit
28e0: 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28  e3MemSetDefault(
28f0: 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67  );.      *va_arg
2900: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
2910: 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c  _methods*) = sql
2920: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2930: 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  .m;.      break;
2940: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2950: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
2960: 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20  MSTATUS: {.     
2970: 20 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   /* Enable or di
2980: 73 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63  sable the malloc
2990: 20 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69   status collecti
29a0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
29b0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
29c0: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
29d0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
29e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
29f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2a00: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b  ONFIG_SCRATCH: {
2a10: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
2a20: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
2a30: 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
2a40: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
2a50: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2a60: 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61  ig.pScratch = va
2a70: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
2a80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2a90: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72  obalConfig.szScr
2aa0: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
2ab0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
2ac0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2ad0: 67 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.nScratch = va_
2ae0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
2af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2b00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2b10: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
2b20: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65  E: {.      /* De
2b30: 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72  signate a buffer
2b40: 20 66 6f 72 20 70 61 67 65 20 63 61 63 68 65 20   for page cache 
2b50: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a  memory space */.
2b60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2b70: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20  balConfig.pPage 
2b80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
2b90: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
2ba0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
2bb0: 7a 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  zPage = va_arg(a
2bc0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
2bd0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2be0: 69 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.nPage = va_ar
2bf0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
2c00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
2c10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2c20: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b  CONFIG_PCACHE: {
2c30: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
2c40: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
2c50: 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c   page cache impl
2c60: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
2c70: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2c80: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 20 3d  lConfig.pcache =
2c90: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
2ca0: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
2cb0: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
2cc0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
2cd0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2ce0: 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20  G_GETPCACHE: {. 
2cf0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2d00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
2d10: 63 68 65 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a  che.xInit==0 ){.
2d20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2d30: 43 61 63 68 65 53 65 74 44 65 66 61 75 6c 74 28  CacheSetDefault(
2d40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2d50: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
2d60: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
2d70: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
2d80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
2d90: 68 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  he;.      break;
2da0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69  .    }..#if defi
2db0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2dc0: 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65  E_MEMSYS3) || de
2dd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
2de0: 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20  BLE_MEMSYS5).   
2df0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2e00: 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20  FIG_HEAP: {.    
2e10: 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61    /* Designate a
2e20: 20 62 75 66 66 65 72 20 66 6f 72 20 68 65 61 70   buffer for heap
2e30: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f   memory space */
2e40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2e50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70  obalConfig.pHeap
2e60: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
2e70: 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  id*);.      sqli
2e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2e90: 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  nHeap = va_arg(a
2ea0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
2eb0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ec0: 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72  ig.mnReq = va_ar
2ed0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20  g(ap, int);..   
2ee0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70  obalConfig.pHeap
2f00: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
2f10: 2a 20 49 66 20 74 68 65 20 68 65 61 70 20 70 6f  * If the heap po
2f20: 69 6e 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74  inter is NULL, t
2f30: 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
2f40: 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74  malloc implement
2f50: 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ation.        **
2f60: 20 62 61 63 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f   back to NULL po
2f70: 69 6e 74 65 72 73 20 74 6f 6f 2e 20 20 54 68 69  inters too.  Thi
2f80: 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
2f90: 20 6d 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a 20 20   malloc to go.  
2fa0: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f        ** back to
2fb0: 20 69 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70   its default imp
2fc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e  lementation when
2fd0: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
2fe0: 69 7a 65 28 29 20 69 73 0a 20 20 20 20 20 20 20  ize() is.       
2ff0: 20 2a 2a 20 72 75 6e 2e 0a 20 20 20 20 20 20 20   ** run..       
3000: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   */.        mems
3010: 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61  et(&sqlite3Globa
3020: 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69  lConfig.m, 0, si
3030: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
3040: 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20  alConfig.m));.  
3050: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3060: 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20 70     /* The heap p
3070: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ointer is not NU
3080: 4c 4c 2c 20 74 68 65 6e 20 69 6e 73 74 61 6c 6c  LL, then install
3090: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 20 20 20   one of the.    
30a0: 20 20 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65      ** mem5.c/me
30b0: 6d 33 2e 63 20 6d 65 74 68 6f 64 73 2e 20 49 66  m3.c methods. If
30c0: 20 6e 65 69 74 68 65 72 20 45 4e 41 42 4c 45 5f   neither ENABLE_
30d0: 4d 45 4d 53 59 53 33 20 6e 6f 72 0a 20 20 20 20  MEMSYS3 nor.    
30e0: 20 20 20 20 2a 2a 20 45 4e 41 42 4c 45 5f 4d 45      ** ENABLE_ME
30f0: 4d 53 59 53 35 20 69 73 20 64 65 66 69 6e 65 64  MSYS5 is defined
3100: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
3110: 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  r..        */.#i
3120: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3130: 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20  LE_MEMSYS3.     
3140: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3150: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
3160: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33  te3MemGetMemsys3
3170: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ();.#endif.#ifde
3180: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3190: 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20  MEMSYS5.        
31a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
31b0: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
31c0: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b  MemGetMemsys5();
31d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
31e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
3200: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3210: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
3220: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3230: 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
3240: 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70  side = va_arg(ap
3250: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3260: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3270: 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76  g.nLookaside = v
3280: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32a0: 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52   }.    .    /* R
32b0: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
32c0: 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75  to the logger fu
32d0: 6e 63 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20  ncction and its 
32e0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
32f0: 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75      ** The defau
3300: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67  lt is NULL.  Log
3310: 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  ging is disabled
3320: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
3330: 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20   pointer is.    
3340: 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  ** NULL..    */.
3350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3360: 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20  CONFIG_LOG: {.  
3370: 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
3380: 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
3390: 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
33a0: 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
33b0: 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
33c0: 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
33d0: 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
33e0: 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
33f0: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
3400: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a  a_arg(ap, void(*
3410: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
3420: 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
3430: 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
3440: 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f  f void(*LOGFUNC_
3450: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  t)(void*,int,con
3460: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
3470: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3480: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
3490: 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74  rg(ap, LOGFUNC_t
34a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f  GlobalConfig.pLo
34c0: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
34d0: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
34e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
34f0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
3500: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
3510: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
3520: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
3530: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
3540: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3550: 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b   Set up the look
3560: 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f  aside buffers fo
3570: 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  r a database con
3580: 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  nection..** Retu
3590: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
35a0: 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66  success.  .** If
35b0: 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c   lookaside is al
35c0: 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65  ready active, re
35d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
35e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70  ..**.** The sz p
35f0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
3600: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
3610: 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64  in each lookasid
3620: 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63  e slot..** The c
3630: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
3640: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c  the number of sl
3650: 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20  ots.  If pStart 
3660: 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73  is NULL the.** s
3670: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f  pace for the loo
3680: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73  kaside memory is
3690: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
36a0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
36b0: 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73  .** If pStart is
36c0: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
36d0: 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65  t is sz*cnt byte
36e0: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75  s of memory to u
36f0: 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f  se for.** the lo
3700: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a  okaside memory..
3710: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
3720: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c  tupLookaside(sql
3730: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a  ite3 *db, void *
3740: 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e  pBuf, int sz, in
3750: 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a  t cnt){.  void *
3760: 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62  pStart;.  if( db
3770: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
3780: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
3790: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
37a0: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78    /* Free any ex
37b0: 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65  isting lookaside
37c0: 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73   buffer for this
37d0: 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20   handle before. 
37e0: 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61   ** allocating a
37f0: 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64   new one so we d
3800: 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76  on't have to hav
3810: 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a  e space for .  *
3820: 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61  * both at the sa
3830: 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  me time..  */.  
3840: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
3850: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20  e.bMalloced ){. 
3860: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3870: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
3880: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  tart);.  }.  /* 
3890: 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f  The size of a lo
38a0: 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 6e 65 65  okaside slot nee
38b0: 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20  ds to be larger 
38c0: 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 0a 20  than a pointer. 
38d0: 20 2a 2a 20 74 6f 20 62 65 20 75 73 65 66 75 6c   ** to be useful
38e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c  ..  */.  if( sz<
38f0: 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f  =(int)sizeof(Loo
3900: 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20 73  kasideSlot*) ) s
3910: 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e 74  z = 0;.  if( cnt
3920: 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20  <0 ) cnt = 0;.  
3930: 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74  if( sz==0 || cnt
3940: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20  ==0 ){.    sz = 
3950: 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  0;.    pStart = 
3960: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  0;.  }else if( p
3970: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  Buf==0 ){.    sz
3980: 20 3d 20 52 4f 55 4e 44 38 28 73 7a 29 3b 0a 20   = ROUND8(sz);. 
3990: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
39a0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
39b0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
39c0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
39d0: 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
39e0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
39f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3a00: 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28  sz = ROUNDDOWN8(
3a10: 73 7a 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20  sz);.    pStart 
3a20: 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62  = pBuf;.  }.  db
3a30: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
3a40: 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64  rt = pStart;.  d
3a50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72  b->lookaside.pFr
3a60: 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f  ee = 0;.  db->lo
3a70: 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31  okaside.sz = (u1
3a80: 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61  6)sz;.  if( pSta
3a90: 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  rt ){.    int i;
3aa0: 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c  .    LookasideSl
3ab0: 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72  ot *p;.    asser
3ac0: 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a  t( sz > (int)siz
3ad0: 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f  eof(LookasideSlo
3ae0: 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28  t*) );.    p = (
3af0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70  LookasideSlot*)p
3b00: 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69  Start;.    for(i
3b10: 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  =cnt-1; i>=0; i-
3b20: 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  -){.      p->pNe
3b30: 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  xt = db->lookasi
3b40: 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20  de.pFree;.      
3b50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
3b60: 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ree = p;.      p
3b70: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
3b80: 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d  t*)&((u8*)p)[sz]
3b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
3ba0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d  lookaside.pEnd =
3bb0: 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   p;.    db->look
3bc0: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
3bd0: 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   1;.    db->look
3be0: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
3bf0: 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a  = pBuf==0 ?1:0;.
3c00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
3c10: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20  >lookaside.pEnd 
3c20: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 0;.    db->loo
3c30: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
3c40: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 0;.    db->loo
3c50: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
3c60: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
3c70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3c80: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3c90: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
3ca0: 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
3cb0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
3cc0: 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  /.sqlite3_mutex 
3cd0: 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65  *sqlite3_db_mute
3ce0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  x(sqlite3 *db){.
3cf0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74    return db->mut
3d00: 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ex;.}../*.** Con
3d10: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69  figuration setti
3d20: 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69 76  ngs for an indiv
3d30: 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20 63  idual database c
3d40: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74  onnection.*/.int
3d50: 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66   sqlite3_db_conf
3d60: 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ig(sqlite3 *db, 
3d70: 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
3d80: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
3d90: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
3da0: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
3db0: 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
3dc0: 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  se SQLITE_DBCONF
3dd0: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
3de0: 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66        void *pBuf
3df0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
3e00: 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  id*);.      int 
3e10: 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
3e20: 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
3e30: 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  cnt = va_arg(ap,
3e40: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20   int);.      rc 
3e50: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
3e60: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
3e70: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3e80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
3e90: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
3ea0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
3eb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3ec0: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
3ed0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
3ee0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
3ef0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62  rn true if the b
3f00: 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20  uffer z[0..n-1] 
3f10: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61  contains all spa
3f20: 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ces..*/.static i
3f30: 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e  nt allSpaces(con
3f40: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
3f50: 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  n){.  while( n>0
3f60: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20   && z[n-1]==' ' 
3f70: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75  ){ n--; }.  retu
3f80: 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn n==0;.}../*.*
3f90: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65  * This is the de
3fa0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
3fb0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
3fc0: 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73  BINARY" which is
3fd0: 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c   always.** avail
3fe0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
3ff0: 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d  he padFlag argum
4000: 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ent is not NULL 
4010: 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69  then space paddi
4020: 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a  ng at the end.**
4030: 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69   of strings is i
4040: 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d  gnored.  This im
4050: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52  plements the RTR
4060: 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f  IM collation..*/
4070: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43  .static int binC
4080: 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20  ollFunc(.  void 
4090: 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20  *padFlag,.  int 
40a0: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
40b0: 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
40c0: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
40d0: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
40e0: 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e  t rc, n;.  n = n
40f0: 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65  Key1<nKey2 ? nKe
4100: 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72 63  y1 : nKey2;.  rc
4110: 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c   = memcmp(pKey1,
4120: 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66   pKey2, n);.  if
4130: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
4140: 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20 20  f( padFlag.     
4150: 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63  && allSpaces(((c
4160: 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20 6e  har*)pKey1)+n, n
4170: 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26 20  Key1-n).     && 
4180: 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72  allSpaces(((char
4190: 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65 79  *)pKey2)+n, nKey
41a0: 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  2-n).    ){.    
41b0: 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75 6e    /* Leave rc un
41c0: 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f 0a  changed at 0 */.
41d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
41e0: 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b   rc = nKey1 - nK
41f0: 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ey2;.    }.  }. 
4200: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4210: 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75 69  *.** Another bui
4220: 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20  lt-in collating 
4230: 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45  sequence: NOCASE
4240: 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  . .**.** This co
4250: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
4260: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
4270: 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61 73  be used for "cas
4280: 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a 2a  e independant.**
4290: 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51   comparison". SQ
42a0: 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65  Lite's knowledge
42b0: 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c 6f   of upper and lo
42c0: 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c  wer case equival
42d0: 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20  ents.** extends 
42e0: 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20 63  only to the 26 c
42f0: 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20 69  haracters used i
4300: 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c 61  n the English la
4310: 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74  nguage..**.** At
4320: 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72   the moment ther
4330: 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d  e is only a UTF-
4340: 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  8 implementation
4350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4360: 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
4370: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
4380: 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
4390: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
43a0: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
43b0: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
43c0: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20  Key2.){.  int r 
43d0: 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  = sqlite3StrNICm
43e0: 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74 20  p(.      (const 
43f0: 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28 63  char *)pKey1, (c
4400: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79  onst char *)pKey
4410: 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29  2, (nKey1<nKey2)
4420: 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20  ?nKey1:nKey2);. 
4430: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4440: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  R(NotUsed);.  if
4450: 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20  ( 0==r ){.    r 
4460: 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20  = nKey1-nKey2;. 
4470: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
4480: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4490: 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20  he ROWID of the 
44a0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65  most recent inse
44b0: 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74  rt.*/.sqlite_int
44c0: 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  64 sqlite3_last_
44d0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73 71 6c  insert_rowid(sql
44e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
44f0: 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69  urn db->lastRowi
4500: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
4510: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
4520: 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   changes in the 
4530: 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
4540: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
4550: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
4560: 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74  e3_changes(sqlit
4570: 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72  e3 *db){.  retur
4580: 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d  n db->nChange;.}
4590: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
45a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
45b0: 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64  nges since the d
45c0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77  atabase handle w
45d0: 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e  as opened..*/.in
45e0: 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f  t sqlite3_total_
45f0: 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  changes(sqlite3 
4600: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
4610: 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b  b->nTotalChange;
4620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
4630: 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
4640: 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  nts. This functi
4650: 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61  on only manipula
4660: 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68  tes fields of th
4670: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  e.** database ha
4680: 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20  ndle object, it 
4690: 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61  does not close a
46a0: 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68  ny savepoints th
46b0: 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a  at may be open.*
46c0: 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f  * at the b-tree/
46d0: 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  pager level..*/.
46e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73  void sqlite3Clos
46f0: 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69  eSavepoints(sqli
4700: 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c  te3 *db){.  whil
4710: 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e  e( db->pSavepoin
4720: 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69  t ){.    Savepoi
4730: 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70  nt *pTmp = db->p
4740: 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64  Savepoint;.    d
4750: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20  b->pSavepoint = 
4760: 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pTmp->pNext;.   
4770: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4780: 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20  b, pTmp);.  }.  
4790: 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  db->nSavepoint =
47a0: 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65   0;.  db->nState
47b0: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  ment = 0;.  db->
47c0: 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76  isTransactionSav
47d0: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  epoint = 0;.}../
47e0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78  *.** Close an ex
47f0: 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61  isting SQLite da
4800: 74 61 62 61 73 65 0a 2a 2f 0a 69 6e 74 20 73 71  tabase.*/.int sq
4810: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69  lite3_close(sqli
4820: 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68  te3 *db){.  Hash
4830: 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 6e 74 20 6a  Elem *i;.  int j
4840: 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  ;..  if( !db ){.
4850: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4860: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
4870: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
4880: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
4890: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
48a0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
48b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
48c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
48d0: 6d 75 74 65 78 29 3b 0a 0a 20 20 73 71 6c 69 74  mutex);..  sqlit
48e0: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
48f0: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20  chema(db, 0);.. 
4900: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
4910: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
4920: 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e ResetInternalS
4930: 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f  chema() call abo
4940: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
4950: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
4960: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
4970: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
4980: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
4990: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
49a0: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
49b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
49c0: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
49d0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
49e0: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
49f0: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
4a00: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4a10: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
4a20: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
4a30: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
4a40: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
4a50: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
4a60: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
4a70: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
4a80: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
4a90: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
4aa0: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ck(db);..  /* If
4ab0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
4ac0: 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20  utstanding VMs, 
4ad0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
4ae0: 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  SY. */.  if( db-
4af0: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71  >pVdbe ){.    sq
4b00: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
4b10: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
4b20: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
4b30: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
4b40: 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65 6d 65  inalised stateme
4b50: 6e 74 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  nts");.    sqlit
4b60: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
4b70: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
4b80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4b90: 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  Y;.  }.  assert(
4ba0: 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68   sqlite3SafetyCh
4bb0: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
4bc0: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
4bd0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
4be0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
4bf0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b   db->aDb[j].pBt;
4c00: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
4c10: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
4c20: 42 61 63 6b 75 70 28 70 42 74 29 20 29 7b 0a 20  Backup(pBt) ){. 
4c30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4c40: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
4c50: 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  Y, .          "u
4c60: 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64  nable to close d
4c70: 75 65 20 74 6f 20 75 6e 66 69 6e 69 73 68 65 64  ue to unfinished
4c80: 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f   backup operatio
4c90: 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n");.      sqlit
4ca0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
4cb0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
4cc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
4cd0: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  USY;.    }.  }..
4ce0: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75    /* Free any ou
4cf0: 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f  tstanding Savepo
4d00: 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20  int structures. 
4d10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  */.  sqlite3Clos
4d20: 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
4d30: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ..  for(j=0; j<d
4d40: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
4d50: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
4d60: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a   = &db->aDb[j];.
4d70: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
4d80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4d90: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d  3BtreeClose(pDb-
4da0: 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62  >pBt);.      pDb
4db0: 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20  ->pBt = 0;.     
4dc0: 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20   if( j!=1 ){.   
4dd0: 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d       pDb->pSchem
4de0: 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 0;.      }. 
4df0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
4e00: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
4e10: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20  chema(db, 0);.. 
4e20: 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64   /* Tell the cod
4e30: 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68  e in notify.c th
4e40: 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  at the connectio
4e50: 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64  n no longer hold
4e60: 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73  s any.  ** locks
4e70: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65   and does not re
4e80: 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65  quire any furthe
4e90: 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  r unlock-notify 
4ea0: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
4eb0: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
4ec0: 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a  ionClosed(db);..
4ed0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44    assert( db->nD
4ee0: 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  b<=2 );.  assert
4ef0: 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61  ( db->aDb==db->a
4f00: 44 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f  DbStatic );.  fo
4f10: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
4f20: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
4f30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
4f40: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
4f50: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
4f60: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
4f70: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
4f80: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
4f90: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
4fa0: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
4fb0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
4fc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4fd0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
4fe0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
4ff0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
5000: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
5010: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
5020: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
5030: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
5040: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
5050: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
5060: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
5070: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
5080: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
5090: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
50a0: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
50b0: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
50c0: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
50d0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
50e0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
50f0: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
5100: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
5110: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
5120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5130: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5140: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
5150: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
5160: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
5170: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
5180: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
5190: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
51a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
51b0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
51c0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
51d0: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
51e0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
51f0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
5200: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
5210: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
5220: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
5230: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
5240: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5250: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
5260: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
5270: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
5280: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
5290: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
52a0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
52b0: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
52c0: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
52d0: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
52e0: 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29    if( db->pErr )
52f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
5300: 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29  ueFree(db->pErr)
5310: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
5320: 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64  loseExtensions(d
5330: 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  b);..  db->magic
5340: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
5350: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
5360: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
5370: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
5380: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
5390: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
53a0: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
53b0: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
53c0: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
53d0: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
53e0: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
53f0: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
5400: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
5410: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
5420: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
5430: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
5440: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
5450: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
5460: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
5470: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
5480: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
5490: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
54a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
54b0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
54c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
54d0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
54e0: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
54f0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
5500: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
5510: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
5520: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
5530: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
5540: 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46  nOut==0 );  /* F
5550: 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73  ails on a lookas
5560: 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  ide memory leak 
5570: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
5580: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
5590: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
55a0: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
55b0: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
55c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
55d0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
55e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
55f0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
5600: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f  tabase files..*/
5610: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
5620: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
5630: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
5640: 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20    int inTrans = 
5650: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
5660: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5670: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
5680: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
5690: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f  gnMalloc();.  fo
56a0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
56b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
56c0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29  db->aDb[i].pBt )
56d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
56e0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
56f0: 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  s(db->aDb[i].pBt
5700: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54  ) ){.        inT
5710: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  rans = 1;.      
5720: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
5730: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d  treeRollback(db-
5740: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
5750: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69      db->aDb[i].i
5760: 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20  nTrans = 0;.    
5770: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
5780: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b  tabRollback(db);
5790: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
57a0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
57b0: 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51  if( db->flags&SQ
57c0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
57d0: 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  es ){.    sqlite
57e0: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
57f0: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
5800: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
5810: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
5820: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
5830: 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e  Any deferred con
5840: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
5850: 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  ns have now been
5860: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
5870: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
5880: 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  s = 0;..  /* If 
5890: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
58a0: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
58b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
58c0: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
58d0: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
58e0: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
58f0: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
5900: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
5910: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
5920: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
5930: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
5940: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
5950: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
5960: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
5970: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
5980: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
5990: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
59a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
59b0: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
59c0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
59d0: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
59e0: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
59f0: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
5a00: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
5a10: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
5a20: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
5a30: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
5a40: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
5a50: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
5a60: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
5a70: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
5a80: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
5a90: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
5aa0: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
5ab0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
5ac0: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
5ad0: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
5ae0: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
5af0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
5b00: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
5b10: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
5b20: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
5b30: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
5b40: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
5b50: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
5b60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
5b70: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
5b80: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
5b90: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
5ba0: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
5bb0: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
5bc0: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
5bd0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
5be0: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
5bf0: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
5c00: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
5c10: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
5c20: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
5c30: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
5c40: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
5c50: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
5c60: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
5c70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
5c80: 55 4e 44 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  UND    */ 0,.   
5c90: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   /* SQLITE_FULL 
5ca0: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
5cb0: 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
5cc0: 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ull",.    /* SQL
5cd0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20  ITE_CANTOPEN    
5ce0: 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  */ "unable to op
5cf0: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
5d00: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
5d10: 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20  _PROTOCOL    */ 
5d20: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
5d30: 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20  _EMPTY       */ 
5d40: 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  "table contains 
5d50: 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a  no data",.    /*
5d60: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20   SQLITE_SCHEMA  
5d70: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
5d80: 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
5d90: 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ged",.    /* SQL
5da0: 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20  ITE_TOOBIG      
5db0: 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c  */ "string or bl
5dc0: 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20  ob too big",.   
5dd0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   /* SQLITE_CONST
5de0: 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74  RAINT  */ "const
5df0: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20  raint failed",. 
5e00: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
5e10: 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74  MATCH    */ "dat
5e20: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c  atype mismatch",
5e30: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
5e40: 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c  ISUSE      */ "l
5e50: 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63  ibrary routine c
5e60: 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71  alled out of seq
5e70: 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53  uence",.    /* S
5e80: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
5e90: 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65    */ "large file
5ea0: 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61   support is disa
5eb0: 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bled",.    /* SQ
5ec0: 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20  LITE_AUTH       
5ed0: 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69   */ "authorizati
5ee0: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
5ef0: 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  /* SQLITE_FORMAT
5f00: 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69        */ "auxili
5f10: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72  ary database for
5f20: 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  mat error",.    
5f30: 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20  /* SQLITE_RANGE 
5f40: 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f        */ "bind o
5f50: 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  r column index o
5f60: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
5f70: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
5f80: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
5f90: 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72   is encrypted or
5fa0: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
5fb0: 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 72 63 20 26  se",.  };.  rc &
5fc0: 3d 20 30 78 66 66 3b 0a 20 20 69 66 28 20 41 4c  = 0xff;.  if( AL
5fd0: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
5fe0: 63 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61  c<(int)(sizeof(a
5ff0: 4d 73 67 29 2f 73 69 7a 65 6f 66 28 61 4d 73 67  Msg)/sizeof(aMsg
6000: 5b 30 5d 29 29 20 26 26 20 61 4d 73 67 5b 72 63  [0])) && aMsg[rc
6010: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ]!=0 ){.    retu
6020: 72 6e 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d  rn aMsg[rc];.  }
6030: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6040: 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22   "unknown error"
6050: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
6060: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
6070: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
6080: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
6090: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
60a0: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
60b0: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
60c0: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
60d0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
60e0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
60f0: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
6100: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
6110: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
6120: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
6130: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
6140: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
6150: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
6160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
6170: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6180: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
61a0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
61b0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
61c0: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
61d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
61e0: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
61f0: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
6200: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
6210: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
6220: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
6230: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
6240: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
6250: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
6260: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
6270: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
6280: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
6290: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
62a0: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
62b0: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
62c0: 4c 41 59 20 28 73 69 7a 65 6f 66 28 64 65 6c 61  LAY (sizeof(dela
62d0: 79 73 29 2f 73 69 7a 65 6f 66 28 64 65 6c 61 79  ys)/sizeof(delay
62e0: 73 5b 30 5d 29 29 0a 20 20 73 71 6c 69 74 65 33  s[0])).  sqlite3
62f0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
6300: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
6310: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
6320: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
6330: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
6340: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
6350: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
6360: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
6370: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
6380: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
6390: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
63a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
63b0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
63c0: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
63d0: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
63e0: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
63f0: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
6400: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
6410: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
6420: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
6430: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
6440: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
6450: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
6460: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
6470: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
6480: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
6490: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
64a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
64b0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
64c0: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
64d0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
64e0: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
64f0: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
6500: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
6510: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6520: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
6530: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
6540: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
6550: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
6560: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
6570: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
6580: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6590: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
65a0: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
65b0: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
65c0: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
65d0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
65e0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
65f0: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
6600: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
6610: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
6620: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
6630: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
6640: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
6650: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
6660: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
6670: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
6680: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
6690: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
66a0: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
66b0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
66c0: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
66d0: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
66e0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
66f0: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
6700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
6710: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
6720: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
6730: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6740: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
6750: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
6760: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
6770: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
6780: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
6790: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
67a0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
67b0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
67c0: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
67d0: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
67e0: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
67f0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
6800: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6810: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
6820: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
6830: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
6840: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
6850: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
6860: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
6870: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
6880: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
6890: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
68a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
68b0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
68c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
68d0: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a  RESS_CALLBACK./*
68e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
68f0: 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65   sets the progre
6900: 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ss callback for 
6910: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
6920: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
6930: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
6940: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
6950: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  ven argument. Th
6960: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
6970: 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69  ack will.** be i
6980: 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70  nvoked every nOp
6990: 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f  s opcodes..*/.vo
69a0: 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72  id sqlite3_progr
69b0: 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  ess_handler(.  s
69c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
69d0: 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28  nt nOps,.  int (
69e0: 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64  *xProgress)(void
69f0: 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72  *), .  void *pAr
6a00: 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  g.){.  sqlite3_m
6a10: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
6a20: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70  utex);.  if( nOp
6a30: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  s>0 ){.    db->x
6a40: 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67  Progress = xProg
6a50: 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50  ress;.    db->nP
6a60: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f 70  rogressOps = nOp
6a70: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
6a80: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
6a90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
6aa0: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
6ab0: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
6ac0: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
6ad0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
6ae0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
6af0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6b00: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
6b10: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
6b20: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
6b30: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
6b40: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
6b50: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
6b60: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
6b70: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
6b80: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
6b90: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
6ba0: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
6bb0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
6bc0: 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20  ms){.  if( ms>0 
6bd0: 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54  ){.    db->busyT
6be0: 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 20  imeout = ms;.   
6bf0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
6c00: 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65  ndler(db, sqlite
6c10: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
6c20: 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b  ack, (void*)db);
6c30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
6c40: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
6c50: 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  er(db, 0, 0);.  
6c60: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6c70: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
6c80: 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  ause any pending
6c90: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74   operation to st
6ca0: 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65  op at its earlie
6cb0: 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  st opportunity..
6cc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
6cd0: 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65  interrupt(sqlite
6ce0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31  3 *db){.  db->u1
6cf0: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
6d00: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
6d10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
6d20: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
6d30: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
6d40: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
6d50: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
6d60: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
6d70: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
6d80: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
6d90: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
6da0: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
6db0: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
6dc0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
6dd0: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
6de0: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
6df0: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
6e00: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
6e10: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
6e20: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
6e30: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6e40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6e50: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
6e60: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
6e70: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
6e80: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
6e90: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
6ea0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
6eb0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
6ec0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
6ed0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
6ee0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
6ef0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
6f00: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
6f10: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
6f20: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
6f30: 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65  t nName;..  asse
6f40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6f50: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
6f60: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
6f70: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
6f80: 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28       (xFunc && (
6f90: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
6fa0: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46  ) || .      (!xF
6fb0: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
6fc0: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
6fd0: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
6fe0: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
6ff0: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
7000: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
7010: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
7020: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
7030: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
7040: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46  ite3Strlen30( zF
7050: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
7060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7070: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
7080: 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20  .  }.  .#ifndef 
7090: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
70a0: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
70b0: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
70c0: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
70d0: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
70e0: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
70f0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
7100: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
7110: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
7120: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
7130: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
7140: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
7150: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
7160: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
7170: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
7180: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
7190: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
71a0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
71b0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
71c0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
71d0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
71e0: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
71f0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
7200: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
7210: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
7220: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
7230: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7240: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
7250: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
7260: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
7270: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
7280: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
7290: 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20  ep, xFinal);.   
72a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
72b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
72c0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
72d0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
72e0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
72f0: 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20 20  TE_UTF16LE,.    
7300: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
7310: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
7320: 46 69 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  Final);.    }.  
7330: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7340: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
7350: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
7360: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
7370: 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73  TF16BE;.  }.#els
7380: 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45  e.  enc = SQLITE
7390: 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20  _UTF8;.#endif.  
73a0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
73b0: 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74  n existing funct
73c0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65  ion is being ove
73d0: 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74  rridden or delet
73e0: 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20  ed. If so,.  ** 
73f0: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
7400: 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72  tive VMs, then r
7410: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
7420: 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e  Y. If a function
7430: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f  .  ** is being o
7440: 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65  verridden/delete
7450: 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20  d but there are 
7460: 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61  no active VMs, a
7470: 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70  llow the.  ** op
7480: 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69  eration to conti
7490: 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61  nue but invalida
74a0: 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c  te all precompil
74b0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
74c0: 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
74d0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
74e0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
74f0: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75   nName, nArg, (u
7500: 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  8)enc, 0);.  if(
7510: 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e   p && p->iPrefEn
7520: 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72  c==enc && p->nAr
7530: 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  g==nArg ){.    i
7540: 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  f( db->activeVdb
7550: 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  eCnt ){.      sq
7560: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
7570: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
7580: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
7590: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73  delete/modify us
75a0: 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20  er-function due 
75b0: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
75c0: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73  ents");.      as
75d0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
75e0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
75f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
7600: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
7610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7620: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
7630: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d  ments(db);.    }
7640: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
7650: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
7660: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
7670: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
7680: 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61  (u8)enc, 1);.  a
7690: 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d  ssert(p || db->m
76a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20  allocFailed);.  
76b0: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
76c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
76d0: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 66 6c 61 67  M;.  }.  p->flag
76e0: 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e  s = 0;.  p->xFun
76f0: 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e  c = xFunc;.  p->
7700: 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20  xStep = xStep;. 
7710: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
7720: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
7730: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
7740: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
7750: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
7760: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7770: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
7780: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
7790: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
77a0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
77b0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
77c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
77d0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
77e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
77f0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
7800: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
7810: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7820: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
7830: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
7840: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
7850: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
7860: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
7870: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
7880: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
7890: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
78a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
78b0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
78c0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
78d0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
78e0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
78f0: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75  Arg, enc, p, xFu
7900: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
7910: 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
7920: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
7930: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
7940: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
7950: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
7960: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
7970: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69  ITE_OMIT_UTF16.i
7980: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
7990: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20  e_function16(.  
79a0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
79b0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63  onst void *zFunc
79c0: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
79d0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78  nArg,.  int eTex
79e0: 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c  tRep,.  void *p,
79f0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
7a00: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7a10: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
7a20: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
7a30: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
7a40: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
7a50: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
7a60: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
7a70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
7a80: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
7a90: 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20   char *zFunc8;. 
7aa0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7ab0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
7ac0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
7ad0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7ae0: 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74    zFunc8 = sqlit
7af0: 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
7b00: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31  FunctionName, -1
7b10: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
7b20: 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71  TIVE);.  rc = sq
7b30: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
7b40: 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67  db, zFunc8, nArg
7b50: 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78  , eTextRep, p, x
7b60: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
7b70: 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nal);.  sqlite3D
7b80: 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38  bFree(db, zFunc8
7b90: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7ba0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
7bb0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
7bc0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
7bd0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
7be0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
7bf0: 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61  * Declare that a
7c00: 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
7c10: 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79  en overloaded by
7c20: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
7c30: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
7c40: 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20  unction already 
7c50: 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75  exists as a regu
7c60: 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  lar global funct
7c70: 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ion, then.** thi
7c80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
7c90: 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75  o-op.  If the fu
7ca0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
7cb0: 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61  exist, then crea
7cc0: 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20  te.** a new one 
7cd0: 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f  that always thro
7ce0: 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72  ws a run-time er
7cf0: 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  ror.  .**.** Whe
7d00: 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  n virtual tables
7d10: 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69   intend to provi
7d20: 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64  de an overloaded
7d30: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a   function, they.
7d40: 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74  ** should call t
7d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d  his routine to m
7d60: 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f  ake sure the glo
7d70: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  bal function exi
7d80: 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  sts..** A global
7d90: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65   function must e
7da0: 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f  xist in order fo
7db0: 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
7dc0: 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f  n to work.** pro
7dd0: 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  perly..*/.int sq
7de0: 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66  lite3_overload_f
7df0: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
7e00: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
7e10: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  char *zName,.  i
7e20: 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74  nt nArg.){.  int
7e30: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
7e40: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
7e50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
7e60: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7e70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
7e80: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75  f( sqlite3FindFu
7e90: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
7ea0: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , nName, nArg, S
7eb0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d  QLITE_UTF8, 0)==
7ec0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
7ed0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
7ee0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
7ef0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7f10: 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64  , sqlite3Invalid
7f20: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
7f30: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
7f40: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 53  te3ApiExit(db, S
7f50: 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
7f60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
7f70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
7f80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
7f90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7fa0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67  _TRACE./*.** Reg
7fb0: 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75  ister a trace fu
7fc0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
7fd0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
7fe0: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
7ff0: 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74   trace.** is ret
8000: 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
8010: 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63   NULL trace func
8020: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
8030: 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78  no tracing is ex
8040: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
8050: 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20  ULL.** trace is 
8060: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
8070: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
8080: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73  invoked at the s
8090: 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  tart of each.** 
80a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
80b0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
80c0: 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64  trace(sqlite3 *d
80d0: 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65  b, void (*xTrace
80e0: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
80f0: 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  ar*), void *pArg
8100: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
8110: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8120: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8130: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
8140: 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d  pTraceArg;.  db-
8150: 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65  >xTrace = xTrace
8160: 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72  ;.  db->pTraceAr
8170: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
8180: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
8190: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
81a0: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a  turn pOld;.}./*.
81b0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72  ** Register a pr
81c0: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20  ofile function. 
81d0: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
81e0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
81f0: 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f  gistered .** pro
8200: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  file function is
8210: 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
8220: 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c  ** A NULL profil
8230: 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
8240: 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69   that no profili
8250: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
8260: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70   A non-NULL.** p
8270: 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e  rofile is a poin
8280: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
8290: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
82a0: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
82b0: 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53  ion of.** each S
82c0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  QL statement tha
82d0: 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69  t is run..*/.voi
82e0: 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69  d *sqlite3_profi
82f0: 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  le(.  sqlite3 *d
8300: 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f  b,.  void (*xPro
8310: 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  file)(void*,cons
8320: 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75  t char*,sqlite_u
8330: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
8340: 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  pArg.){.  void *
8350: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
8360: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8370: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
8380: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
8390: 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65  ;.  db->xProfile
83a0: 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64   = xProfile;.  d
83b0: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d  b->pProfileArg =
83c0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
83d0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
83e0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
83f0: 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
8400: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
8410: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45  TRACE */../*** E
8420: 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a  XPERIMENTAL ***.
8430: 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  **.** Register a
8440: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
8450: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
8460: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65  ransaction comme
8470: 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nts..** If the i
8480: 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
8490: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
84a0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
84b0: 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
84c0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
84d0: 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
84e0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
84f0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
8500: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
8510: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
8520: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
8530: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
8540: 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
8550: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
8560: 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
8570: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
8580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
8590: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
85a0: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
85b0: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
85c0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
85d0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
85e0: 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  ld = db->pCommit
85f0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d  Arg;.  db->xComm
8600: 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  itCallback = xCa
8610: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43  llback;.  db->pC
8620: 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b  ommitArg = pArg;
8630: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8640: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8650: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
8660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
8670: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
8680: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
8690: 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
86a0: 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
86b0: 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
86c0: 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
86d0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
86e0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
86f0: 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  _update_hook(.  
8700: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
8710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
8720: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
8730: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
8740: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
8750: 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
8760: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72  har const *,char
8770: 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f   const *,sqlite_
8780: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
8790: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
87a0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
87b0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
87c0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
87d0: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
87e0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
87f0: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
8800: 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20  b->pUpdateArg;. 
8810: 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
8820: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
8830: 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41  ;.  db->pUpdateA
8840: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
8850: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8860: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
8870: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
8880: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
8890: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
88a0: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
88b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
88c0: 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  s rolled.** back
88d0: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
88e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
88f0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72  .void *sqlite3_r
8900: 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20  ollback_hook(.  
8910: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
8920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
8930: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
8940: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
8950: 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
8960: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20  ack)(void*), /* 
8970: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
8980: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  n */.  void *pAr
8990: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
89a0: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
89b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
89c0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
89d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
89e0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
89f0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
8a00: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20  pRollbackArg;.  
8a10: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
8a20: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
8a30: 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  k;.  db->pRollba
8a40: 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ckArg = pArg;.  
8a50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8a60: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8a70: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
8a80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
8a90: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
8aa0: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
8ab0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
8ac0: 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  n is written.** 
8ad0: 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61  into the write-a
8ae0: 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73  head-log by this
8af0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8b00: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
8b10: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
8b20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
8b50: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62   hook to this db
8b60: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
8b70: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
8b80: 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  d *, sqlite3*, c
8b90: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
8ba0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
8bd0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
8be0: 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29  xCallback() */.)
8bf0: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
8c00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
8c10: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
8c20: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
8c30: 4c 6f 67 41 72 67 3b 0a 20 20 64 62 2d 3e 78 4c  LogArg;.  db->xL
8c40: 6f 67 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  ogCallback = xCa
8c50: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 4c  llback;.  db->pL
8c60: 6f 67 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ogArg = pArg;.  
8c70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8c80: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8c90: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
8ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
8cb0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
8cc0: 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72  ue if main-memor
8cd0: 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
8ce0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61   instead of.** a
8cf0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
8d00: 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61  for transient pa
8d10: 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74  ger files and st
8d20: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
8d30: 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
8d40: 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20  eturned depends 
8d50: 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
8d60: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28  db->temp_store (
8d70: 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d  runtime.** param
8d80: 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f  eter) and the co
8d90: 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
8da0: 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   of SQLITE_TEMP_
8db0: 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f  STORE. The.** fo
8dc0: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
8dd0: 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61  scribes the rela
8de0: 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
8df0: 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65   these two value
8e00: 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75  s.** and this fu
8e10: 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76  nctions return v
8e20: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51  alue..**.**   SQ
8e30: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
8e40: 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
8e50: 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
8e60: 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
8e70: 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
8e90: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
8ea0: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ec0: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
8ee0: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
8ef0: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
8f00: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
8f30: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
8f40: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f60: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
8f70: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
8f80: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
8f90: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
8fa0: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
8fb0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
8fc0: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
8fd0: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
8fe0: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
9000: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
9010: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
9050: 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 1).**   2     
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9080: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
9090: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20  turn 1).**   3  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
90c0: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
90d0: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e  (return 1).*/.in
90e0: 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  t sqlite3TempInM
90f0: 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69  emory(const sqli
9100: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51  te3 *db){.#if SQ
9110: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
9120: 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =1.  return ( db
9130: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
9140: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
9150: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
9160: 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =2.  return ( db
9170: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
9180: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
9190: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
91a0: 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  =3.  return 1;.#
91b0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
91c0: 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c  _TEMP_STORE<1 ||
91d0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
91e0: 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b  RE>3.  return 0;
91f0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
9200: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9210: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
9220: 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
9230: 6f 20 61 20 64 61 74 61 62 61 73 65 20 42 54 72  o a database BTr
9240: 65 65 0a 2a 2a 20 64 72 69 76 65 72 2e 20 20 49  ee.** driver.  I
9250: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  f zFilename is t
9260: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c  he name of a fil
9270: 65 2c 20 74 68 65 6e 20 74 68 61 74 20 66 69 6c  e, then that fil
9280: 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65 64 20 61  e is.** opened a
9290: 6e 64 20 75 73 65 64 2e 20 20 49 66 20 7a 46 69  nd used.  If zFi
92a0: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6d 61  lename is the ma
92b0: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
92c0: 79 3a 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  y:" then.** the 
92d0: 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72  database is stor
92e0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 28 61 6e  ed in memory (an
92f0: 64 20 69 73 20 74 68 75 73 20 66 6f 72 67 6f 74  d is thus forgot
9300: 74 65 6e 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a  ten as soon as.*
9310: 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * the connection
9320: 20 69 73 20 63 6c 6f 73 65 64 2e 29 20 20 49 66   is closed.)  If
9330: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
9340: 4c 4c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  LL then the data
9350: 62 61 73 65 0a 2a 2a 20 69 73 20 61 20 22 76 69  base.** is a "vi
9360: 72 74 75 61 6c 22 20 64 61 74 61 62 61 73 65 20  rtual" database 
9370: 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 75 73  for transient us
9380: 65 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20 64 65  e only and is de
9390: 6c 65 74 65 64 20 61 73 0a 2a 2a 20 73 6f 6f 6e  leted as.** soon
93a0: 20 61 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   as the connecti
93b0: 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  on is closed..**
93c0: 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 64 61  .** A virtual da
93d0: 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 65 69  tabase can be ei
93e0: 74 68 65 72 20 61 20 64 69 73 6b 20 66 69 6c 65  ther a disk file
93f0: 20 28 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61   (that is automa
9400: 74 69 63 61 6c 6c 79 0a 2a 2a 20 64 65 6c 65 74  tically.** delet
9410: 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  ed when the file
9420: 20 69 73 20 63 6c 6f 73 65 64 29 20 6f 72 20 69   is closed) or i
9430: 74 20 61 6e 20 62 65 20 68 65 6c 64 20 65 6e 74  t an be held ent
9440: 69 72 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2e  irely in memory.
9450: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 54  .** The sqlite3T
9460: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 29 20 66 75  empInMemory() fu
9470: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
9480: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  o determine whic
9490: 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  h..*/.int sqlite
94a0: 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 0a 20  3BtreeFactory(. 
94b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
94c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
94d0: 69 6e 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  in database when
94e0: 20 6f 70 65 6e 69 6e 67 20 61 75 78 20 6f 74 68   opening aux oth
94f0: 65 72 77 69 73 65 20 30 20 2a 2f 0a 20 20 63 6f  erwise 0 */.  co
9500: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
9510: 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ame,    /* Name 
9520: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
9530: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
9540: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
9550: 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c 20  nt omitJournal, 
9560: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 54           /* if T
9570: 52 55 45 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  RUE then do not 
9580: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 66 69 6c  journal this fil
9590: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 63 68  e */.  int nCach
95a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
95b0: 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 70 61 67   /* How many pag
95c0: 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
95d0: 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ache */.  int vf
95e0: 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
95f0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
9600: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 76  sed through to v
9610: 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42 74 72 65  fsOpen */.  Btre
9620: 65 20 2a 2a 70 70 42 74 72 65 65 20 20 20 20 20  e **ppBtree     
9630: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9640: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
9650: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
9660: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 74  e */.){.  int bt
9670: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74  Flags = 0;.  int
9680: 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72 74   rc;.  .  assert
9690: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
96a0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
96b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 42  );.  assert( ppB
96c0: 74 72 65 65 20 21 3d 20 30 29 3b 0a 20 20 69 66  tree != 0);.  if
96d0: 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( omitJournal ){
96e0: 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20  .    btFlags |= 
96f0: 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  BTREE_OMIT_JOURN
9700: 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  AL;.  }.  if( db
9710: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
9720: 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  _NoReadlock ){. 
9730: 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20 42 54     btFlags |= BT
9740: 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b  REE_NO_READLOCK;
9750: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
9760: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9770: 42 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  B.  if( zFilenam
9780: 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 54  e==0 && sqlite3T
9790: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 20  empInMemory(db) 
97a0: 29 7b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  ){.    zFilename
97b0: 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a 20   = ":memory:";. 
97c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
97d0: 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
97e0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
97f0: 29 21 3d 30 20 26 26 20 28 7a 46 69 6c 65 6e 61  )!=0 && (zFilena
9800: 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 6c 65 6e  me==0 || *zFilen
9810: 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 76  ame==0) ){.    v
9820: 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c  fsFlags = (vfsFl
9830: 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ags & ~SQLITE_OP
9840: 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51  EN_MAIN_DB) | SQ
9850: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
9860: 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  B;.  }.  rc = sq
9870: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 7a  lite3BtreeOpen(z
9880: 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71 6c 69 74  Filename, (sqlit
9890: 65 33 20 2a 29 64 62 2c 20 70 70 42 74 72 65 65  e3 *)db, ppBtree
98a0: 2c 20 62 74 46 6c 61 67 73 2c 20 76 66 73 46 6c  , btFlags, vfsFl
98b0: 61 67 73 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ags);..  /* If t
98c0: 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
98d0: 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
98e0: 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
98f0: 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
9900: 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
9910: 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 69  value. Except, i
9920: 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 42 74  f the call to Bt
9930: 72 65 65 4f 70 65 6e 28 29 20 72 65 74 75 72 6e  reeOpen() return
9940: 65 64 20 61 20 68 61 6e 64 6c 65 0a 20 20 2a 2a  ed a handle.  **
9950: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 65 78 69 73   open on an exis
9960: 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
9970: 72 2d 63 61 63 68 65 2c 20 64 6f 20 6e 6f 74 20  r-cache, do not 
9980: 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
9990: 2d 63 61 63 68 65 20 0a 20 20 2a 2a 20 73 69 7a  -cache .  ** siz
99a0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
99b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
99c0: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ==sqlite3BtreeSc
99d0: 68 65 6d 61 28 2a 70 70 42 74 72 65 65 2c 20 30  hema(*ppBtree, 0
99e0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  , 0) ){.    sqli
99f0: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
9a00: 53 69 7a 65 28 2a 70 70 42 74 72 65 65 2c 20 6e  Size(*ppBtree, n
9a10: 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Cache);.  }.  re
9a20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9a30: 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
9a40: 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
9a50: 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
9a60: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
9a70: 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
9a80: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
9a90: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
9aa0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
9ab0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
9ac0: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
9ad0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
9ae0: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
9af0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
9b00: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
9b10: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
9b20: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
9b30: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
9b40: 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
9b50: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
9b60: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
9b70: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
9b80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9b90: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
9ba0: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
9bb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9bc0: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
9bd0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62  e3_value_text(db
9be0: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73  ->pErr);.    ass
9bf0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
9c00: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
9c10: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
9c20: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
9c30: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a  r(db->errCode);.
9c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
9c50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9c60: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
9c70: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
9c80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
9c90: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TF16./*.** Retur
9ca0: 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  n UTF-16 encoded
9cb0: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
9cc0: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
9cd0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9ce0: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
9cf0: 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
9d00: 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74  3_errmsg16(sqlit
9d10: 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69  e3 *db){.  stati
9d20: 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f  c const u16 outO
9d30: 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  fMem[] = {.    '
9d40: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
9d50: 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27  ', 'o', 'f', ' '
9d60: 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c  , 'm', 'e', 'm',
9d70: 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'o', 'r', 'y', 
9d80: 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
9d90: 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65  const u16 misuse
9da0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20  [] = {.    'l', 
9db0: 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27  'i', 'b', 'r', '
9dc0: 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20  a', 'r', 'y', ' 
9dd0: 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27  ', .    'r', 'o'
9de0: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c  , 'u', 't', 'i',
9df0: 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20   'n', 'e', ' ', 
9e00: 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27  .    'c', 'a', '
9e10: 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64  l', 'l', 'e', 'd
9e20: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
9e30: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
9e40: 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20   .    'o', 'f', 
9e50: 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27  ' ', .    's', '
9e60: 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65  e', 'q', 'u', 'e
9e70: 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27  ', 'n', 'c', 'e'
9e80: 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
9e90: 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
9ea0: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
9eb0: 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66  rn (void *)outOf
9ec0: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Mem;.  }.  if( !
9ed0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
9ee0: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
9ef0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
9f00: 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d  id *)misuse;.  }
9f10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9f20: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
9f30: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
9f40: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9f50: 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74   z = (void *)out
9f60: 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OfMem;.  }else{.
9f70: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
9f80: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
9f90: 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  >pErr);.    if( 
9fa0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
9fb0: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
9fc0: 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73  (db->pErr, -1, s
9fd0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
9fe0: 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20  >errCode),.     
9ff0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
a000: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
a010: 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  );.      z = sql
a020: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
a030: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
a040: 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c   }.    /* A mall
a050: 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61  oc() may have fa
a060: 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  iled within the 
a070: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
a080: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20  value_text16(). 
a090: 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20     ** above. If 
a0a0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
a0b0: 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d  , then the db->m
a0c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
a0d0: 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
a0e0: 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
a0f0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f  re returning. Do
a100: 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20   this directly, 
a110: 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20  instead of via. 
a120: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69     ** sqlite3Api
a130: 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64  Exit(), to avoid
a140: 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74   setting the dat
a150: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72  abase handle err
a160: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20  or message..    
a170: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  */.    db->mallo
a180: 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d  cFailed = 0;.  }
a190: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a1a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a1b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
a1c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a1d0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
a1e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a1f0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
a200: 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ror code generat
a210: 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20  ed by an SQLite 
a220: 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c  routine. If NULL
a230: 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f   is.** passed to
a240: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
a250: 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c  we assume a mall
a260: 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69  oc() failed duri
a270: 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ng sqlite3_open(
a280: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
a290: 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  3_errcode(sqlite
a2a0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
a2b0: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
a2c0: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
a2d0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
a2e0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
a2f0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
a300: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
a310: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
a320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a330: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
a340: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64   db->errCode & d
a350: 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e  b->errMask;.}.in
a360: 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
a370: 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  ed_errcode(sqlit
a380: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
a390: 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
a3a0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
a3b0: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
a3c0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
a3d0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
a3e0: 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
a3f0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a400: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a410: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
a420: 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  n db->errCode;.}
a430: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
a440: 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
a450: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
a460: 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
a470: 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
a480: 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
a490: 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
a4a0: 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
a4b0: 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
a4c0: 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3* db,.  const 
a4d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
a4e0: 75 38 20 65 6e 63 2c 0a 20 20 75 38 20 63 6f 6c  u8 enc,.  u8 col
a4f0: 6c 54 79 70 65 2c 0a 20 20 76 6f 69 64 2a 20 70  lType,.  void* p
a500: 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
a510: 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
a520: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
a530: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
a540: 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
a550: 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  *).){.  CollSeq 
a560: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e  *pColl;.  int en
a570: 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20  c2;.  int nName 
a580: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a590: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61  0(zName);.  .  a
a5a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a5b0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
a5c0: 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
a5d0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
a5e0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
a5f0: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
a600: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
a610: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
a620: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
a630: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
a640: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
a650: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
a660: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
a670: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
a680: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
a690: 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b  */.  enc2 = enc;
a6a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
a6b0: 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
a6c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  );.  testcase( e
a6d0: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
a6e0: 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69  6_ALIGNED );.  i
a6f0: 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  f( enc2==SQLITE_
a700: 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53  UTF16 || enc2==S
a710: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
a720: 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20  NED ){.    enc2 
a730: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
a740: 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TIVE;.  }.  if( 
a750: 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38  enc2<SQLITE_UTF8
a760: 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f   || enc2>SQLITE_
a770: 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72  UTF16BE ){.    r
a780: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
a790: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  USE_BKPT;.  }.. 
a7a0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
a7b0: 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69  s call is removi
a7c0: 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20  ng or replacing 
a7d0: 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c  an existing coll
a7e0: 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75  ation .  ** sequ
a7f0: 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64  ence. If so, and
a800: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
a810: 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75  e VMs, return bu
a820: 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a  sy. If there.  *
a830: 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
a840: 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  VMs, invalidate 
a850: 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  any pre-compiled
a860: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
a870: 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  /.  pColl = sqli
a880: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
a890: 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
a8a0: 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43  me, 0);.  if( pC
a8b0: 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
a8c0: 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  mp ){.    if( db
a8d0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
a8e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a8f0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
a900: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
a910: 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
a920: 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
a930: 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
a940: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
a950: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
a960: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
a970: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
a980: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
a990: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
a9a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c  ..    /* If coll
a9b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
a9c0: 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64  Coll was created
a9d0: 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63   directly by a c
a9e0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
a9f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
aa00: 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20  lation, and not 
aa10: 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e  generated by syn
aa20: 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20  thCollSeq(),.   
aa30: 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70   ** then any cop
aa40: 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74  ies made by synt
aa50: 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20  hCollSeq() need 
aa60: 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
aa70: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  d..    ** Also, 
aa80: 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75  collation destru
aa90: 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78  ctor - CollSeq.x
aaa0: 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e  Del() - function
aab0: 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
aac0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20   to be called.. 
aad0: 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28     */ .    if( (
aae0: 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51  pColl->enc & ~SQ
aaf0: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
ab00: 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20  ED)==enc2 ){.   
ab10: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c     CollSeq *aCol
ab20: 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
ab30: 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
ab40: 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  q, zName, nName)
ab50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
ab60: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
ab70: 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  3; j++){.       
ab80: 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61   CollSeq *p = &a
ab90: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
aba0: 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f   if( p->enc==pCo
abb0: 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20  ll->enc ){.     
abc0: 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c       if( p->xDel
abd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
abe0: 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72  p->xDel(p->pUser
abf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
ac00: 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70           p->xCmp
ac10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
ac20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ac30: 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  }..  pColl = sql
ac40: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
ac50: 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
ac60: 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ame, 1);.  if( p
ac70: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Coll ){.    pCol
ac80: 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61  l->xCmp = xCompa
ac90: 72 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 70  re;.    pColl->p
aca0: 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 20  User = pCtx;.   
acb0: 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78   pColl->xDel = x
acc0: 44 65 6c 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e  Del;.    pColl->
acd0: 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
ace0: 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
acf0: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
ad00: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65  .    pColl->type
ad10: 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 20 20 7d   = collType;.  }
ad20: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
ad30: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
ad40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
ad50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
ad60: 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
ad70: 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
ad80: 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
ad90: 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
ada0: 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
adb0: 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
adc0: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
add0: 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
ade0: 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
adf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
ae00: 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
ae10: 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
ae20: 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
ae30: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
ae40: 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
ae50: 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
ae60: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
ae70: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
ae80: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
ae90: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
aea0: 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
aeb0: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
aec0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
aed0: 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
aee0: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
aef0: 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
af00: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
af10: 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54  _NUMBER,.  SQLIT
af20: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
af30: 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  PTH,.};../*.** M
af40: 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72  ake sure the har
af50: 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74  d limits are set
af60: 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76   to reasonable v
af70: 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c  alues.*/.#if SQL
af80: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31  ITE_MAX_LENGTH<1
af90: 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
afa0: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73  E_MAX_LENGTH mus
afb0: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
afc0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
afd0: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
afe0: 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
aff0: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
b000: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
b010: 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
b020: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b030: 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54  SQL_LENGTH>SQLIT
b040: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65  E_MAX_LENGTH.# e
b050: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
b060: 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
b070: 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74  not be greater t
b080: 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  han SQLITE_MAX_L
b090: 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66  ENGTH.#endif.#if
b0a0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
b0b0: 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20  OUND_SELECT<2.# 
b0c0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
b0d0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
b0e0: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
b0f0: 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 2.#endif.#if S
b100: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
b110: 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  P<40.# error SQL
b120: 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
b130: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
b140: 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   40.#endif.#if S
b150: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
b160: 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49  ON_ARG<0 || SQLI
b170: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
b180: 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72  ARG>1000.# error
b190: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
b1a0: 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65  TION_ARG must be
b1b0: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
b1c0: 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  000.#endif.#if S
b1d0: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
b1e0: 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
b1f0: 41 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 23  AX_ATTACHED>30.#
b200: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
b210: 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20  X_ATTACHED must 
b220: 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
b230: 20 33 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   30.#endif.#if S
b240: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
b250: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a  ATTERN_LENGTH<1.
b260: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
b270: 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
b280: 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
b290: 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
b2a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b2b0: 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65  COLUMN>32767.# e
b2c0: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
b2d0: 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20  COLUMN must not 
b2e0: 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e  exceed 32767.#en
b2f0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
b300: 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
b310: 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
b320: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
b330: 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  PTH must be at l
b340: 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a  east 1.#endif...
b350: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b360: 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69   value of a limi
b370: 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f  t.  Report the o
b380: 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20  ld value..** If 
b390: 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74  an invalid limit
b3a0: 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69   index is suppli
b3b0: 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a  ed, report -1..*
b3c0: 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
b3d0: 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f  s but still repo
b3e0: 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
b3f0: 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   if the.** new l
b400: 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
b410: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f  ..**.** A new lo
b420: 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e  wer limit does n
b430: 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69  ot shrink existi
b440: 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a  ng constructs..*
b450: 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76  * It merely prev
b460: 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75  ents new constru
b470: 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20  cts that exceed 
b480: 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f  the limit.** fro
b490: 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e  m forming..*/.in
b4a0: 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  t sqlite3_limit(
b4b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
b4c0: 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65   limitId, int ne
b4d0: 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f  wLimit){.  int o
b4e0: 6c 64 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20 6c  ldLimit;.  if( l
b4f0: 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
b500: 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
b510: 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
b520: 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
b530: 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
b540: 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
b550: 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
b560: 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
b570: 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
b580: 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
b590: 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
b5a0: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
b5b0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
b5c0: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
b5d0: 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
b5e0: 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 0a  eturn oldLimit;.
b5f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b600: 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
b610: 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
b620: 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
b630: 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
b640: 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
b650: 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
b660: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b670: 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
b680: 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
b690: 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
b6a0: 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
b6b0: 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
b6c0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
b6d0: 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
b6e0: 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
b6f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
b700: 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
b710: 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
b720: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
b730: 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67 73    unsigned flags
b740: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72  ,        /* Oper
b750: 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
b760: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b770: 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
b780: 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
b790: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
b7a0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
b7b0: 63 3b 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  c;.  int isThrea
b7c0: 64 73 61 66 65 3b 0a 0a 20 20 2a 70 70 44 62 20  dsafe;..  *ppDb 
b7d0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
b7e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
b7f0: 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
b800: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
b810: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
b820: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69   rc;.#endif..  i
b830: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
b840: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
b850: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68  x==0 ){.    isTh
b860: 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
b870: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
b880: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  & SQLITE_OPEN_NO
b890: 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
b8a0: 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
b8b0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
b8c0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   & SQLITE_OPEN_F
b8d0: 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  ULLMUTEX ){.    
b8e0: 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31  isThreadsafe = 1
b8f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
b900: 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71  sThreadsafe = sq
b910: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
b920: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20  g.bFullMutex;.  
b930: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  }.  if( flags & 
b940: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
b950: 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20  ATECACHE ){.    
b960: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
b970: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
b980: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  E;.  }else if( s
b990: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
b9a0: 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
b9b0: 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61  abled ){.    fla
b9c0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
b9d0: 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
b9e0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
b9f0: 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
ba00: 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
ba10: 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
ba20: 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
ba30: 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
ba40: 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
ba50: 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
ba60: 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
ba70: 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
ba80: 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
ba90: 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
baa0: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
bab0: 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
bac0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
bad0: 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
bae0: 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
baf0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
bb00: 49 54 45 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f  ITE, and SQLITE_
bb10: 4f 50 45 4e 5f 43 52 45 41 54 45 2e 20 20 53 69  OPEN_CREATE.  Si
bb20: 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a  lently mask.  **
bb30: 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66   off all other f
bb40: 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  lags..  */.  fla
bb50: 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45  gs &=  ~( SQLITE
bb60: 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
bb70: 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
bb80: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
bb90: 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
bbb0: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
bbc0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
bbd0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
bbe0: 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  P_DB | .        
bbf0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
bc00: 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
bc10: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
bc20: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
bc30: 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  IN_JOURNAL | .  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
bc50: 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
bc60: 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
bc70: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
bc80: 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
bc90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
bca0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
bcb0: 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20  TER_JOURNAL |.  
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
bcd0: 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
bce0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
bcf0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55    SQLITE_OPEN_FU
bd00: 4c 4c 4d 55 54 45 58 0a 20 20 20 20 20 20 20 20  LLMUTEX.        
bd10: 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
bd20: 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
bd30: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
bd40: 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
bd50: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
bd60: 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
bd70: 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
bd80: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
bd90: 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
bda0: 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
bdb0: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
bdc0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
bdd0: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
bde0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
bdf0: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
be00: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
be10: 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
be20: 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
be30: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
be40: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
be50: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
be60: 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
be70: 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44  = 0xff;.  db->nD
be80: 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67  b = 2;.  db->mag
be90: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
bea0: 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44  C_BUSY;.  db->aD
beb0: 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
bec0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  c;..  assert( si
bed0: 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
bee0: 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69  ==sizeof(aHardLi
bef0: 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  mit) );.  memcpy
bf00: 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61  (db->aLimit, aHa
bf10: 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28  rdLimit, sizeof(
bf20: 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20  db->aLimit));.  
bf30: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
bf40: 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
bf50: 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
bf60: 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
bf70: 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   0;.  db->flags 
bf80: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
bf90: 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
bfa0: 5f 41 75 74 6f 49 6e 64 65 78 0a 23 69 66 20 53  _AutoIndex.#if S
bfb0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
bfc0: 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20  LE_FORMAT<4.    
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
bfe0: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
bff0: 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  Fmt.#endif.#ifde
c000: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c010: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  | SQLITE_LoadExt
c040: 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69  ension.#endif.#i
c050: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
c060: 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47  _RECURSIVE_TRIGG
c070: 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERS.            
c080: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65       | SQLITE_Re
c090: 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66  cTriggers.#endif
c0a0: 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
c0b0: 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
c0c0: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
c0d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
c0e0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
c0f0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
c100: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
c110: 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20  dif..  db->pVfs 
c120: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
c130: 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
c140: 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20  !db->pVfs ){.   
c150: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
c160: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
c170: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e 6f  rror(db, rc, "no
c180: 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
c190: 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20  zVfs);.    goto 
c1a0: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
c1b0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
c1c0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
c1d0: 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
c1e0: 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
c1f0: 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
c200: 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
c210: 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
c220: 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
c230: 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
c240: 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
c250: 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
c260: 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
c270: 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
c280: 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
c290: 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
c2a0: 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
c2b0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
c2c0: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52  QLITE_COLL_BINAR
c2d0: 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  Y, 0,.          
c2e0: 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46          binCollF
c2f0: 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
c300: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
c310: 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
c320: 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45 5f  UTF16BE, SQLITE_
c330: 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a  COLL_BINARY, 0,.
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c350: 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30    binCollFunc, 0
c360: 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
c370: 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
c380: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
c390: 45 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42  E, SQLITE_COLL_B
c3a0: 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20  INARY, 0,.      
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43              binC
c3c0: 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
c3d0: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
c3e0: 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49  b, "RTRIM", SQLI
c3f0: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
c400: 43 4f 4c 4c 5f 55 53 45 52 2c 20 28 76 6f 69 64  COLL_USER, (void
c410: 2a 29 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  *)1,.           
c420: 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75         binCollFu
c430: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
c440: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c450: 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
c460: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
c470: 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
c480: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
c490: 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
c4a0: 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20   "BINARY", 0);. 
c4b0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
c4c0: 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
c4d0: 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54  /* Also add a UT
c4e0: 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  F-8 case-insensi
c4f0: 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  tive collation s
c500: 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72  equence. */.  cr
c510: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
c520: 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49  , "NOCASE", SQLI
c530: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
c540: 43 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30 2c 0a  COLL_NOCASE, 0,.
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e    nocaseCollatin
c570: 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a  gFunc, 0);..  /*
c580: 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
c590: 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
c5a0: 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46  r */.  db->openF
c5b0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
c5c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
c5d0: 65 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69  eFactory(db, zFi
c5e0: 6c 65 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54  lename, 0, SQLIT
c5f0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
c600: 53 49 5a 45 2c 20 0a 20 20 20 20 20 20 20 20 20  SIZE, .         
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45    flags | SQLITE
c630: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20  _OPEN_MAIN_DB,. 
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61            &db->a
c660: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66  Db[0].pBt);.  if
c670: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c680: 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
c690: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
c6a0: 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
c6b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c6c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
c6d0: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
c6e0: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
c6f0: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
c700: 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
c710: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
c720: 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
c730: 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
c740: 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
c750: 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
c760: 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68  b, 0);...  /* Th
c770: 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
c780: 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
c790: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
c7a0: 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20  'full'; for the 
c7b0: 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
c7c0: 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e  se it is 'NONE'.
c7d0: 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
c7e0: 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
c7f0: 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
c800: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d   db->aDb[0].zNam
c810: 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
c820: 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
c830: 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d  level = 3;.  db-
c840: 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[1].zName = 
c850: 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44  "temp";.  db->aD
c860: 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[1].safety_leve
c870: 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61  l = 1;..  db->ma
c880: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
c890: 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
c8a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c8b0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
c8c0: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
c8d0: 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
c8e0: 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
c8f0: 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
c900: 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
c910: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
c920: 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
c930: 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
c940: 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
c950: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
c960: 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
c970: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
c980: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
c990: 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
c9a0: 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
c9b0: 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  unctions(db);.. 
c9c0: 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
c9d0: 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
c9e0: 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
c9f0: 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
ca00: 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
ca10: 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
ca20: 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
ca30: 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 73 71  ) API..  */.  sq
ca40: 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74  lite3AutoLoadExt
ca50: 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72  ensions(db);.  r
ca60: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
ca70: 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72  ode(db);.  if( r
ca80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ca90: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
caa0: 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  out;.  }..#ifdef
cab0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
cac0: 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS1.  if( !db->m
cad0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
cae0: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
caf0: 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71  lite3Fts1Init(sq
cb00: 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
cb10: 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  = sqlite3Fts1Ini
cb20: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
cb30: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
cb40: 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69  _ENABLE_FTS2.  i
cb50: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
cb60: 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
cb70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
cb80: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
cb90: 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts2Init(sqlite3*
cba0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
cbb0: 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b  te3Fts2Init(db);
cbc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
cbd0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cbe0: 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62  E_FTS3.  if( !db
cbf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
cc00: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
cc10: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
cc20: 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b  te3Fts3Init(db);
cc30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
cc40: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cc50: 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d  E_ICU.  if( !db-
cc60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
cc70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cc80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
cc90: 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20  e3IcuInit(db);. 
cca0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
ccb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ccc0: 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d  RTREE.  if( !db-
ccd0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
cce0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
ccf0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
cd00: 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a  3RtreeInit(db);.
cd10: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
cd20: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
cd30: 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53  c, 0);..  /* -DS
cd40: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
cd50: 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
cd60: 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
cd70: 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
cd80: 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
cd90: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
cda0: 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
cdb0: 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
cdc0: 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
cdd0: 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
cde0: 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
cdf0: 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
ce00: 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
ce10: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
ce20: 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
ce30: 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
ce40: 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
ce50: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
ce60: 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
ce70: 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
ce80: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
ce90: 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
cea0: 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
cec0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
ced0: 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
cee0: 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20  if..  /* Enable 
cef0: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61  the lookaside-ma
cf00: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a  lloc subsystem *
cf10: 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  /.  setupLookasi
cf20: 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65  de(db, 0, sqlite
cf30: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
cf40: 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20  Lookaside,.     
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
cf70: 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64  Config.nLookasid
cf80: 65 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  e);..opendb_out:
cf90: 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
cfa0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
cfb0: 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
cfc0: 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  dsafe==0 || sqli
cfd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
cfe0: 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
cff0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
d000: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d010: 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
d020: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
d030: 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  db);.  if( rc==S
d040: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
d050: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
d060: 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
d070: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
d080: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d090: 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
d0a0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
d0b0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20  ;.  }.  *ppDb = 
d0c0: 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  db;.  return sql
d0d0: 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
d0e0: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  c);.}../*.** Ope
d0f0: 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
d100: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
d110: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20  sqlite3_open(.  
d120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
d130: 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
d140: 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72  3 **ppDb .){.  r
d150: 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
d160: 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70  se(zFilename, pp
d170: 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
d180: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
d190: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
d1a0: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
d1b0: 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  EATE, 0);.}.int 
d1c0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
d1d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
d1e0: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61  ilename,   /* Da
d1f0: 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
d200: 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
d210: 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
d220: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
d230: 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  ite db handle */
d240: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
d250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
d260: 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
d270: 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
d280: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
d290: 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f  module to use */
d2a0: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
d2b0: 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61  nDatabase(filena
d2c0: 6d 65 2c 20 70 70 44 62 2c 20 66 6c 61 67 73 2c  me, ppDb, flags,
d2d0: 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64   zVfs);.}..#ifnd
d2e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
d2f0: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  TF16./*.** Open 
d300: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68  a new database h
d310: 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
d320: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20  lite3_open16(.  
d330: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
d340: 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
d350: 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68  3 **ppDb.){.  ch
d360: 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e  ar const *zFilen
d370: 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65  ame8;   /* zFile
d380: 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20  name encoded in 
d390: 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66  UTF-8 instead of
d3a0: 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c   UTF-16 */.  sql
d3b0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
d3c0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
d3d0: 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
d3e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70   );.  assert( pp
d3f0: 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20  Db );.  *ppDb = 
d400: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
d410: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
d420: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
d430: 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
d440: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d450: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c  c;.#endif.  pVal
d460: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
d470: 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
d480: 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
d490: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
d4a0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
d4b0: 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  IVE, SQLITE_STAT
d4c0: 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  IC);.  zFilename
d4d0: 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  8 = sqlite3Value
d4e0: 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
d4f0: 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a  E_UTF8);.  if( z
d500: 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20  Filename8 ){.   
d510: 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61   rc = openDataba
d520: 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70  se(zFilename8, p
d530: 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
d540: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
d550: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
d560: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
d570: 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61  REATE, 0);.    a
d580: 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20  ssert( *ppDb || 
d590: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
d5a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
d5b0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62  SQLITE_OK && !Db
d5c0: 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44  HasProperty(*ppD
d5d0: 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
d5e0: 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20  oaded) ){.      
d5f0: 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c  ENC(*ppDb) = SQL
d600: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
d610: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
d620: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d630: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c  NOMEM;.  }.  sql
d640: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
d650: 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73  al);..  return s
d660: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
d670: 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   rc);.}.#endif /
d680: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
d690: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
d6a0: 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
d6b0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
d6c0: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
d6d0: 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
d6e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
d6f0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
d700: 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
d710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
d720: 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
d730: 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
d740: 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
d750: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
d760: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
d770: 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
d780: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  c;.  sqlite3_mut
d790: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d7a0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
d7b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d7c0: 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
d7d0: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
d7e0: 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 53  Name, (u8)enc, S
d7f0: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c  QLITE_COLL_USER,
d800: 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
d810: 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
d820: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
d830: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
d840: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
d850: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
d860: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  c;.}../*.** Regi
d870: 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
d880: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
d890: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
d8a0: 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
d8b0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
d8c0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20  _collation_v2(. 
d8d0: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
d8e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
d8f0: 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
d900: 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
d910: 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
d920: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
d930: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
d940: 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a  void*),.  void(*
d950: 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a  xDel)(void*).){.
d960: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
d970: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
d980: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
d990: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
d9a0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20  cFailed );.  rc 
d9b0: 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  = createCollatio
d9c0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38  n(db, zName, (u8
d9d0: 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f 4c  )enc, SQLITE_COL
d9e0: 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c 20 78 43  L_USER, pCtx, xC
d9f0: 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
da00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
da10: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
da20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
da30: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
da40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
da50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
da60: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
da70: 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
da80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
da90: 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
daa0: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
dab0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
dac0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
dad0: 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
dae0: 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
daf0: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
db00: 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
db10: 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
db20: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
db30: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
db40: 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
db50: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
db60: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
db70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
db80: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
db90: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
dba0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
dbb0: 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
dbc0: 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
dbd0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
dbe0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29  ITE_UTF16NATIVE)
dbf0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29  ;.  if( zName8 )
dc00: 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74  {.    rc = creat
dc10: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
dc20: 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20  Name8, (u8)enc, 
dc30: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52  SQLITE_COLL_USER
dc40: 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
dc50: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
dc60: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
dc70: 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  e8);.  }.  rc = 
dc80: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
dc90: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
dca0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
dcb0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
dcc0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
dcd0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
dce0: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
dcf0: 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
dd00: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
dd10: 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
dd20: 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
dd30: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
dd40: 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
dd50: 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
dd60: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
dd70: 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
dd80: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
dd90: 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71  ion_needed(.  sq
dda0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
ddb0: 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
ddc0: 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
ddd0: 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c  llNeeded)(void*,
dde0: 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
ddf0: 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72  xtRep,const char
de00: 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
de10: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
de20: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
de30: 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c  ollNeeded = xCol
de40: 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78  lNeeded;.  db->x
de50: 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30  CollNeeded16 = 0
de60: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
de70: 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
de80: 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
de90: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
dea0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
deb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dec0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ded0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
dee0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
def0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
df00: 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
df10: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
df20: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
df30: 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
df40: 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
df50: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
df60: 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
df70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
df80: 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
df90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
dfa0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
dfb0: 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
dfc0: 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29  (*xCollNeeded16)
dfd0: 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
dfe0: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
dff0: 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73  st void*).){.  s
e000: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e010: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
e020: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
e030: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c   = 0;.  db->xCol
e040: 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c  lNeeded16 = xCol
e050: 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d  lNeeded16;.  db-
e060: 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
e070: 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
e080: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
e090: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
e0a0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
e0b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
e0c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e0d0: 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65  UTF16 */..#ifnde
e0e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c  f SQLITE_OMIT_GL
e0f0: 4f 42 41 4c 52 45 43 4f 56 45 52 0a 23 69 66 6e  OBALRECOVER.#ifn
e100: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e110: 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
e120: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
e130: 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f  s now an anachro
e140: 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f  nism. It used to
e150: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f   be used to reco
e160: 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61  ver from a.** ma
e170: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
e180: 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64  but SQLite now d
e190: 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74  oes this automat
e1a0: 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ically..*/.int s
e1b0: 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
e1c0: 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72  cover(void){.  r
e1d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e1e0: 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  .}.#endif.#endif
e1f0: 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
e200: 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
e210: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
e220: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
e230: 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d   autocommit.** m
e240: 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ode.  Return TRU
e250: 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46  E if it is and F
e260: 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75  ALSE if not.  Au
e270: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73  tocommit mode is
e280: 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c   on.** by defaul
e290: 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69  t.  Autocommit i
e2a0: 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20  s disabled by a 
e2b0: 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20  BEGIN statement 
e2c0: 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a  and reenabled.**
e2d0: 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d   by the next COM
e2e0: 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e  MIT or ROLLBACK.
e2f0: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53  .**.******* THIS
e300: 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45 4e   IS AN EXPERIMEN
e310: 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20 53  TAL API AND IS S
e320: 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47 45  UBJECT TO CHANGE
e330: 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73   ******.*/.int s
e340: 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
e350: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
e360: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
e370: 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a  >autoCommit;.}..
e380: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
e390: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
e3a0: 20 73 75 62 74 69 74 75 74 65 73 20 66 6f 72 20   subtitutes for 
e3b0: 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45  constants SQLITE
e3c0: 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c  _CORRUPT,.** SQL
e3d0: 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49  ITE_MISUSE, SQLI
e3e0: 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c  TE_CANTOPEN, SQL
e3f0: 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f  ITE_IOERR and po
e400: 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72  ssibly other err
e410: 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  or.** constants.
e420: 20 20 54 68 65 79 20 73 65 72 76 65 72 20 74 77    They server tw
e430: 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a  o purposes:.**.*
e440: 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73  *   1.  Serve as
e450: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
e460: 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
e470: 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62  akpoint in a deb
e480: 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74  ugger.**       t
e490: 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65  o detect when ve
e4a0: 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64  rsion error cond
e4b0: 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a  itions occurs..*
e4c0: 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b  *.**   2.  Invok
e4d0: 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
e4e0: 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73  to provide the s
e4f0: 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74  ource code locat
e500: 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20  ion where.**    
e510: 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65     a low-level e
e520: 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65  rror is first de
e530: 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  tected..*/.int s
e540: 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72  qlite3CorruptErr
e550: 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
e560: 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
e570: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
e580: 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
e590: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e5a0: 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20  CORRUPT,.       
e5b0: 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65         "database
e5c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 75 6e   corruption foun
e5d0: 64 20 62 79 20 73 6f 75 72 63 65 20 6c 69 6e 65  d by source line
e5e0: 20 25 64 22 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20   %d", lineno);. 
e5f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e600: 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71  ORRUPT;.}.int sq
e610: 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72  lite3MisuseError
e620: 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
e630: 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
e640: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
e650: 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
e660: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49  e3_log(SQLITE_MI
e670: 53 55 53 45 2c 20 22 6d 69 73 75 73 65 20 64 65  SUSE, "misuse de
e680: 74 65 63 74 65 64 20 62 79 20 73 6f 75 72 63 65  tected by source
e690: 20 6c 69 6e 65 20 25 64 22 2c 20 6c 69 6e 65 6e   line %d", linen
e6a0: 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  o);.  return SQL
e6b0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e  ITE_MISUSE;.}.in
e6c0: 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65  t sqlite3Cantope
e6d0: 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  nError(int linen
e6e0: 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
e6f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
e700: 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
e710: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
e720: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 22 63  ITE_CANTOPEN, "c
e730: 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20  annot open file 
e740: 61 74 20 73 6f 75 72 63 65 20 6c 69 6e 65 20 25  at source line %
e750: 64 22 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 72  d", lineno);.  r
e760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
e770: 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TOPEN;.}...#ifnd
e780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
e790: 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
e7a0: 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e  This is a conven
e7b0: 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68  ience routine th
e7c0: 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  at makes sure th
e7d0: 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70  at all thread-sp
e7e0: 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66  ecific.** data f
e7f0: 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68  or this thread h
e800: 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  as been dealloca
e810: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ted..**.** SQLit
e820: 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
e830: 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
e840: 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f   data so this ro
e850: 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a  utine is now a.*
e860: 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20  * no-op.  It is 
e870: 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73  retained for his
e880: 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
e890: 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ility..*/.void s
e8a0: 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
e8b0: 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23  eanup(void){.}.#
e8c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
e8d0: 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  urn meta informa
e8e0: 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65  tion about a spe
e8f0: 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20  cific column of 
e900: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
e910: 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
e920: 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73   in sqlite3.h (s
e930: 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20  qlite.h.in) for 
e940: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64  details..*/.#ifd
e950: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e960: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e970: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62  .int sqlite3_tab
e980: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
e990: 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ta(.  sqlite3 *d
e9a0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
e9b0: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
e9c0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
e9d0: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
e9e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
e9f0: 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c  ase name or NULL
ea00: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ea10: 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *zTableName,   
ea20: 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
ea30: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
ea40: 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20  *zColumnName,   
ea50: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
ea60: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
ea70: 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20  **pzDataType,   
ea80: 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c   /* OUTPUT: Decl
ea90: 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a  ared data type *
eaa0: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
eab0: 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20  *pzCollSeq,     
eac0: 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61  /* OUTPUT: Colla
ead0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
eae0: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f  me */.  int *pNo
eaf0: 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  tNull,          
eb00: 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
eb10: 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20  rue if NOT NULL 
eb20: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74  constraint exist
eb30: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69  s */.  int *pPri
eb40: 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20  maryKey,        
eb50: 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
eb60: 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72  ue if column par
eb70: 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74  t of PK */.  int
eb80: 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20   *pAutoinc      
eb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
eba0: 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
ebb0: 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65  mn is auto-incre
ebc0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
ebd0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
ebe0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c  rMsg = 0;.  Tabl
ebf0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43  e *pTab = 0;.  C
ec00: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
ec10: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20  .  int iCol;..  
ec20: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74  char const *zDat
ec30: 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  aType = 0;.  cha
ec40: 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65  r const *zCollSe
ec50: 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74  q = 0;.  int not
ec60: 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  null = 0;.  int 
ec70: 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a  primarykey = 0;.
ec80: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20    int autoinc = 
ec90: 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  0;..  /* Ensure 
eca0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
ecb0: 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61  ema has been loa
ecc0: 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
ecd0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ece0: 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74  >mutex);.  sqlit
ecf0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
ed00: 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  db);.  rc = sqli
ed10: 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72  te3Init(db, &zEr
ed20: 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c  rMsg);.  if( SQL
ed30: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
ed40: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
ed50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
ed60: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20  te the table in 
ed70: 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54  question */.  pT
ed80: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
ed90: 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65  Table(db, zTable
eda0: 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  Name, zDbName);.
edb0: 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70    if( !pTab || p
edc0: 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
edd0: 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20      pTab = 0;.  
ede0: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
edf0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64  ;.  }..  /* Find
ee00: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20   the column for 
ee10: 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65  which info is re
ee20: 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28  quested */.  if(
ee30: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
ee40: 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
ee50: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
ee60: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20  >iPKey;.    if( 
ee70: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
ee80: 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
ee90: 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d  Col[iCol];.    }
eea0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
eeb0: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70  r(iCol=0; iCol<p
eec0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
eed0: 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d  +){.      pCol =
eee0: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
eef0: 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  l];.      if( 0=
ef00: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
ef10: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
ef20: 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
ef30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ef40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ef50: 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43  ( iCol==pTab->nC
ef60: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ol ){.      pTab
ef70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
ef80: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
ef90: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
efa0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
efb0: 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20  stores the meta 
efc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74  information that
efd0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
efe0: 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61  d.  ** to the ca
eff0: 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61  ller in local va
f000: 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70  riables zDataTyp
f010: 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74  e, zCollSeq, not
f020: 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79  null, primarykey
f030: 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e  .  ** and autoin
f040: 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  c. At this point
f050: 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
f060: 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20  ossibilities:.  
f070: 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20  ** .  **     1. 
f080: 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f  The specified co
f090: 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f  lumn name was ro
f0a0: 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22  wid", "oid" or "
f0b0: 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20  _rowid_" .  **  
f0c0: 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20        and there 
f0d0: 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79  is no explicitly
f0e0: 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f   declared IPK co
f0f0: 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  lumn. .  **.  **
f100: 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c       2. The tabl
f110: 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20  e is not a view 
f120: 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  and the column n
f130: 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61  ame identified a
f140: 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65  n .  **        e
f150: 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
f160: 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20  ed column. Copy 
f170: 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
f180: 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a   from *pCol..  *
f190: 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b  / .  if( pCol ){
f1a0: 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
f1b0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20   pCol->zType;.  
f1c0: 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f    zCollSeq = pCo
f1d0: 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f  l->zColl;.    no
f1e0: 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f  tnull = pCol->no
f1f0: 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72  tNull!=0;.    pr
f200: 69 6d 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c  imarykey  = pCol
f210: 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a  ->isPrimKey!=0;.
f220: 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54      autoinc = pT
f230: 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
f240: 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  && (pTab->tabFla
f250: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
f260: 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c  ement)!=0;.  }el
f270: 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70  se{.    zDataTyp
f280: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
f290: 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20     primarykey = 
f2a0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43  1;.  }.  if( !zC
f2b0: 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43  ollSeq ){.    zC
f2c0: 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59  ollSeq = "BINARY
f2d0: 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  ";.  }..error_ou
f2e0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t:.  sqlite3Btre
f2f0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
f300: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
f310: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
f320: 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
f330: 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
f340: 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
f350: 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
f360: 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
f370: 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
f380: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
f390: 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
f3a0: 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
f3b0: 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
f3c0: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
f3d0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
f3e0: 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
f3f0: 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
f400: 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
f410: 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
f420: 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
f430: 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
f440: 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
f450: 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
f460: 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
f470: 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
f480: 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
f490: 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
f4a0: 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
f4b0: 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
f4c0: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
f4d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f4e0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
f4f0: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
f500: 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
f510: 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
f520: 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
f530: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
f540: 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
f550: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
f560: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
f570: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45  rror(db, rc, (zE
f580: 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
f590: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
f5a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
f5b0: 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
f5c0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
f5d0: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
f5e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f5f0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f600: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
f610: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
f620: 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
f630: 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
f640: 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
f650: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
f660: 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
f670: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
f680: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
f690: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
f6a0: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
f6b0: 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
f6c0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
f6d0: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
f6e0: 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
f6f0: 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
f700: 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
f710: 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
f720: 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
f730: 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
f740: 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
f750: 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
f760: 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
f770: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f780: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
f790: 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
f7a0: 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
f7b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f7c0: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
f7d0: 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
f7e0: 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
f7f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f800: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
f810: 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
f820: 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
f830: 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
f840: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f850: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f860: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f870: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
f880: 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
f890: 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
f8a0: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
f8b0: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
f8c0: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
f8d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
f8e0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
f8f0: 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
f900: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
f910: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
f920: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
f930: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f940: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f950: 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29  if( zDbName==0 )
f960: 7b 0a 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20  {.    iDb = 0;. 
f970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
f980: 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e  iDb=0; iDb<db->n
f990: 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  Db; iDb++){.    
f9a0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 64 62 2d    if( strcmp(db-
f9b0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
f9c0: 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20 29 20 62   zDbName)==0 ) b
f9d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
f9e0: 20 20 69 66 28 20 69 44 62 3c 64 62 2d 3e 6e 44    if( iDb<db->nD
f9f0: 62 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  b ){.    Btree *
fa00: 70 42 74 72 65 65 20 3d 20 64 62 2d 3e 61 44 62  pBtree = db->aDb
fa10: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
fa20: 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
fa30: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
fa40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
fa50: 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 20 20  file *fd;.      
fa60: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
fa70: 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20  r(pBtree);.     
fa80: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
fa90: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72  3BtreePager(pBtr
faa0: 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ee);.      asser
fab0: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
fac0: 20 20 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74        fd = sqlit
fad0: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
fae0: 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
faf0: 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
fb00: 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f    if( fd->pMetho
fb10: 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ds ){.        rc
fb20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
fb30: 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
fb40: 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pArg);.      }. 
fb50: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
fb60: 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
fb70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
fb80: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
fb90: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
fba0: 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f  turn rc;   .}../
fbb0: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
fbc0: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f  o the testing lo
fbd0: 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  gic..*/.int sqli
fbe0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
fbf0: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
fc00: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66   int rc = 0;.#if
fc10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fc20: 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20  _BUILTIN_TEST.  
fc30: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
fc40: 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
fc50: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
fc60: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
fc70: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
fc80: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
fc90: 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
fca0: 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
fcb0: 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
fcc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
fcd0: 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
fce0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
fcf0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
fd00: 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
fd10: 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
fd20: 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
fd30: 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
fd40: 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
fd50: 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
fd60: 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
fd70: 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
fd80: 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
fd90: 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
fda0: 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
fdb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
fdc0: 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
fdd0: 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
fde0: 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
fdf0: 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
fe00: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
fe10: 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
fe20: 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
fe30: 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
fe40: 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
fe50: 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
fe60: 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
fe70: 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
fe80: 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
fe90: 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
fea0: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
feb0: 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
fec0: 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
fed0: 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
fee0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
fef0: 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
ff00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
ff10: 50 72 6e 67 52 65 73 65 74 53 74 61 74 65 28 29  PrngResetState()
ff20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ff30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
ff40: 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
ff50: 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
ff60: 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
ff70: 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
ff80: 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
ff90: 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
ffa0: 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
ffb0: 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
ffc0: 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
ffd0: 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
ffe0: 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
fff0: 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
10000 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
10010 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
10020 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
10030 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
10040 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
10050 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
10060 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
10070 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
10080 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
10090 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
100a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
100b0 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
100c0 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
100d0 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
100e0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
100f0 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
10100 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
10110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10120 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
10130 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
10140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10150 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
10160 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
10170 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c  ntrol(BENIGN_MAL
10180 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69  LOC_HOOKS, xBegi
10190 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a  n, xEnd).    **.
101a0 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20      ** Register 
101b0 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f  hooks to call to
101c0 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20   indicate which 
101d0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
101e0 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65  s .    ** are be
101f0 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nign..    */.   
10200 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
10210 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
10220 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20  LOC_HOOKS: {.   
10230 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
10240 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  (*void_function)
10250 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f  (void);.      vo
10260 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
10270 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ignBegin;.      
10280 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
10290 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20  enignEnd;.      
102a0 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76  xBenignBegin = v
102b0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
102c0 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
102d0 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f  xBenignEnd = va_
102e0 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
102f0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  ction);.      sq
10300 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f  lite3BenignMallo
10310 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65  cHooks(xBenignBe
10320 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29  gin, xBenignEnd)
10330 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10340 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
10350 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
10360 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
10370 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
10380 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64  G_BYTE, unsigned
10390 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
103a0 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45     ** Set the PE
103b0 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68  NDING byte to th
103c0 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  e value in the a
103d0 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e  rgument, if X>0.
103e0 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20  .    ** Make no 
103f0 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e  changes if X==0.
10400 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c    Return the val
10410 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ue of the pendin
10420 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73  g byte.    ** as
10430 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66   it existing bef
10440 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
10450 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
10460 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52   **.    ** IMPOR
10470 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20  TANT:  Changing 
10480 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
10490 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30   from 0x40000000
104a0 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20   results in.    
104b0 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ** an incompatib
104c0 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  le database file
104d0 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69   format.  Changi
104e0 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
104f0 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  yte.    ** while
10500 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f   any database co
10510 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
10520 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65   results in unde
10530 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  fined and.    **
10540 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68   dileterious beh
10550 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  avior..    */.  
10560 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
10570 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
10580 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 73  YTE: {.      uns
10590 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c  igned int newVal
105a0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
105b0 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
105c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
105d0 65 6e 64 69 6e 67 42 79 74 65 3b 0a 20 20 20 20  endingByte;.    
105e0 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
105f0 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
10600 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
10610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
10620 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
10630 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
10640 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
10650 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
10660 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
10670 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
10680 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
10690 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
106a0 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
106b0 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
106c0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
106d0 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
106e0 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
106f0 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
10700 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
10710 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
10720 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
10730 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
10740 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
10750 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
10760 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
10770 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
10780 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
10790 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
107a0 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
107b0 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
107c0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
107d0 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
107e0 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
107f0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
10800 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
10810 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
10820 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
10830 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
10840 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
10850 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
10860 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
10870 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
10880 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
10890 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
108a0 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
108b0 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
108c0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
108d0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
108e0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
108f0 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
10900 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
10910 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
10920 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
10930 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
10940 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
10950 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
10960 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
10970 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
10980 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
10990 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
109a0 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
109b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
109c0 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
109d0 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
109e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
109f0 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
10a00 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
10a10 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
10a20 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
10a30 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
10a40 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
10a50 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
10a60 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
10a70 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
10a80 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
10a90 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
10aa0 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
10ab0 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
10ac0 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
10ad0 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
10ae0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
10af0 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
10b00 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
10b10 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
10b20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
10b30 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
10b40 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
10b50 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
10b60 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
10b70 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
10b80 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
10b90 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
10ba0 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
10bb0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
10bc0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
10bd0 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
10be0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
10bf0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
10c00 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
10c10 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
10c20 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
10c30 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
10c40 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
10c50 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
10c60 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
10c70 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
10c80 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
10c90 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
10ca0 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
10cb0 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
10cc0 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
10cd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
10ce0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
10cf0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
10d00 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
10d10 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
10d20 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
10d30 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
10d40 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
10d50 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
10d60 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
10d70 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
10d80 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
10d90 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
10da0 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
10db0 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
10dc0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
10dd0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
10de0 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
10df0 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
10e00 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
10e10 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
10e20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10e30 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
10e40 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
10e50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
10e60 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33  RESERVE, sqlite3
10e70 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
10e80 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74   **.    ** Set t
10e90 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65  he nReserve size
10ea0 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61   to N for the ma
10eb0 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74  in database on t
10ec0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
10ed0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
10ee0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
10ef0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
10f00 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20  L_RESERVE: {.   
10f10 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
10f20 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
10f30 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  te3*);.      int
10f40 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69   x = va_arg(ap,i
10f50 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
10f60 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10f70 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
10f80 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
10f90 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62  PageSize(db->aDb
10fa0 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30  [0].pBt, 0, x, 0
10fb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10fc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10fd0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62  >mutex);.      b
10fe0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
10ff0 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   /*  sqlite3_tes
11000 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
11010 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
11020 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33  ZATIONS, sqlite3
11030 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20   *db, int N).   
11040 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
11050 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72  e or disable var
11060 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ious optimizatio
11070 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ns for testing p
11080 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20  urposes.  The . 
11090 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e     ** argument N
110a0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
110b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74   optimizations t
110c0 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20  o be disabled.  
110d0 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a  For normal.    *
110e0 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68  * operation N sh
110f0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
11100 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74  idea is that a t
11110 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b  est program (lik
11120 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c  e the.    ** SQL
11130 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53   Logic Test or S
11140 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20  LT test module) 
11150 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65  can run the same
11160 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69   SQL multiple ti
11170 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  mes.    ** with 
11180 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
11190 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74  tions disabled t
111a0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
111b0 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20  e same answer.  
111c0 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64    ** is obtained
111d0 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a   in every case..
111e0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
111f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
11200 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b  OPTIMIZATIONS: {
11210 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
11220 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
11230 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
11240 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
11250 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64  ap,int);.      d
11260 62 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26 20  b->flags = (x & 
11270 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 20  SQLITE_OptMask) 
11280 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 7e  | (db->flags & ~
11290 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29 3b  SQLITE_OptMask);
112a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
112b0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
112c0 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
112d0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
112e0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
112f0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
11300 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  RD, const char *
11310 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20  zWord).    **.  
11320 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73    ** If zWord is
11330 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67   a keyword recog
11340 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72  nized by the par
11350 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ser, then return
11360 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
11370 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20  er of keywords. 
11380 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20   Or if zWord is 
11390 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72  not a keyword, r
113a0 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20  eturn 0..    ** 
113b0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
113c0 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c  t feature is onl
113d0 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
113e0 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
113f0 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  since.    ** the
11400 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
11410 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64  D macro is not d
11420 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
11430 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20  ile if SQLite.  
11440 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73    ** is built us
11450 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75  ing separate sou
11460 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  rce files..    *
11470 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
11480 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
11490 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f  WORD: {.      co
114a0 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  nst char *zWord 
114b0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
114c0 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
114d0 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
114e0 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b  Strlen30(zWord);
114f0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c  .      rc = (sql
11500 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
11510 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d  (u8*)zWord, n)!=
11520 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f  TK_ID) ? SQLITE_
11530 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20  N_KEYWORD : 0;. 
11540 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11550 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 7d 0a 20  }.#endif ..  }. 
11560 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e   va_end(ap);.#en
11570 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11580 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20  IT_BUILTIN_TEST 
11590 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
115a0 7d 0a                                            }.