/ Hex Artifact Content
Login

Artifact b672c4af58f033c54398999dec5db9d4b6d99331:


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 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
8c00: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64  _OMIT_WAL.  void
8c10: 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65   *pRet;.  sqlite
8c20: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
8c30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
8c40: 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a   = db->pWalArg;.
8c50: 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61    db->xWalCallba
8c60: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
8c70: 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20    db->pWalArg = 
8c80: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
8c90: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8ca0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
8cb0: 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72   pRet;.#else.  r
8cc0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
8cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
8ce0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
8cf0: 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
8d00: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
8d10: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
8d20: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
8d30: 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
8d40: 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
8d50: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8d60: 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
8d70: 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
8d80: 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
8d90: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
8da0: 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
8db0: 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
8dc0: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
8dd0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
8de0: 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
8df0: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
8e00: 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
8e10: 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
8e20: 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
8e30: 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
8e40: 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
8e50: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
8e60: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
8e70: 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
8e80: 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
8e90: 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
8ea0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
8ec0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
8ed0: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ef0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
8f10: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
8f20: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
8f30: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
8f60: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
8f70: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
8fa0: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
8fb0: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
8fc0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
8fd0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
8fe0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
8ff0: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
9000: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
9010: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
9030: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
9040: 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
9080: 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90a0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
90b0: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
90c0: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
90f0: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
9100: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
9110: 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
9120: 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
9130: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
9140: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
9150: 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
9160: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
9170: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
9180: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
9190: 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
91a0: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
91b0: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
91c0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
91d0: 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ==3.  return 1;.
91e0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
91f0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c  E_TEMP_STORE<1 |
9200: 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  | SQLITE_TEMP_ST
9210: 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30  ORE>3.  return 0
9220: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
9230: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9240: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
9250: 74 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  te a connection 
9260: 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 42 54  to a database BT
9270: 72 65 65 0a 2a 2a 20 64 72 69 76 65 72 2e 20 20  ree.** driver.  
9280: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
9290: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69  the name of a fi
92a0: 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20 66 69  le, then that fi
92b0: 6c 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65 64 20  le is.** opened 
92c0: 61 6e 64 20 75 73 65 64 2e 20 20 49 66 20 7a 46  and used.  If zF
92d0: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6d  ilename is the m
92e0: 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f  agic name ":memo
92f0: 72 79 3a 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ry:" then.** the
9300: 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
9310: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 28 61  red in memory (a
9320: 6e 64 20 69 73 20 74 68 75 73 20 66 6f 72 67 6f  nd is thus forgo
9330: 74 74 65 6e 20 61 73 20 73 6f 6f 6e 20 61 73 0a  tten as soon as.
9340: 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
9350: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 29 20 20 49  n is closed.)  I
9360: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
9370: 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ULL then the dat
9380: 61 62 61 73 65 0a 2a 2a 20 69 73 20 61 20 22 76  abase.** is a "v
9390: 69 72 74 75 61 6c 22 20 64 61 74 61 62 61 73 65  irtual" database
93a0: 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 75   for transient u
93b0: 73 65 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20 64  se only and is d
93c0: 65 6c 65 74 65 64 20 61 73 0a 2a 2a 20 73 6f 6f  eleted as.** soo
93d0: 6e 20 61 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  n as the connect
93e0: 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  ion is closed..*
93f0: 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 64  *.** A virtual d
9400: 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 65  atabase can be e
9410: 69 74 68 65 72 20 61 20 64 69 73 6b 20 66 69 6c  ither a disk fil
9420: 65 20 28 74 68 61 74 20 69 73 20 61 75 74 6f 6d  e (that is autom
9430: 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 64 65 6c 65  atically.** dele
9440: 74 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 6c  ted when the fil
9450: 65 20 69 73 20 63 6c 6f 73 65 64 29 20 6f 72 20  e is closed) or 
9460: 69 74 20 61 6e 20 62 65 20 68 65 6c 64 20 65 6e  it an be held en
9470: 74 69 72 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  tirely in memory
9480: 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
9490: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 29 20 66  TempInMemory() f
94a0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
94b0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69  to determine whi
94c0: 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ch..*/.int sqlit
94d0: 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 0a  e3BtreeFactory(.
94e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9500: 61 69 6e 20 64 61 74 61 62 61 73 65 20 77 68 65  ain database whe
9510: 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78 20 6f 74  n opening aux ot
9520: 68 65 72 77 69 73 65 20 30 20 2a 2f 0a 20 20 63  herwise 0 */.  c
9530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
9540: 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  name,    /* Name
9550: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
9560: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
9570: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
9580: 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 2c  int omitJournal,
9590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
95a0: 54 52 55 45 20 74 68 65 6e 20 64 6f 20 6e 6f 74  TRUE then do not
95b0: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 66 69   journal this fi
95c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 63  le */.  int nCac
95d0: 68 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  he,             
95e0: 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 70 61    /* How many pa
95f0: 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
9600: 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 76  cache */.  int v
9610: 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
9620: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
9630: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
9640: 76 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42 74 72  vfsOpen */.  Btr
9650: 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20 20 20  ee **ppBtree    
9660: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9670: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
9680: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
9690: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  re */.){.  int b
96a0: 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e  tFlags = 0;.  in
96b0: 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73 65 72  t rc;.  .  asser
96c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
96d0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
96e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70   );.  assert( pp
96f0: 42 74 72 65 65 20 21 3d 20 30 29 3b 0a 20 20 69  Btree != 0);.  i
9700: 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c 20 29  f( omitJournal )
9710: 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d  {.    btFlags |=
9720: 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
9730: 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  NAL;.  }.  if( d
9740: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
9750: 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  E_NoReadlock ){.
9760: 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d 20 42      btFlags |= B
9770: 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  TREE_NO_READLOCK
9780: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
9790: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
97a0: 44 42 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  DB.  if( zFilena
97b0: 6d 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  me==0 && sqlite3
97c0: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
97d0: 20 29 7b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d   ){.    zFilenam
97e0: 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22 3b 0a  e = ":memory:";.
97f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
9800: 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
9810: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
9820: 42 29 21 3d 30 20 26 26 20 28 7a 46 69 6c 65 6e  B)!=0 && (zFilen
9830: 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69 6c 65  ame==0 || *zFile
9840: 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  name==0) ){.    
9850: 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
9860: 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
9870: 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
9880: 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
9890: 44 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  DB;.  }.  rc = s
98a0: 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
98b0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71 6c 69  zFilename, (sqli
98c0: 74 65 33 20 2a 29 64 62 2c 20 70 70 42 74 72 65  te3 *)db, ppBtre
98d0: 65 2c 20 62 74 46 6c 61 67 73 2c 20 76 66 73 46  e, btFlags, vfsF
98e0: 6c 61 67 73 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lags);..  /* If 
98f0: 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
9900: 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
9910: 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
9920: 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
9930: 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74  the.  ** default
9940: 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20   value. Except, 
9950: 69 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 42  if the call to B
9960: 74 72 65 65 4f 70 65 6e 28 29 20 72 65 74 75 72  treeOpen() retur
9970: 6e 65 64 20 61 20 68 61 6e 64 6c 65 0a 20 20 2a  ned a handle.  *
9980: 2a 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 65 78 69  * open on an exi
9990: 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
99a0: 65 72 2d 63 61 63 68 65 2c 20 64 6f 20 6e 6f 74  er-cache, do not
99b0: 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
99c0: 72 2d 63 61 63 68 65 20 0a 20 20 2a 2a 20 73 69  r-cache .  ** si
99d0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ze..  */.  if( r
99e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
99f0: 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53  0==sqlite3BtreeS
9a00: 63 68 65 6d 61 28 2a 70 70 42 74 72 65 65 2c 20  chema(*ppBtree, 
9a10: 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 73 71 6c  0, 0) ){.    sql
9a20: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
9a30: 65 53 69 7a 65 28 2a 70 70 42 74 72 65 65 2c 20  eSize(*ppBtree, 
9a40: 6e 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20 20 72  nCache);.  }.  r
9a50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9a60: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20  ** Return UTF-8 
9a70: 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
9a80: 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
9a90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
9aa0: 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
9ab0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
9ac0: 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  *sqlite3_errmsg(
9ad0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
9ae0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
9af0: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
9b00: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
9b10: 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
9b20: 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  M);.  }.  if( !s
9b30: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
9b40: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
9b50: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
9b60: 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45  te3ErrStr(SQLITE
9b70: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20  _MISUSE_BKPT);. 
9b80: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
9b90: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
9ba0: 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
9bb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
9bc0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
9bd0: 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  rStr(SQLITE_NOME
9be0: 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  M);.  }else{.   
9bf0: 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69   z = (char*)sqli
9c00: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64  te3_value_text(d
9c10: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73  b->pErr);.    as
9c20: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
9c30: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
9c40: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
9c50: 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
9c60: 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b  tr(db->errCode);
9c70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
9c80: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9c90: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9ca0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
9cb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9cc0: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
9cd0: 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
9ce0: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
9cf0: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
9d00: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9d10: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
9d20: 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
9d30: 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
9d40: 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
9d50: 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74  ic const u16 out
9d60: 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20  OfMem[] = {.    
9d70: 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
9d80: 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20   ', 'o', 'f', ' 
9d90: 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27  ', 'm', 'e', 'm'
9da0: 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'o', 'r', 'y',
9db0: 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63   0.  };.  static
9dc0: 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73   const u16 misus
9dd0: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c  e[] = {.    'l',
9de0: 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20   'i', 'b', 'r', 
9df0: 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27  'a', 'r', 'y', '
9e00: 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f   ', .    'r', 'o
9e10: 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27  ', 'u', 't', 'i'
9e20: 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c  , 'n', 'e', ' ',
9e30: 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20   .    'c', 'a', 
9e40: 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27  'l', 'l', 'e', '
9e50: 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  d', ' ', .    'o
9e60: 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
9e70: 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c  , .    'o', 'f',
9e80: 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20   ' ', .    's', 
9e90: 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27  'e', 'q', 'u', '
9ea0: 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65  e', 'n', 'c', 'e
9eb0: 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e  ', 0.  };..  con
9ec0: 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66  st void *z;.  if
9ed0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
9ee0: 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  urn (void *)outO
9ef0: 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fMem;.  }.  if( 
9f00: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
9f10: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
9f20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
9f30: 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20  oid *)misuse;.  
9f40: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
9f50: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
9f60: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
9f70: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
9f80: 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75    z = (void *)ou
9f90: 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b  tOfMem;.  }else{
9fa0: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
9fb0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
9fc0: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28  ->pErr);.    if(
9fd0: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   z==0 ){.      s
9fe0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
9ff0: 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
a000: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
a010: 2d 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20  ->errCode),.    
a020: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54         SQLITE_UT
a030: 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
a040: 43 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  C);.      z = sq
a050: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
a060: 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
a070: 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c    }.    /* A mal
a080: 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66  loc() may have f
a090: 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65  ailed within the
a0a0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a0b0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a  _value_text16().
a0c0: 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66      ** above. If
a0d0: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
a0e0: 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e  e, then the db->
a0f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
a100: 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  g needs to.    *
a110: 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  * be cleared bef
a120: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44  ore returning. D
a130: 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c  o this directly,
a140: 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a   instead of via.
a150: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70      ** sqlite3Ap
a160: 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69  iExit(), to avoi
a170: 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61  d setting the da
a180: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72  tabase handle er
a190: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20  ror message..   
a1a0: 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
a1b0: 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
a1c0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
a1d0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
a1e0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
a1f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a200: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
a210: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a220: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
a230: 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61  rror code genera
a240: 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65  ted by an SQLite
a250: 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c   routine. If NUL
a260: 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74  L is.** passed t
a270: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
a280: 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c   we assume a mal
a290: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72  loc() failed dur
a2a0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ing sqlite3_open
a2b0: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
a2c0: 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  e3_errcode(sqlit
a2d0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
a2e0: 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
a2f0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
a300: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
a310: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
a320: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
a330: 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
a340: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a350: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a360: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
a370: 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20  n db->errCode & 
a380: 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69  db->errMask;.}.i
a390: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
a3a0: 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69  ded_errcode(sqli
a3b0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
a3c0: 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61  db && !sqlite3Sa
a3d0: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
a3e0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
a3f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
a400: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  E_BKPT;.  }.  if
a410: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
a420: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
a430: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a440: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
a450: 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a  rn db->errCode;.
a460: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
a470: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
a480: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
a490: 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
a4a0: 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
a4b0: 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
a4c0: 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
a4d0: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
a4e0: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
a4f0: 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74  te3* db,.  const
a500: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
a510: 20 75 38 20 65 6e 63 2c 0a 20 20 75 38 20 63 6f   u8 enc,.  u8 co
a520: 6c 6c 54 79 70 65 2c 0a 20 20 76 6f 69 64 2a 20  llType,.  void* 
a530: 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
a540: 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
a550: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
a560: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
a570: 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
a580: 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
a590: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
a5a0: 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  nc2;.  int nName
a5b0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a5c0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20  30(zName);.  .  
a5d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a5e0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
a5f0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
a600: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
a610: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
a620: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
a630: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
a640: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
a650: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
a660: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
a670: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
a680: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
a690: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
a6a0: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
a6b0: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
a6c0: 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63   */.  enc2 = enc
a6d0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
a6e0: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
a6f0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
a700: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
a710: 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20  16_ALIGNED );.  
a720: 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  if( enc2==SQLITE
a730: 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d  _UTF16 || enc2==
a740: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
a750: 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32  GNED ){.    enc2
a760: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
a770: 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28  ATIVE;.  }.  if(
a780: 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46   enc2<SQLITE_UTF
a790: 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45  8 || enc2>SQLITE
a7a0: 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20  _UTF16BE ){.    
a7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
a7c0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
a7d0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
a7e0: 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76  is call is remov
a7f0: 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67  ing or replacing
a800: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c   an existing col
a810: 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71  lation .  ** seq
a820: 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e  uence. If so, an
a830: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
a840: 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62  ve VMs, return b
a850: 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20  usy. If there.  
a860: 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
a870: 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65   VMs, invalidate
a880: 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65   any pre-compile
a890: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
a8a0: 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  */.  pColl = sql
a8b0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
a8c0: 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
a8d0: 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ame, 0);.  if( p
a8e0: 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
a8f0: 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Cmp ){.    if( d
a900: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
a910: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a920: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
a930: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
a940: 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
a950: 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74  te/modify collat
a960: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65  ion sequence due
a970: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
a980: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72  ments");.      r
a990: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
a9a0: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  Y;.    }.    sql
a9b0: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
a9c0: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
a9d0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c  ;..    /* If col
a9e0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
a9f0: 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65  pColl was create
aa00: 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20  d directly by a 
aa10: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
aa20: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
aa30: 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74  llation, and not
aa40: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79   generated by sy
aa50: 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20  nthCollSeq(),.  
aa60: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f    ** then any co
aa70: 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e  pies made by syn
aa80: 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64  thCollSeq() need
aa90: 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74   to be invalidat
aaa0: 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  ed..    ** Also,
aab0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72   collation destr
aac0: 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e  uctor - CollSeq.
aad0: 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f  xDel() - functio
aae0: 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  n may need.    *
aaf0: 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a  * to be called..
ab00: 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20      */ .    if( 
ab10: 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53  (pColl->enc & ~S
ab20: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
ab30: 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20  NED)==enc2 ){.  
ab40: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f      CollSeq *aCo
ab50: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ll = sqlite3Hash
ab60: 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Find(&db->aCollS
ab70: 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  eq, zName, nName
ab80: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
ab90: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
aba0: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
abb0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
abc0: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
abd0: 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
abe0: 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
abf0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
ac00: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
ac10: 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
ac20: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
ac30: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
ac40: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
ac50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ac60: 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
ac70: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
ac80: 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
ac90: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
aca0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f  pColl ){.    pCo
acb0: 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70  ll->xCmp = xComp
acc0: 61 72 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e  are;.    pColl->
acd0: 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20  pUser = pCtx;.  
ace0: 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20    pColl->xDel = 
acf0: 78 44 65 6c 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d  xDel;.    pColl-
ad00: 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
ad10: 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
ad20: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
ad30: 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70  ;.    pColl->typ
ad40: 65 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 20 20  e = collType;.  
ad50: 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
ad60: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
ad70: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
ad80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
ad90: 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66  * This array def
ada0: 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20  ines hard upper 
adb0: 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20  bounds on limit 
adc0: 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20  values.  The.** 
add0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74  initializer must
ade0: 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63   be kept in sync
adf0: 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
ae00: 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66  _LIMIT_*.** #def
ae10: 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e  ines in sqlite3.
ae20: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  h..*/.static con
ae30: 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69  st int aHardLimi
ae40: 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45  t[] = {.  SQLITE
ae50: 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _MAX_LENGTH,.  S
ae60: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
ae70: 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
ae80: 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c  AX_COLUMN,.  SQL
ae90: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
aea0: 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
aeb0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
aec0: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
aed0: 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45  DBE_OP,.  SQLITE
aee0: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
aef0: 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  G,.  SQLITE_MAX_
af00: 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49  ATTACHED,.  SQLI
af10: 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
af20: 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  ERN_LENGTH,.  SQ
af30: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
af40: 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49  E_NUMBER,.  SQLI
af50: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
af60: 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  EPTH,.};../*.** 
af70: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61  Make sure the ha
af80: 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65  rd limits are se
af90: 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20  t to reasonable 
afa0: 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51  values.*/.#if SQ
afb0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c  LITE_MAX_LENGTH<
afc0: 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
afd0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75  TE_MAX_LENGTH mu
afe0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
aff0: 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
b000: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
b010: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
b020: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
b030: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
b040: 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
b050: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
b060: 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49  _SQL_LENGTH>SQLI
b070: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20  TE_MAX_LENGTH.# 
b080: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
b090: 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
b0a0: 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20   not be greater 
b0b0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
b0c0: 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69  LENGTH.#endif.#i
b0d0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  f SQLITE_MAX_COM
b0e0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23  POUND_SELECT<2.#
b0f0: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
b100: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
b110: 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  T must be at lea
b120: 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 2.#endif.#if 
b130: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
b140: 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51  OP<40.# error SQ
b150: 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
b160: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
b170: 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  t 40.#endif.#if 
b180: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
b190: 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c  ION_ARG<0 || SQL
b1a0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
b1b0: 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f  _ARG>1000.# erro
b1c0: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
b1d0: 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
b1e0: 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
b1f0: 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  1000.#endif.#if 
b200: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
b210: 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  HED<0 || SQLITE_
b220: 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a  MAX_ATTACHED>30.
b230: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
b240: 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
b250: 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
b260: 64 20 33 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  d 30.#endif.#if 
b270: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
b280: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
b290: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
b2a0: 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
b2b0: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
b2c0: 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
b2d0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
b2e0: 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20  _COLUMN>32767.# 
b2f0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
b300: 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74  _COLUMN must not
b310: 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65   exceed 32767.#e
b320: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
b330: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
b340: 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
b350: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
b360: 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  EPTH must be at 
b370: 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a  least 1.#endif..
b380: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
b390: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
b3a0: 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
b3b0: 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
b3c0: 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
b3d0: 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
b3e0: 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
b3f0: 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
b400: 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
b410: 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
b420: 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
b430: 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
b440: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
b450: 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
b460: 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
b470: 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
b480: 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
b490: 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
b4a0: 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
b4b0: 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
b4c0: 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
b4d0: 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
b4e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
b4f0: 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
b500: 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
b510: 6f 6c 64 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20  oldLimit;.  if( 
b520: 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d  limitId<0 || lim
b530: 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c  itId>=SQLITE_N_L
b540: 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75  IMIT ){.    retu
b550: 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64  rn -1;.  }.  old
b560: 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  Limit = db->aLim
b570: 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69  it[limitId];.  i
b580: 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29  f( newLimit>=0 )
b590: 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  {.    if( newLim
b5a0: 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
b5b0: 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
b5c0: 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
b5d0: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
b5e0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c      }.    db->aL
b5f0: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20  imit[limitId] = 
b600: 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  newLimit;.  }.  
b610: 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b  return oldLimit;
b620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b630: 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
b640: 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
b650: 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
b660: 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
b670: 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
b680: 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
b690: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
b6a0: 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
b6b0: 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
b6c0: 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
b6d0: 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
b6e0: 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
b6f0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
b700: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
b710: 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
b720: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
b730: 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
b740: 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
b750: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
b760: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67  .  unsigned flag
b770: 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  s,        /* Ope
b780: 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
b790: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
b7a0: 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
b7b0: 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
b7c0: 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
b7d0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
b7e0: 72 63 3b 0a 20 20 69 6e 74 20 69 73 54 68 72 65  rc;.  int isThre
b7f0: 61 64 73 61 66 65 3b 0a 0a 20 20 2a 70 70 44 62  adsafe;..  *ppDb
b800: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
b810: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
b820: 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
b830: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
b840: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b850: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
b860: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
b870: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
b880: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54  ex==0 ){.    isT
b890: 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
b8a0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
b8b0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e   & SQLITE_OPEN_N
b8c0: 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73  OMUTEX ){.    is
b8d0: 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
b8e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
b8f0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
b900: 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20  FULLMUTEX ){.   
b910: 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
b920: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b930: 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73  isThreadsafe = s
b940: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
b950: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20  ig.bFullMutex;. 
b960: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26   }.  if( flags &
b970: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
b980: 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20  VATECACHE ){.   
b990: 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
b9a0: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
b9b0: 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  HE;.  }else if( 
b9c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
b9d0: 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45  fig.sharedCacheE
b9e0: 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c  nabled ){.    fl
b9f0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
ba00: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
ba10: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
ba20: 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72   harmful bits fr
ba30: 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  om the flags par
ba40: 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  ameter.  **.  **
ba50: 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   The SQLITE_OPEN
ba60: 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c  _NOMUTEX and SQL
ba70: 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
ba80: 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20  EX flags were.  
ba90: 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e  ** dealt with in
baa0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
bab0: 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64  de block.  Besid
bac0: 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e  es these, the on
bad0: 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e  ly.  ** valid in
bae0: 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71  put flags for sq
baf0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20  lite3_open_v2() 
bb00: 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  are SQLITE_OPEN_
bb10: 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53  READONLY,.  ** S
bb20: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
bb30: 52 49 54 45 2c 20 61 6e 64 20 53 51 4c 49 54 45  RITE, and SQLITE
bb40: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2e 20 20 53  _OPEN_CREATE.  S
bb50: 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
bb60: 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
bb70: 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
bb80: 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
bb90: 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
bba0: 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
bbb0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
bbc0: 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
bbe0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
bbf0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
bc00: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
bc10: 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
bc20: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
bc30: 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
bc40: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
bc50: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
bc60: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
bc80: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
bc90: 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
bca0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
bcb0: 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
bcc0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
bcd0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
bce0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
bd00: 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
bd10: 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
bd20: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
bd30: 55 4c 4c 4d 55 54 45 58 0a 20 20 20 20 20 20 20  ULLMUTEX.       
bd40: 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41        );..  /* A
bd50: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
bd60: 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
bd70: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
bd80: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
bd90: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29  izeof(sqlite3) )
bda0: 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
bdb0: 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
bdc0: 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73  .  if( isThreads
bdd0: 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  afe ){.    db->m
bde0: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
bdf0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
be00: 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
be10: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75  ;.    if( db->mu
be20: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
be30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
be40: 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a  ;.      db = 0;.
be50: 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
be60: 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
be70: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
be80: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
be90: 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
bea0: 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e   = 0xff;.  db->n
beb0: 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61  Db = 2;.  db->ma
bec0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
bed0: 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61  IC_BUSY;.  db->a
bee0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
bef0: 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ic;..  assert( s
bf00: 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
bf10: 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c  )==sizeof(aHardL
bf20: 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70  imit) );.  memcp
bf30: 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48  y(db->aLimit, aH
bf40: 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66  ardLimit, sizeof
bf50: 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20  (db->aLimit));. 
bf60: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
bf70: 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41  = 1;.  db->nextA
bf80: 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64  utovac = -1;.  d
bf90: 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20  b->nextPagesize 
bfa0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  = 0;.  db->flags
bfb0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
bfc0: 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54  ColNames | SQLIT
bfd0: 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 69 66 20  E_AutoIndex.#if 
bfe0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
bff0: 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
c010: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
c020: 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
c030: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c040: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
c070: 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23  tension.#endif.#
c080: 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
c090: 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47  T_RECURSIVE_TRIG
c0a0: 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20  GERS.           
c0b0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
c0c0: 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69  ecTriggers.#endi
c0d0: 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
c0e0: 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
c0f0: 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
c100: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c110: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
c120: 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
c130: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
c140: 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73  ndif..  db->pVfs
c150: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
c160: 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28  ind(zVfs);.  if(
c170: 20 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20   !db->pVfs ){.  
c180: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
c190: 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
c1a0: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e  Error(db, rc, "n
c1b0: 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c  o such vfs: %s",
c1c0: 20 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f   zVfs);.    goto
c1d0: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
c1e0: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64  ..  /* Add the d
c1f0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
c200: 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
c210: 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66  . BINARY works f
c220: 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20  or both UTF-8.  
c230: 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73  ** and UTF-16, s
c240: 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20  o add a version 
c250: 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69  for each to avoi
c260: 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72  d any unnecessar
c270: 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f  y.  ** conversio
c280: 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72  ns. The only err
c290: 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75  or that can occu
c2a0: 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c  r here is a mall
c2b0: 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20  oc() failure..  
c2c0: 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  */.  createColla
c2d0: 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
c2e0: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
c2f0: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41  SQLITE_COLL_BINA
c300: 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  RY, 0,.         
c310: 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c           binColl
c320: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
c330: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
c340: 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
c350: 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54 45  _UTF16BE, SQLITE
c360: 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30 2c  _COLL_BINARY, 0,
c370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c380: 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20     binCollFunc, 
c390: 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
c3a0: 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
c3b0: 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  Y", SQLITE_UTF16
c3c0: 4c 45 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  LE, SQLITE_COLL_
c3d0: 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20  BINARY, 0,.     
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e               bin
c3f0: 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
c400: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
c410: 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
c420: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
c430: 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 28 76 6f 69  _COLL_USER, (voi
c440: 64 2a 29 31 2c 0a 20 20 20 20 20 20 20 20 20 20  d*)1,.          
c450: 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46          binCollF
c460: 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  unc, 0);.  if( d
c470: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c480: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
c490: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62  db_out;.  }.  db
c4a0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71  ->pDfltColl = sq
c4b0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
c4c0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
c4d0: 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a  , "BINARY", 0);.
c4e0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44    assert( db->pD
c4f0: 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20  fltColl!=0 );.. 
c500: 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55   /* Also add a U
c510: 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73  TF-8 case-insens
c520: 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  itive collation 
c530: 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63  sequence. */.  c
c540: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
c550: 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c  b, "NOCASE", SQL
c560: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
c570: 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30 2c  _COLL_NOCASE, 0,
c580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c590: 20 20 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69     nocaseCollati
c5a0: 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f  ngFunc, 0);..  /
c5b0: 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65  * Open the backe
c5c0: 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76  nd database driv
c5d0: 65 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  er */.  db->open
c5e0: 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
c5f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
c600: 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46  eeFactory(db, zF
c610: 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49  ilename, 0, SQLI
c620: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
c630: 5f 53 49 5a 45 2c 20 0a 20 20 20 20 20 20 20 20  _SIZE, .        
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54     flags | SQLIT
c660: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a  E_OPEN_MAIN_DB,.
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c680: 20 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e             &db->
c690: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69  aDb[0].pBt);.  i
c6a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c6b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
c6c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
c6d0: 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EM ){.      rc =
c6e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c6f0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c700: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
c710: 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
c720: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
c730: 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
c740: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
c750: 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
c760: 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
c770: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
c780: 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
c790: 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54  db, 0);...  /* T
c7a0: 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74  he default safet
c7b0: 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  y_level for the 
c7c0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
c7d0: 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65   'full'; for the
c7e0: 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
c7f0: 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27  ase it is 'NONE'
c800: 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
c810: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
c820: 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
c830: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
c840: 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
c850: 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
c860: 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62  _level = 3;.  db
c870: 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[1].zName =
c880: 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61   "temp";.  db->a
c890: 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[1].safety_lev
c8a0: 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d  el = 1;..  db->m
c8b0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
c8c0: 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20  GIC_OPEN;.  if( 
c8d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c8e0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
c8f0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
c900: 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
c910: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
c920: 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61  ns, but do not a
c930: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
c940: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
c950: 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69   schema yet. Thi
c960: 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
c970: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  il the first tim
c980: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
c990: 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e   ** is accessed.
c9a0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
c9b0: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
c9c0: 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
c9d0: 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
c9e0: 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a  Functions(db);..
c9f0: 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
ca00: 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
ca10: 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
ca20: 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
ca30: 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
ca40: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
ca50: 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
ca60: 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 73  () API..  */.  s
ca70: 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78  qlite3AutoLoadEx
ca80: 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20  tensions(db);.  
ca90: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
caa0: 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20  code(db);.  if( 
cab0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cac0: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
cad0: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  _out;.  }..#ifde
cae0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
caf0: 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS1.  if( !db->
cb00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
cb10: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
cb20: 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73  qlite3Fts1Init(s
cb30: 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
cb40: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e   = sqlite3Fts1In
cb50: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
cb60: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
cb70: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20  E_ENABLE_FTS2.  
cb80: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
cb90: 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
cba0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
cbb0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
cbc0: 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts2Init(sqlite3
cbd0: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
cbe0: 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29  ite3Fts2Init(db)
cbf0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
cc00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cc10: 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64  LE_FTS3.  if( !d
cc20: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cc30: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
cc40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
cc50: 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
cc60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
cc70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cc80: 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
cc90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
cca0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
ccb0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
ccc0: 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
ccd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
cce0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ccf0: 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
cd00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
cd10: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
cd20: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
cd30: 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
cd40: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
cd50: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
cd60: 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44  rc, 0);..  /* -D
cd70: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
cd80: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61  OCKING_MODE=1 ma
cd90: 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68  kes EXCLUSIVE th
cda0: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
cdb0: 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44  g.  ** mode.  -D
cdc0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
cdd0: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61  OCKING_MODE=0 ma
cde0: 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  ke NORMAL the de
cdf0: 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
ce00: 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20  ** mode.  Doing 
ce10: 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61  nothing at all a
ce20: 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c  lso makes NORMAL
ce30: 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20   the default..  
ce40: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef 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 0a 20 20 64 62 2d 3e 64 66 6c 74  _MODE.  db->dflt
ce70: 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54  LockMode = SQLIT
ce80: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
ce90: 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65  G_MODE;.  sqlite
cea0: 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
ceb0: 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e(sqlite3BtreePa
cec0: 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ger(db->aDb[0].p
ced0: 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Bt),.           
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
cef0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
cf00: 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e  CKING_MODE);.#en
cf10: 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65  dif..  /* Enable
cf20: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d   the lookaside-m
cf30: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
cf40: 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73  */.  setupLookas
cf50: 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74  ide(db, 0, sqlit
cf60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
cf70: 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20  zLookaside,.    
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
cfa0: 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  lConfig.nLookasi
cfb0: 64 65 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  de);..opendb_out
cfc0: 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  :.  if( db ){.  
cfd0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75    assert( db->mu
cfe0: 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65  tex!=0 || isThre
cff0: 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c  adsafe==0 || sql
d000: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
d010: 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
d020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
d030: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
d040: 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tex);.  }.  rc =
d050: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
d060: 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  (db);.  if( rc==
d070: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
d080: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
d090: 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
d0a0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
d0b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d0c0: 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
d0d0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
d0e0: 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d  K;.  }.  *ppDb =
d0f0: 20 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   db;.  return sq
d100: 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
d110: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  rc);.}../*.** Op
d120: 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
d130: 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
d140: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20   sqlite3_open(. 
d150: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d160: 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
d170: 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20  e3 **ppDb .){.  
d180: 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
d190: 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ase(zFilename, p
d1a0: 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
d1b0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
d1c0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
d1d0: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
d1e0: 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74  REATE, 0);.}.int
d1f0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
d200: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
d210: 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44  filename,   /* D
d220: 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
d230: 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
d240: 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
d250: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51        /* OUT: SQ
d260: 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a  Lite db handle *
d270: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
d280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d290: 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
d2a0: 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
d2b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
d2c0: 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a   module to use *
d2d0: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  /.){.  return op
d2e0: 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e  enDatabase(filen
d2f0: 61 6d 65 2c 20 70 70 44 62 2c 20 66 6c 61 67 73  ame, ppDb, flags
d300: 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
d310: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d320: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
d330: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
d340: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
d350: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
d360: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
d370: 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
d380: 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
d390: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
d3a0: 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
d3b0: 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
d3c0: 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
d3d0: 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
d3e0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
d3f0: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
d400: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
d410: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
d420: 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d  pDb );.  *ppDb =
d430: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
d440: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
d450: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
d460: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
d470: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
d480: 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61  rc;.#endif.  pVa
d490: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
d4a0: 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
d4b0: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
d4c0: 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  l, -1, zFilename
d4d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
d4e0: 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41  TIVE, SQLITE_STA
d4f0: 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  TIC);.  zFilenam
d500: 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  e8 = sqlite3Valu
d510: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
d520: 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20  TE_UTF8);.  if( 
d530: 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20  zFilename8 ){.  
d540: 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62    rc = openDatab
d550: 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20  ase(zFilename8, 
d560: 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
d570: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
d580: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
d590: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
d5a0: 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20  CREATE, 0);.    
d5b0: 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c  assert( *ppDb ||
d5c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
d5d0: 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  M );.    if( rc=
d5e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44  =SQLITE_OK && !D
d5f0: 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70  bHasProperty(*pp
d600: 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  Db, 0, DB_Schema
d610: 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20  Loaded) ){.     
d620: 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51   ENC(*ppDb) = SQ
d630: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
d640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
d650: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d660: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71  _NOMEM;.  }.  sq
d670: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
d680: 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
d690: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
d6a0: 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  , rc);.}.#endif 
d6b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
d6c0: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
d6d0: 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
d6e0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
d6f0: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
d700: 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
d710: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
d720: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
d730: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
d740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
d750: 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
d760: 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
d770: 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
d780: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
d790: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
d7a0: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
d7b0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
d7c0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d7d0: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
d7e0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
d7f0: 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
d800: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
d810: 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20  zName, (u8)enc, 
d820: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52  SQLITE_COLL_USER
d830: 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
d840: 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
d850: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
d860: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
d870: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d880: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d890: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  rc;.}../*.** Reg
d8a0: 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
d8b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
d8c0: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
d8d0: 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
d8e0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
d8f0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a  e_collation_v2(.
d900: 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
d910: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
d920: 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
d930: 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
d940: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
d950: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
d960: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
d970: 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
d980: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
d990: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
d9a0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d9b0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
d9c0: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
d9d0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
d9e0: 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
d9f0: 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
da00: 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43 4f  8)enc, SQLITE_CO
da10: 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c 20 78  LL_USER, pCtx, x
da20: 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
da30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
da40: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
da50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
da60: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
da70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
da80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
da90: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
daa0: 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
dab0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
dac0: 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
dad0: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
dae0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
daf0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
db00: 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
db10: 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
db20: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
db30: 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
db40: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
db50: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
db60: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
db70: 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
db80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
db90: 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
dba0: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
dbb0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
dbc0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
dbd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
dbe0: 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
dbf0: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
dc00: 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
dc10: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
dc20: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
dc30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
dc40: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
dc50: 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c  zName8, (u8)enc,
dc60: 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45   SQLITE_COLL_USE
dc70: 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  R, pCtx, xCompar
dc80: 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
dc90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
dca0: 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  me8);.  }.  rc =
dcb0: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
dcc0: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
dcd0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
dce0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
dcf0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
dd00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
dd10: 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
dd20: 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
dd30: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
dd40: 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
dd50: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
dd60: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
dd70: 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
dd80: 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
dd90: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
dda0: 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
ddb0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
ddc0: 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73  tion_needed(.  s
ddd0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
dde0: 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
ddf0: 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
de00: 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a  ollNeeded)(void*
de10: 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
de20: 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61  extRep,const cha
de30: 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  r*).){.  sqlite3
de40: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
de50: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
de60: 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f  CollNeeded = xCo
de70: 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e  llNeeded;.  db->
de80: 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
de90: 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  0;.  db->pCollNe
dea0: 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
deb0: 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
dec0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ded0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
dee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
def0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
df00: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
df10: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
df20: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
df30: 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
df40: 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
df50: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
df60: 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
df70: 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
df80: 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
df90: 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
dfa0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
dfb0: 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
dfc0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
dfd0: 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
dfe0: 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
dff0: 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  d(*xCollNeeded16
e000: 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
e010: 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
e020: 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
e030: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e040: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e050: 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
e060: 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f  d = 0;.  db->xCo
e070: 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f  llNeeded16 = xCo
e080: 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62  llNeeded16;.  db
e090: 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
e0a0: 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
e0b0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
e0c0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
e0d0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
e0e0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
e0f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e100: 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
e110: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
e120: 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 23 69 66  LOBALRECOVER.#if
e130: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e140: 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
e150: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e160: 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72  is now an anachr
e170: 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74  onism. It used t
e180: 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63  o be used to rec
e190: 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d  over from a.** m
e1a0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
e1b0: 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20   but SQLite now 
e1c0: 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61  does this automa
e1d0: 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  tically..*/.int 
e1e0: 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
e1f0: 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20  ecover(void){.  
e200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e210: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ;.}.#endif.#endi
e220: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
e230: 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
e240: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
e250: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
e260: 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
e270: 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
e280: 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
e290: 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
e2a0: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
e2b0: 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
e2c0: 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
e2d0: 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
e2e0: 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
e2f0: 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
e300: 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
e310: 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
e320: 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49  ..**.******* THI
e330: 53 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45  S IS AN EXPERIME
e340: 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20  NTAL API AND IS 
e350: 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47  SUBJECT TO CHANG
e360: 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20  E ******.*/.int 
e370: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
e380: 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
e390: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
e3a0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
e3b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
e3c0: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
e3d0: 65 20 73 75 62 74 69 74 75 74 65 73 20 66 6f 72  e subtitutes for
e3e0: 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54   constants SQLIT
e3f0: 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51  E_CORRUPT,.** SQ
e400: 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c  LITE_MISUSE, SQL
e410: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51  ITE_CANTOPEN, SQ
e420: 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70  LITE_IOERR and p
e430: 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72  ossibly other er
e440: 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  ror.** constants
e450: 2e 20 20 54 68 65 79 20 73 65 72 76 65 72 20 74  .  They server t
e460: 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
e470: 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
e480: 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
e490: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
e4a0: 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
e4b0: 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
e4c0: 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
e4d0: 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
e4e0: 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
e4f0: 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
e500: 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
e510: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
e520: 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
e530: 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
e540: 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
e550: 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
e560: 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
e570: 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
e580: 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
e590: 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
e5a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
e5b0: 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
e5c0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
e5d0: 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20  _CORRUPT,.      
e5e0: 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73          "databas
e5f0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 75  e corruption fou
e600: 6e 64 20 62 79 20 73 6f 75 72 63 65 20 6c 69 6e  nd by source lin
e610: 65 20 25 64 22 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  e %d", lineno);.
e620: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e630: 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73  CORRUPT;.}.int s
e640: 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f  qlite3MisuseErro
e650: 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
e660: 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
e670: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
e680: 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
e690: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d  te3_log(SQLITE_M
e6a0: 49 53 55 53 45 2c 20 22 6d 69 73 75 73 65 20 64  ISUSE, "misuse d
e6b0: 65 74 65 63 74 65 64 20 62 79 20 73 6f 75 72 63  etected by sourc
e6c0: 65 20 6c 69 6e 65 20 25 64 22 2c 20 6c 69 6e 65  e line %d", line
e6d0: 6e 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  no);.  return SQ
e6e0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69  LITE_MISUSE;.}.i
e6f0: 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70  nt sqlite3Cantop
e700: 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  enError(int line
e710: 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
e720: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
e730: 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
e740: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
e750: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 22  LITE_CANTOPEN, "
e760: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
e770: 20 61 74 20 73 6f 75 72 63 65 20 6c 69 6e 65 20   at source line 
e780: 25 64 22 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  %d", lineno);.  
e790: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
e7a0: 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e  NTOPEN;.}...#ifn
e7b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e7c0: 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
e7d0: 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65   This is a conve
e7e0: 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74  nience routine t
e7f0: 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74  hat makes sure t
e800: 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73  hat all thread-s
e810: 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20  pecific.** data 
e820: 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20  for this thread 
e830: 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63  has been dealloc
e840: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ated..**.** SQLi
e850: 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
e860: 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  s thread-specifi
e870: 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72  c data so this r
e880: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a  outine is now a.
e890: 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73  ** no-op.  It is
e8a0: 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69   retained for hi
e8b0: 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69  storical compati
e8c0: 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  bility..*/.void 
e8d0: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
e8e0: 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a  leanup(void){.}.
e8f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
e900: 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d  turn meta inform
e910: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70  ation about a sp
e920: 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66  ecific column of
e930: 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
e940: 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
e950: 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28  t in sqlite3.h (
e960: 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72  sqlite.h.in) for
e970: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66   details..*/.#if
e980: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e990: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e9a0: 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61  A.int sqlite3_ta
e9b0: 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
e9c0: 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ata(.  sqlite3 *
e9d0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
e9e0: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
e9f0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
ea00: 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
ea10: 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ,        /* Data
ea20: 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c  base name or NUL
ea30: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
ea40: 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20  r *zTableName,  
ea50: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
ea60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ea70: 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20   *zColumnName,  
ea80: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
ea90: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
eaa0: 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20   **pzDataType,  
eab0: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63    /* OUTPUT: Dec
eac0: 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20  lared data type 
ead0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
eae0: 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20  **pzCollSeq,    
eaf0: 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c   /* OUTPUT: Coll
eb00: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
eb10: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  ame */.  int *pN
eb20: 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  otNull,         
eb30: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
eb40: 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c  True if NOT NULL
eb50: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73   constraint exis
eb60: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72  ts */.  int *pPr
eb70: 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20  imaryKey,       
eb80: 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
eb90: 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61  rue if column pa
eba0: 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e  rt of PK */.  in
ebb0: 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20  t *pAutoinc     
ebc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
ebd0: 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
ebe0: 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72  umn is auto-incr
ebf0: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ement */.){.  in
ec00: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
ec10: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62  rrMsg = 0;.  Tab
ec20: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
ec30: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
ec40: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20  ;.  int iCol;.. 
ec50: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61   char const *zDa
ec60: 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68  taType = 0;.  ch
ec70: 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53  ar const *zCollS
ec80: 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f  eq = 0;.  int no
ec90: 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  tnull = 0;.  int
eca0: 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b   primarykey = 0;
ecb0: 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d  .  int autoinc =
ecc0: 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65   0;..  /* Ensure
ecd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
ece0: 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f  hema has been lo
ecf0: 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  aded */.  sqlite
ed00: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ed10: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
ed20: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
ed30: 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (db);.  rc = sql
ed40: 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45  ite3Init(db, &zE
ed50: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51  rrMsg);.  if( SQ
ed60: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
ed70: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
ed80: 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  t;.  }..  /* Loc
ed90: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
eda0: 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70   question */.  p
edb0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
edc0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c  dTable(db, zTabl
edd0: 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b  eName, zDbName);
ede0: 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20  .  if( !pTab || 
edf0: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
ee00: 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20  .    pTab = 0;. 
ee10: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
ee20: 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  t;.  }..  /* Fin
ee30: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  d the column for
ee40: 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72   which info is r
ee50: 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66  equested */.  if
ee60: 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  ( sqlite3IsRowid
ee70: 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b  (zColumnName) ){
ee80: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
ee90: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69 66 28  ->iPKey;.    if(
eea0: 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20   iCol>=0 ){.    
eeb0: 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
eec0: 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
eed0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
eee0: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
eef0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
ef00: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  ++){.      pCol 
ef10: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
ef20: 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ol];.      if( 0
ef30: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
ef40: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
ef50: 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
ef60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ef70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ef80: 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e  f( iCol==pTab->n
ef90: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 54 61  Col ){.      pTa
efa0: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74  b = 0;.      got
efb0: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
efc0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
efd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
efe0: 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61   stores the meta
eff0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
f000: 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
f010: 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63  ed.  ** to the c
f020: 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76  aller in local v
f030: 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79  ariables zDataTy
f040: 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f  pe, zCollSeq, no
f050: 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65  tnull, primaryke
f060: 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69  y.  ** and autoi
f070: 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  nc. At this poin
f080: 74 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  t there are two 
f090: 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20  possibilities:. 
f0a0: 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e   ** .  **     1.
f0b0: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63   The specified c
f0c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72  olumn name was r
f0d0: 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20  owid", "oid" or 
f0e0: 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20  "_rowid_" .  ** 
f0f0: 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65         and there
f100: 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c   is no explicitl
f110: 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63  y declared IPK c
f120: 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a  olumn. .  **.  *
f130: 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62  *     2. The tab
f140: 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  le is not a view
f150: 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
f160: 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20  name identified 
f170: 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  an .  **        
f180: 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
f190: 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79  red column. Copy
f1a0: 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
f1b0: 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20  n from *pCol..  
f1c0: 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29  */ .  if( pCol )
f1d0: 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
f1e0: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
f1f0: 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43     zCollSeq = pC
f200: 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e  ol->zColl;.    n
f210: 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e  otnull = pCol->n
f220: 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70  otNull!=0;.    p
f230: 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 70 43 6f  rimarykey  = pCo
f240: 6c 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b  l->isPrimKey!=0;
f250: 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70  .    autoinc = p
f260: 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c  Tab->iPKey==iCol
f270: 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
f280: 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
f290: 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65  rement)!=0;.  }e
f2a0: 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  lse{.    zDataTy
f2b0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
f2c0: 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d      primarykey =
f2d0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a   1;.  }.  if( !z
f2e0: 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a  CollSeq ){.    z
f2f0: 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52  CollSeq = "BINAR
f300: 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f  Y";.  }..error_o
f310: 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ut:.  sqlite3Btr
f320: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
f330: 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68  .  /* Whether th
f340: 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
f350: 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69  succeeded or fai
f360: 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74  led, set the out
f370: 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20  put parameters. 
f380: 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20   ** to whatever 
f390: 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e  their local coun
f3a0: 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e  terparts contain
f3b0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69  . If an error di
f3c0: 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68  d occur,.  ** th
f3d0: 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63  is has the effec
f3e0: 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c  t of zeroing all
f3f0: 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
f400: 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
f410: 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44  zDataType ) *pzD
f420: 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54  ataType = zDataT
f430: 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c  ype;.  if( pzCol
f440: 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65  lSeq ) *pzCollSe
f450: 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20  q = zCollSeq;.  
f460: 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a  if( pNotNull ) *
f470: 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75  pNotNull = notnu
f480: 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61  ll;.  if( pPrima
f490: 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72  ryKey ) *pPrimar
f4a0: 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65  yKey = primaryke
f4b0: 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e  y;.  if( pAutoin
f4c0: 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20  c ) *pAutoinc = 
f4d0: 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20  autoinc;..  if( 
f4e0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26  SQLITE_OK==rc &&
f4f0: 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71   !pTab ){.    sq
f500: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f510: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45  zErrMsg);.    zE
f520: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  rrMsg = sqlite3M
f530: 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73  Printf(db, "no s
f540: 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  uch table column
f550: 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65  : %s.%s", zTable
f560: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43  Name,.        zC
f570: 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  olumnName);.    
f580: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
f590: 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
f5a0: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a  Error(db, rc, (z
f5b0: 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20  ErrMsg?"%s":0), 
f5c0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
f5d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
f5e0: 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73  rrMsg);.  rc = s
f5f0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
f600: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
f610: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f620: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f630: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
f640: 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
f650: 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
f660: 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
f670: 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
f680: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f690: 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  _sleep(int ms){.
f6a0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
f6b0: 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Vfs;.  int rc;. 
f6c0: 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f   pVfs = sqlite3_
f6d0: 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
f6e0: 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74  f( pVfs==0 ) ret
f6f0: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  urn 0;..  /* Thi
f700: 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
f710: 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   in milliseconds
f720: 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c  , but the underl
f730: 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a  ying OsSleep() .
f740: 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69    ** API uses mi
f750: 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63  croseconds. Henc
f760: 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20  e the 1000's..  
f770: 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74  */.  rc = (sqlit
f780: 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20  e3OsSleep(pVfs, 
f790: 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a  1000*ms)/1000);.
f7a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f7b0: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
f7c0: 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65  disable the exte
f7d0: 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65  nded result code
f7e0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
f7f0: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
f800: 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20  t_codes(sqlite3 
f810: 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b  *db, int onoff){
f820: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f830: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f840: 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
f850: 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66   = onoff ? 0xfff
f860: 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20  fffff : 0xff;.  
f870: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f880: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f8a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  OK;.}../*.** Inv
f8b0: 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e  oke the xFileCon
f8c0: 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61  trol method on a
f8d0: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
f8e0: 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
f8f0: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
f900: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  l(sqlite3 *db, c
f910: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
f920: 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  me, int op, void
f930: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
f940: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
f950: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73  ;.  int iDb;.  s
f960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f970: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f980: 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20   if( zDbName==0 
f990: 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 30 3b 0a  ){.    iDb = 0;.
f9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
f9b0: 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e  (iDb=0; iDb<db->
f9c0: 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20  nDb; iDb++){.   
f9d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 64 62     if( strcmp(db
f9e0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
f9f0: 2c 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20 29 20  , zDbName)==0 ) 
fa00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
fa10: 0a 20 20 69 66 28 20 69 44 62 3c 64 62 2d 3e 6e  .  if( iDb<db->n
fa20: 44 62 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20  Db ){.    Btree 
fa30: 2a 70 42 74 72 65 65 20 3d 20 64 62 2d 3e 61 44  *pBtree = db->aD
fa40: 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
fa50: 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
fa60: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
fa70: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
fa80: 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 20  _file *fd;.     
fa90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
faa0: 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
fab0: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
fac0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
fad0: 72 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ree);.      asse
fae0: 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
faf0: 0a 20 20 20 20 20 20 66 64 20 3d 20 73 71 6c 69  .      fd = sqli
fb00: 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
fb10: 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
fb20: 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20  rt( fd!=0 );.   
fb30: 20 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68     if( fd->pMeth
fb40: 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ods ){.        r
fb50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
fb60: 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
fb70: 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a   pArg);.      }.
fb80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
fb90: 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
fba0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
fbb0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fbc0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
fbd0: 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a  eturn rc;   .}..
fbe0: 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20  /*.** Interface 
fbf0: 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c  to the testing l
fc00: 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ogic..*/.int sql
fc10: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
fc20: 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  l(int op, ...){.
fc30: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
fc40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fc50: 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20  T_BUILTIN_TEST. 
fc60: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76   va_list ap;.  v
fc70: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
fc80: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
fc90: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
fca0: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
fcb0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
fcc0: 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  NG..    */.    c
fcd0: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
fce0: 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b  TRL_PRNG_SAVE: {
fcf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
fd00: 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20  ngSaveState();. 
fd10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fd20: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
fd30: 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61   Restore the sta
fd40: 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74  te of the PRNG t
fd50: 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65  o the last state
fd60: 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20   saved using.   
fd70: 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20   ** PRNG_SAVE.  
fd80: 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73  If PRNG_SAVE has
fd90: 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
fda0: 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a  en called, then.
fdb0: 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62      ** this verb
fdc0: 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f   acts like PRNG_
fdd0: 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20  RESET..    */.  
fde0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
fdf0: 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54  STCTRL_PRNG_REST
fe00: 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ORE: {.      sql
fe10: 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53  ite3PrngRestoreS
fe20: 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72  tate();.      br
fe30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
fe40: 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20  /*.    ** Reset 
fe50: 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f  the PRNG back to
fe60: 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a   its uninitializ
fe70: 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e  ed state.  The n
fe80: 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ext call.    ** 
fe90: 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  to sqlite3_rando
fea0: 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73  mness() will res
feb0: 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69  eed the PRNG usi
fec0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c  ng a single call
fed0: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78  .    ** to the x
fee0: 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f  Randomness metho
fef0: 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74  d of the default
ff00: 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   VFS..    */.   
ff10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
ff20: 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
ff30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
ff40: 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65 28  3PrngResetState(
ff50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ff60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
ff70: 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
ff80: 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45  st_control(BITVE
ff90: 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72  C_TEST, size, pr
ffa0: 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20  ogram).    **.  
ffb0: 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20    ** Run a test 
ffc0: 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63  against a Bitvec
ffd0: 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e   object of size.
ffe0: 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72    The program ar
fff0: 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73  gument.    ** is
10000 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74   an array of int
10010 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e  egers that defin
10020 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65  es the test.  Re
10030 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20  turn -1 on a.   
10040 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   ** memory alloc
10050 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f  ation error, 0 o
10060 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f  n success, or no
10070 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72  n-zero for an er
10080 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20  ror..    ** See 
10090 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65  the sqlite3Bitve
100a0 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66  cBuiltinTest() f
100b0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
100c0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
100d0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
100e0 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
100f0 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20  C_TEST: {.      
10100 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
10110 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
10120 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f  int *aProg = va_
10130 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
10140 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10150 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
10160 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20  st(sz, aProg);. 
10170 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10180 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
10190 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
101a0 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41  ontrol(BENIGN_MA
101b0 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67  LLOC_HOOKS, xBeg
101c0 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a  in, xEnd).    **
101d0 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72  .    ** Register
101e0 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74   hooks to call t
101f0 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  o indicate which
10200 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
10210 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62  es .    ** are b
10220 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  enign..    */.  
10230 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
10240 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
10250 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20  LLOC_HOOKS: {.  
10260 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
10270 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e   (*void_function
10280 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76  )(void);.      v
10290 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
102a0 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20  nignBegin;.     
102b0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
102c0 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20  BenignEnd;.     
102d0 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20   xBenignBegin = 
102e0 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
102f0 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
10300 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61   xBenignEnd = va
10310 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
10320 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  nction);.      s
10330 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c  qlite3BenignMall
10340 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42  ocHooks(xBenignB
10350 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64  egin, xBenignEnd
10360 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10370 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
10380 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
10390 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
103a0 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
103b0 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65  NG_BYTE, unsigne
103c0 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  d int X).    **.
103d0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50      ** Set the P
103e0 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74  ENDING byte to t
103f0 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
10400 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30  argument, if X>0
10410 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f  ..    ** Make no
10420 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30   changes if X==0
10430 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  .  Return the va
10440 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69  lue of the pendi
10450 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61  ng byte.    ** a
10460 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65  s it existing be
10470 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
10480 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  e was called..  
10490 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f    **.    ** IMPO
104a0 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67  RTANT:  Changing
104b0 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
104c0 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30  e from 0x4000000
104d0 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20  0 results in.   
104e0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   ** an incompati
104f0 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ble database fil
10500 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67  e format.  Chang
10510 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
10520 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  byte.    ** whil
10530 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63  e any database c
10540 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
10550 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64  n results in und
10560 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a  efined and.    *
10570 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65  * dileterious be
10580 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  havior..    */. 
10590 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
105a0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
105b0 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e  BYTE: {.      un
105c0 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61  signed int newVa
105d0 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  l = va_arg(ap, u
105e0 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
105f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10600 50 65 6e 64 69 6e 67 42 79 74 65 3b 0a 20 20 20  PendingByte;.   
10610 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20     if( newVal ) 
10620 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79  sqlite3PendingBy
10630 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20  te = newVal;.   
10640 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10650 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
10660 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
10670 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
10680 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74  CTRL_ASSERT, int
10690 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
106a0 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
106b0 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
106c0 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68  e test to see wh
106d0 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20  ether or not.   
106e0 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73   ** assert() was
106f0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
10700 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20  ile-time.  If X 
10710 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65  is true and asse
10720 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65  rt().    ** is e
10730 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
10740 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
10750 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20   true.  If X is 
10760 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20  true and.    ** 
10770 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
10780 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
10790 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
107a0 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20  ero.  If X is.  
107b0 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61    ** false and a
107c0 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
107d0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73  ed, then the ass
107e0 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64  ertion fires and
107f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63   the.    ** proc
10800 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20  ess aborts.  If 
10810 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61  X is false and a
10820 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
10830 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  led, then the.  
10840 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
10850 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e is zero..    *
10860 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
10870 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
10880 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74  T: {.      volat
10890 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20  ile int x = 0;. 
108a0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20       assert( (x 
108b0 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
108c0 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
108d0 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61   = x;.      brea
108e0 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
108f0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
10900 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
10910 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
10920 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20  LWAYS, int X).  
10930 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
10940 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
10950 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
10960 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20   to see how the 
10970 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a  ALWAYS and.    *
10980 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77  * NEVER macros w
10990 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63  ere defined at c
109a0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20  ompile-time..   
109b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
109c0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41  eturn value is A
109d0 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20  LWAYS(X).  .    
109e0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
109f0 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69  commended test i
10a00 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20  s X==2.  If the 
10a10 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
10a20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  2, that means.  
10a30 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e    ** ALWAYS() an
10a40 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f  d NEVER() are bo
10a50 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  th no-op pass-th
10a60 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68  rough macros, wh
10a70 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ich is the.    *
10a80 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  * default settin
10a90 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  g.  If the retur
10aa0 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68  n value is 1, th
10ab0 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65  en ALWAYS() is e
10ac0 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72  ither.    ** har
10ad0 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20  d-coded to true 
10ae0 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72  or else it asser
10af0 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65  ts if its argume
10b00 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20  nt is false..   
10b10 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65   ** The first be
10b20 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64  havior (hard-cod
10b30 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74  ed to true) is t
10b40 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
10b50 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
10b60 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
10b70 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
10b80 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65  disabled and the
10b90 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62   second.    ** b
10ba0 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20  ehavior (assert 
10bb0 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
10bc0 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66  to ALWAYS() is f
10bd0 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73  alse) is the cas
10be0 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
10bf0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
10c00 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
10c10 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
10c20 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
10c30 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65   The run-time te
10c40 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67  st procedure mig
10c50 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e  ht look somethin
10c60 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  g like this:.   
10c70 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66   **.    **    if
10c80 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
10c90 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
10ca0 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32  STCTRL_ALWAYS, 2
10cb0 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20  )==2 ){.    **  
10cc0 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20      // ALWAYS() 
10cd0 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
10ce0 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
10cf0 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a  gh macros.    **
10d00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
10d10 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
10d20 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
10d30 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b  RL_ASSERT, 1) ){
10d40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
10d50 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74  ALWAYS(x) assert
10d60 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65  s that x is true
10d70 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72  . NEVER(x) asser
10d80 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20  ts x is false.. 
10d90 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a     **    }else{.
10da0 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
10db0 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f  LWAYS(x) is a co
10dc0 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52  nstant 1.  NEVER
10dd0 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
10de0 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  t 0..    **    }
10df0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
10e00 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
10e10 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20  _ALWAYS: {.     
10e20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
10e30 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72  ap,int);.      r
10e40 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20  c = ALWAYS(x);. 
10e50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10e60 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
10e70 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
10e80 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
10e90 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65  _RESERVE, sqlite
10ea0 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20  3 *db, int N).  
10eb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
10ec0 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a  the nReserve siz
10ed0 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d  e to N for the m
10ee0 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20  ain database on 
10ef0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
10f00 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   ** connection d
10f10 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
10f20 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
10f30 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20  RL_RESERVE: {.  
10f40 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
10f50 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
10f60 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e  ite3*);.      in
10f70 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
10f80 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
10f90 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10fa0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
10fb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
10fc0 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44  tPageSize(db->aD
10fd0 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20  b[0].pBt, 0, x, 
10fe0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
10ff0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
11000 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
11010 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11020 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    /*  sqlite3_te
11030 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
11040 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
11050 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65  IZATIONS, sqlite
11060 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20  3 *db, int N).  
11070 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62    **.    ** Enab
11080 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61  le or disable va
11090 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
110a0 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ons for testing 
110b0 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a  purposes.  The .
110c0 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20      ** argument 
110d0 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  N is a bitmask o
110e0 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  f optimizations 
110f0 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20  to be disabled. 
11100 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20   For normal.    
11110 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73  ** operation N s
11120 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65  hould be 0.  The
11130 20 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20   idea is that a 
11140 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69  test program (li
11150 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  ke the.    ** SQ
11160 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20  L Logic Test or 
11170 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29  SLT test module)
11180 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d   can run the sam
11190 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74  e SQL multiple t
111a0 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  imes.    ** with
111b0 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
111c0 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20  ations disabled 
111d0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
111e0 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
111f0 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65     ** is obtaine
11200 64 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e  d in every case.
11210 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
11220 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
11230 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20  _OPTIMIZATIONS: 
11240 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
11250 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
11260 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
11270 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67    int x = va_arg
11280 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
11290 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 78 20 26  db->flags = (x &
112a0 20 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29   SQLITE_OptMask)
112b0 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
112c0 7e 53 51 4c 49 54 45 5f 4f 70 74 4d 61 73 6b 29  ~SQLITE_OptMask)
112d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
112e0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
112f0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
11300 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
11310 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
11320 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
11330 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
11340 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
11350 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
11360 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
11370 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
11380 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
11390 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
113a0 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
113b0 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
113c0 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
113d0 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
113e0 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
113f0 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
11400 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
11410 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
11420 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
11430 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
11440 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
11450 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
11460 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
11470 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
11480 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
11490 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
114a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
114b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
114c0 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
114d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
114e0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
114f0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
11500 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
11510 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
11520 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
11530 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
11540 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
11550 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
11560 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
11570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11580 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 7d 0a   }.#endif ..  }.
11590 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65    va_end(ap);.#e
115a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
115b0 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
115c0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
115d0 0a 7d 0a                                         .}.