/ Hex Artifact Content
Login

Artifact 1cc6f391018f2b868d812bf2b1be7c20a5269805:


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 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8a90: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
8aa0: 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
8ab0: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
8ac0: 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71  registered by sq
8ad0: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
8ae0: 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 52  eckpoint()..** R
8af0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  eturn non-zero, 
8b00: 69 6e 64 69 63 61 74 69 6e 67 20 74 6f 20 74 68  indicating to th
8b10: 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 61 20  e caller that a 
8b20: 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
8b30: 64 20 62 65 20 72 75 6e 2c 0a 2a 2a 20 69 66 20  d be run,.** if 
8b40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
8b50: 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
8b60: 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
8b70: 74 68 61 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  than .** sqlite3
8b80: 2e 6e 41 75 74 6f 43 68 65 63 6b 70 6f 69 6e 74  .nAutoCheckpoint
8b90: 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66   (the value conf
8ba0: 69 67 75 72 65 64 20 62 79 20 77 61 6c 5f 61 75  igured by wal_au
8bb0: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e  tocheckpoint()).
8bc0: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
8bd0: 64 65 66 61 75 6c 74 57 61 6c 48 6f 6f 6b 28 76  defaultWalHook(v
8be0: 6f 69 64 20 2a 70 2c 20 73 71 6c 69 74 65 33 20  oid *p, sqlite3 
8bf0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
8c00: 2a 7a 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b  *z, int nFrame){
8c10: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8c20: 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44  TER(p);.  UNUSED
8c30: 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 0a 20  _PARAMETER(z);. 
8c40: 20 72 65 74 75 72 6e 20 28 20 6e 46 72 61 6d 65   return ( nFrame
8c50: 3e 3d 64 62 2d 3e 6e 41 75 74 6f 43 68 65 63 6b  >=db->nAutoCheck
8c60: 70 6f 69 6e 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  point );.}../*.*
8c70: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
8c80: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
8c90: 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  ) callback to au
8ca0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
8cb0: 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61  kpoint.** a data
8cc0: 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69  base after commi
8cd0: 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
8ce0: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
8cf0: 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f   nFrame or.** mo
8d00: 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  re frames in the
8d10: 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69   log file. Passi
8d20: 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67  ng zero or a neg
8d30: 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74  ative value as t
8d40: 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72  he.** nFrame par
8d50: 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20  ameter disables 
8d60: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
8d70: 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a  oints entirely..
8d80: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
8d90: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
8da0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
8db0: 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73  eplaces any exis
8dc0: 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ting callback.**
8dd0: 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   registered usin
8de0: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
8df0: 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20  ok(). Likewise, 
8e00: 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61  registering a ca
8e10: 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  llback.** using 
8e20: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
8e30: 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  () disables the 
8e40: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
8e50: 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  oint mechanism.*
8e60: 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
8e70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
8e80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
8e90: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
8ea0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
8eb0: 74 20 6e 46 72 61 6d 65 29 7b 0a 20 20 73 71 6c  t nFrame){.  sql
8ec0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8ed0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
8ee0: 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20  f( nFrame>0 ){. 
8ef0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
8f00: 6f 6f 6b 28 64 62 2c 20 64 65 66 61 75 6c 74 57  ook(db, defaultW
8f10: 61 6c 48 6f 6f 6b 2c 20 30 29 3b 0a 20 20 20 20  alHook, 0);.    
8f20: 64 62 2d 3e 6e 41 75 74 6f 43 68 65 63 6b 70 6f  db->nAutoCheckpo
8f30: 69 6e 74 20 3d 20 6e 46 72 61 6d 65 3b 0a 20 20  int = nFrame;.  
8f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8f50: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
8f60: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  0, 0);.  }.  sql
8f70: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8f80: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
8f90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8fa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
8fb0: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
8fc0: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
8fd0: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
8fe0: 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ion is written.*
8ff0: 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65  * into the write
9000: 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68  -ahead-log by th
9010: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
9020: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
9030: 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f  *sqlite3_wal_hoo
9040: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
9050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9060: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
9070: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
9080: 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
9090: 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  nt(*xCallback)(v
90a0: 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  oid *, sqlite3*,
90b0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
90c0: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
90f0: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
9100: 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
9110: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
9120: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9130: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
9140: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
9150: 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e  >pWalArg;.  db->
9160: 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78  xWalCallback = x
9170: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
9180: 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a  pWalArg = pArg;.
9190: 20 20 64 62 2d 3e 6e 41 75 74 6f 43 68 65 63 6b    db->nAutoCheck
91a0: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c  point = 0;.  sql
91b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
91c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
91d0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
91e0: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
91f0: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
9200: 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68   zDb is NULL, th
9210: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
9220: 69 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  is checkpointed.
9230: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
9240: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73  wal_checkpoint(s
9250: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
9260: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
9270: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9290: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
92a0: 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 30 3b  /.  int iDb = 0;
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61      /* sqlite3.a
92d0: 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
92e0: 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
92f0: 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  /..  sqlite3_mut
9300: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
9310: 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 29  ex);.  if( zDb )
9320: 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
9330: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
9340: 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
9350: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
9360: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
9370: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
9380: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52  or(db, SQLITE_ER
9390: 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61  ROR, "unknown da
93a0: 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62  tabase: %s", zDb
93b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
93c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63  rc = sqlite3Chec
93d0: 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 29 3b  kpoint(db, iDb);
93e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
93f0: 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20  r(db, rc, 0);.  
9400: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
9410: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9420: 78 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71  x);..  return sq
9430: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
9440: 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   rc);.}../*.** R
9450: 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  un a checkpoint 
9460: 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  on database iDb.
9470: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
9480: 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62   if database iDb
9490: 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65   is.** not curre
94a0: 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c  ntly open in WAL
94b0: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
94c0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
94d0: 20 6f 70 65 6e 20 61 74 20 65 69 74 68 65 72 20   open at either 
94e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
94f0: 64 6c 65 20 28 64 62 29 20 6f 72 20 62 2d 74 72  dle (db) or b-tr
9500: 65 65 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74 68 69  ee.** level, thi
9510: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
9520: 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ns SQLITE_LOCKED
9530: 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e   and a checkpoin
9540: 74 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 74 74 65  t is not.** atte
9550: 6d 70 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72  mpted. If an err
9560: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
9570: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63  running the chec
9580: 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74  kpoint, an SQLit
9590: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
95a0: 69 73 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65  is returned (i.e
95b0: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e  . SQLITE_IOERR).
95c0: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
95d0: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
95e0: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
95f0: 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f  se handle db sho
9600: 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74  uld be held by t
9610: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d  he caller. The m
9620: 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74  utex.** associat
9630: 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
9640: 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e  ific b-tree bein
9650: 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69  g checkpointed i
9660: 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68  s taken by.** th
9670: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  is function whil
9680: 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
9690: 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2f 0a   is running..*/.
96a0: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
96b0: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
96c0: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 42  b, int iDb){.  B
96d0: 74 72 65 65 20 2a 70 42 74 3b 20 20 20 20 20 20  tree *pBt;      
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
96f0: 2a 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 74  * Btree handle t
9700: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  o checkpoint */.
9710: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
9740: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
9750: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9760: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
9770: 0a 20 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  .  pBt = db->aDb
9780: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 69 66 28  [iDb].pBt;.  if(
9790: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
97a0: 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20  nReadTrans(pBt) 
97b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
97c0: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 65 6c  TE_LOCKED;.  }el
97d0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  se{.    sqlite3B
97e0: 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
97f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9800: 50 61 67 65 72 43 68 65 63 6b 70 6f 69 6e 74 28  PagerCheckpoint(
9810: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
9820: 72 28 70 42 74 29 29 3b 0a 20 20 20 20 73 71 6c  r(pBt));.    sql
9830: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
9840: 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Bt);.  }..  retu
9850: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 20 2f  rn rc;.}.#else /
9860: 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
9870: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 2f 2a 0a 2a  OMIT_WAL */./*.*
9880: 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * If SQLITE_OMIT
9890: 5f 57 41 4c 20 69 73 20 64 65 66 69 6e 65 64 2c  _WAL is defined,
98a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 41   the following A
98b0: 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  PI functions are
98c0: 20 6e 6f 2d 6f 70 73 3a 0a 2a 2a 0a 2a 2a 20 20   no-ops:.**.**  
98d0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
98e0: 6b 28 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  k().**   sqlite3
98f0: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
9900: 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 77  ).**   sqlite3_w
9910: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
9920: 74 28 29 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  t().*/.void *sql
9930: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20  ite3_wal_hook(. 
9940: 20 73 71 6c 69 74 65 33 20 2a 78 2c 0a 20 20 69   sqlite3 *x,.  i
9950: 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  nt(*xCallback)(v
9960: 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  oid *, sqlite3*,
9970: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
9980: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
9990: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  .){.  return 0;.
99a0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  }.int sqlite3_wa
99b0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  l_checkpoint(sql
99c0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
99d0: 63 68 61 72 20 2a 7a 44 62 29 7b 20 72 65 74 75  char *zDb){ retu
99e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a  rn SQLITE_OK; }.
99f0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
9a00: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
9a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
9a20: 6e 46 72 61 6d 65 29 7b 20 72 65 74 75 72 6e 20  nFrame){ return 
9a30: 53 51 4c 49 54 45 5f 4f 4b 3b 20 7d 0a 23 65 6e  SQLITE_OK; }.#en
9a40: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
9a50: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9a60: 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65   true if main-me
9a70: 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mory should be u
9a80: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  sed instead of.*
9a90: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
9aa0: 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  le for transient
9ab0: 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64   pager files and
9ac0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9ad0: 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  als..** The valu
9ae0: 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e  e returned depen
9af0: 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
9b00: 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  of db->temp_stor
9b10: 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61  e (runtime.** pa
9b20: 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65  rameter) and the
9b30: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
9b40: 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45  lue of SQLITE_TE
9b50: 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a  MP_STORE. The.**
9b60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
9b70: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
9b80: 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
9b90: 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61  een these two va
9ba0: 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73  lues.** and this
9bb0: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
9bc0: 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  n value..**.**  
9bd0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
9be0: 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
9bf0: 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
9c00: 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
9c10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
9c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
9c30: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
9c40: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
9c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c60: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
9c90: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
9ca0: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cc0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
9cd0: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
9ce0: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
9cf0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
9d00: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
9d10: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
9d20: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
9d30: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
9d40: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
9d60: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
9d70: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
9db0: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
9de0: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
9df0: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20  turn 1).**   2  
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e10: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
9e20: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
9e30: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
9e40: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
9e50: 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
9e60: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
9e70: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f     (return 1).*/
9e80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70  .int sqlite3Temp
9e90: 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73  InMemory(const s
9ea0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
9eb0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
9ec0: 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28  RE==1.  return (
9ed0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
9ee0: 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =2 );.#endif.#if
9ef0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
9f00: 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28  RE==2.  return (
9f10: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
9f20: 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =1 );.#endif.#if
9f30: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
9f40: 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31  RE==3.  return 1
9f50: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
9f60: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31  ITE_TEMP_STORE<1
9f70: 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   || SQLITE_TEMP_
9f80: 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e  STORE>3.  return
9f90: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
9fa0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9fb0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
9fc0: 65 61 74 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  eate a connectio
9fd0: 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
9fe0: 42 54 72 65 65 0a 2a 2a 20 64 72 69 76 65 72 2e  BTree.** driver.
9ff0: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
a000: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
a010: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20  file, then that 
a020: 66 69 6c 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65  file is.** opene
a030: 64 20 61 6e 64 20 75 73 65 64 2e 20 20 49 66 20  d and used.  If 
a040: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
a050: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
a060: 6d 6f 72 79 3a 22 20 74 68 65 6e 0a 2a 2a 20 74  mory:" then.** t
a070: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
a080: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
a090: 28 61 6e 64 20 69 73 20 74 68 75 73 20 66 6f 72  (and is thus for
a0a0: 67 6f 74 74 65 6e 20 61 73 20 73 6f 6f 6e 20 61  gotten as soon a
a0b0: 73 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74  s.** the connect
a0c0: 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 29 20  ion is closed.) 
a0d0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
a0e0: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 64   NULL then the d
a0f0: 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 61 20  atabase.** is a 
a100: 22 76 69 72 74 75 61 6c 22 20 64 61 74 61 62 61  "virtual" databa
a110: 73 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  se for transient
a120: 20 75 73 65 20 6f 6e 6c 79 20 61 6e 64 20 69 73   use only and is
a130: 20 64 65 6c 65 74 65 64 20 61 73 0a 2a 2a 20 73   deleted as.** s
a140: 6f 6f 6e 20 61 73 20 74 68 65 20 63 6f 6e 6e 65  oon as the conne
a150: 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e  ction is closed.
a160: 0a 2a 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c  .**.** A virtual
a170: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
a180: 20 65 69 74 68 65 72 20 61 20 64 69 73 6b 20 66   either a disk f
a190: 69 6c 65 20 28 74 68 61 74 20 69 73 20 61 75 74  ile (that is aut
a1a0: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 64 65  omatically.** de
a1b0: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 66  leted when the f
a1c0: 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 29 20 6f  ile is closed) o
a1d0: 72 20 69 74 20 61 6e 20 62 65 20 68 65 6c 64 20  r it an be held 
a1e0: 65 6e 74 69 72 65 6c 79 20 69 6e 20 6d 65 6d 6f  entirely in memo
a1f0: 72 79 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ry..** The sqlit
a200: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 29  e3TempInMemory()
a210: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
a220: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
a230: 68 69 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  hich..*/.int sql
a240: 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
a250: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a270: 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20 77   Main database w
a280: 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78 20  hen opening aux 
a290: 6f 74 68 65 72 77 69 73 65 20 30 20 2a 2f 0a 20  otherwise 0 */. 
a2a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
a2b0: 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61  lename,    /* Na
a2c0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
a2d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
a2e0: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
a2f0: 20 20 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61    int omitJourna
a300: 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  l,          /* i
a310: 66 20 54 52 55 45 20 74 68 65 6e 20 64 6f 20 6e  f TRUE then do n
a320: 6f 74 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  ot journal this 
a330: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  file */.  int nC
a340: 61 63 68 65 2c 20 20 20 20 20 20 20 20 20 20 20  ache,           
a350: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20      /* How many 
a360: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
a370: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74  e cache */.  int
a380: 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
a390: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
a3a0: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
a3b0: 6f 20 76 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42  o vfsOpen */.  B
a3c0: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20  tree **ppBtree  
a3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a3e0: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
a3f0: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
a400: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
a410: 20 62 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   btFlags = 0;.  
a420: 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73  int rc;.  .  ass
a430: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a440: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
a450: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
a460: 70 70 42 74 72 65 65 20 21 3d 20 30 29 3b 0a 20  ppBtree != 0);. 
a470: 20 69 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c   if( omitJournal
a480: 20 29 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20   ){.    btFlags 
a490: 7c 3d 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  |= BTREE_OMIT_JO
a4a0: 55 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28  URNAL;.  }.  if(
a4b0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
a4c0: 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29  ITE_NoReadlock )
a4d0: 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d  {.    btFlags |=
a4e0: 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f   BTREE_NO_READLO
a4f0: 43 4b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  CK;.  }.#ifndef 
a500: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
a510: 52 59 44 42 0a 20 20 69 66 28 20 7a 46 69 6c 65  RYDB.  if( zFile
a520: 6e 61 6d 65 3d 3d 30 20 26 26 20 73 71 6c 69 74  name==0 && sqlit
a530: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64  e3TempInMemory(d
a540: 62 29 20 29 7b 0a 20 20 20 20 7a 46 69 6c 65 6e  b) ){.    zFilen
a550: 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22  ame = ":memory:"
a560: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
a570: 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
a580: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
a590: 5f 44 42 29 21 3d 30 20 26 26 20 28 7a 46 69 6c  _DB)!=0 && (zFil
a5a0: 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69  ename==0 || *zFi
a5b0: 6c 65 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20  lename==0) ){.  
a5c0: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
a5d0: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
a5e0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
a5f0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
a600: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  P_DB;.  }.  rc =
a610: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
a620: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71  n(zFilename, (sq
a630: 6c 69 74 65 33 20 2a 29 64 62 2c 20 70 70 42 74  lite3 *)db, ppBt
a640: 72 65 65 2c 20 62 74 46 6c 61 67 73 2c 20 76 66  ree, btFlags, vf
a650: 73 46 6c 61 67 73 29 3b 0a 0a 20 20 2f 2a 20 49  sFlags);..  /* I
a660: 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
a670: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
a680: 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
a690: 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
a6a0: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  o the.  ** defau
a6b0: 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
a6c0: 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  , if the call to
a6d0: 20 42 74 72 65 65 4f 70 65 6e 28 29 20 72 65 74   BtreeOpen() ret
a6e0: 75 72 6e 65 64 20 61 20 68 61 6e 64 6c 65 0a 20  urned a handle. 
a6f0: 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 65   ** open on an e
a700: 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
a710: 61 67 65 72 2d 63 61 63 68 65 2c 20 64 6f 20 6e  ager-cache, do n
a720: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
a730: 67 65 72 2d 63 61 63 68 65 20 0a 20 20 2a 2a 20  ger-cache .  ** 
a740: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  size..  */.  if(
a750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
a760: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  & 0==sqlite3Btre
a770: 65 53 63 68 65 6d 61 28 2a 70 70 42 74 72 65 65  eSchema(*ppBtree
a780: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 73  , 0, 0) ){.    s
a790: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
a7a0: 63 68 65 53 69 7a 65 28 2a 70 70 42 74 72 65 65  cheSize(*ppBtree
a7b0: 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20  , nCache);.  }. 
a7c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a7d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
a7e0: 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  8 encoded Englis
a7f0: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
a800: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
a810: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
a820: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  or..*/.const cha
a830: 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  r *sqlite3_errms
a840: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  g(sqlite3 *db){.
a850: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
a860: 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
a870: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
a880: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
a890: 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MEM);.  }.  if( 
a8a0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
a8b0: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
a8c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
a8d0: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
a8e0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b  TE_MISUSE_BKPT);
a8f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
a900: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
a910: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
a920: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a930: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
a940: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
a950: 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  MEM);.  }else{. 
a960: 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71     z = (char*)sq
a970: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
a980: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
a990: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
a9a0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a9b0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
a9c0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
a9d0: 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
a9e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a9f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
aa00: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
aa10: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
aa20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aa30: 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
aa40: 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f  turn UTF-16 enco
aa50: 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
aa60: 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
aa70: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
aa80: 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
aa90: 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
aaa0: 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71  ite3_errmsg16(sq
aab0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74  lite3 *db){.  st
aac0: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f  atic const u16 o
aad0: 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20  utOfMem[] = {.  
aae0: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
aaf0: 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20   ' ', 'o', 'f', 
ab00: 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27  ' ', 'm', 'e', '
ab10: 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79  m', 'o', 'r', 'y
ab20: 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ', 0.  };.  stat
ab30: 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73  ic const u16 mis
ab40: 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c  use[] = {.    'l
ab50: 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27  ', 'i', 'b', 'r'
ab60: 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'a', 'r', 'y',
ab70: 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20   ' ', .    'r', 
ab80: 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
ab90: 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20  i', 'n', 'e', ' 
aba0: 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27  ', .    'c', 'a'
abb0: 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c  , 'l', 'l', 'e',
abc0: 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'd', ' ', .    
abd0: 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
abe0: 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66   ', .    'o', 'f
abf0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27  ', ' ', .    's'
ac00: 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c  , 'e', 'q', 'u',
ac10: 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20   'e', 'n', 'c', 
ac20: 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63  'e', 0.  };..  c
ac30: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20  onst void *z;.  
ac40: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
ac50: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75  eturn (void *)ou
ac60: 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  tOfMem;.  }.  if
ac70: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
ac80: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
ac90: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
aca0: 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a  (void *)misuse;.
acb0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
acc0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
acd0: 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
ace0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
acf0: 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29      z = (void *)
ad00: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73  outOfMem;.  }els
ad10: 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
ad20: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
ad30: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69  db->pErr);.    i
ad40: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
ad50: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
ad60: 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
ad70: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
ad80: 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20  db->errCode),.  
ad90: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
ada0: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
adb0: 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  TIC);.      z = 
adc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
add0: 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
ade0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d      }.    /* A m
adf0: 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65  alloc() may have
ae00: 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74   failed within t
ae10: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
ae20: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
ae30: 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20  ).    ** above. 
ae40: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
ae50: 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62  ase, then the db
ae60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
ae70: 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  lag needs to.   
ae80: 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62   ** be cleared b
ae90: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
aea0: 20 44 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c   Do this directl
aeb0: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69  y, instead of vi
aec0: 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  a.    ** sqlite3
aed0: 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76  ApiExit(), to av
aee0: 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  oid setting the 
aef0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
af00: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20  error message.. 
af10: 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61     */.    db->ma
af20: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
af30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
af40: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
af50: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
af60: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
af70: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
af80: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
af90: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
afa0: 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65   error code gene
afb0: 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69  rated by an SQLi
afc0: 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e  te routine. If N
afd0: 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64  ULL is.** passed
afe0: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
aff0: 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d  n, we assume a m
b000: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64  alloc() failed d
b010: 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70  uring sqlite3_op
b020: 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
b030: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c  ite3_errcode(sql
b040: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
b050: 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
b060: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
b070: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
b080: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
b090: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  SE_BKPT;.  }.  i
b0a0: 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61  f( !db || db->ma
b0b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b0c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b0d0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
b0e0: 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20  urn db->errCode 
b0f0: 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
b100: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
b110: 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71  ended_errcode(sq
b120: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
b130: 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33  ( db && !sqlite3
b140: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
b150: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
b160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
b170: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
b180: 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d  if( !db || db->m
b190: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b1a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b1b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
b1c0: 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
b1d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
b1e0: 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e  e a new collatin
b1f0: 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64  g function for d
b200: 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54  atabase "db".  T
b210: 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65  he name is zName
b220: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f  .** and the enco
b230: 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a  ding is enc..*/.
b240: 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74  static int creat
b250: 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  eCollation(.  sq
b260: 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e  lite3* db,.  con
b270: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
b280: 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 75 38 20  .  u8 enc,.  u8 
b290: 63 6f 6c 6c 54 79 70 65 2c 0a 20 20 76 6f 69 64  collType,.  void
b2a0: 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
b2b0: 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
b2c0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
b2d0: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
b2e0: 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
b2f0: 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53  oid*).){.  CollS
b300: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
b310: 20 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61   enc2;.  int nNa
b320: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
b330: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a  en30(zName);.  .
b340: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b350: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
b360: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
b370: 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
b380: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
b390: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
b3a0: 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
b3b0: 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
b3c0: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
b3d0: 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
b3e0: 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
b3f0: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
b400: 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
b410: 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
b420: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
b430: 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65  .  */.  enc2 = e
b440: 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  nc;.  testcase( 
b450: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
b460: 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  16 );.  testcase
b470: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
b480: 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a  TF16_ALIGNED );.
b490: 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49    if( enc2==SQLI
b4a0: 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32  TE_UTF16 || enc2
b4b0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
b4c0: 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e  LIGNED ){.    en
b4d0: 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  c2 = SQLITE_UTF1
b4e0: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69  6NATIVE;.  }.  i
b4f0: 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55  f( enc2<SQLITE_U
b500: 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49  TF8 || enc2>SQLI
b510: 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20  TE_UTF16BE ){.  
b520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b530: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
b540: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
b550: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d  this call is rem
b560: 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69  oving or replaci
b570: 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63  ng an existing c
b580: 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73  ollation .  ** s
b590: 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20  equence. If so, 
b5a0: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
b5b0: 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e  tive VMs, return
b5c0: 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a   busy. If there.
b5d0: 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69    ** are no acti
b5e0: 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61  ve VMs, invalida
b5f0: 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69  te any pre-compi
b600: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
b610: 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    */.  pColl = s
b620: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
b630: 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
b640: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  zName, 0);.  if(
b650: 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
b660: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28  >xCmp ){.    if(
b670: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
b680: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
b690: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
b6a0: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
b6b0: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
b6c0: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c  lete/modify coll
b6d0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64  ation sequence d
b6e0: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
b6f0: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
b700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
b710: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
b720: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
b730: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
b740: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63  b);..    /* If c
b750: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b760: 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61  e pColl was crea
b770: 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20  ted directly by 
b780: 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  a call to.    **
b790: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
b7a0: 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e  collation, and n
b7b0: 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ot generated by 
b7c0: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a  synthCollSeq(),.
b7d0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20      ** then any 
b7e0: 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73  copies made by s
b7f0: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65  ynthCollSeq() ne
b800: 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ed to be invalid
b810: 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  ated..    ** Als
b820: 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73  o, collation des
b830: 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65  tructor - CollSe
b840: 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74  q.xDel() - funct
b850: 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ion may need.   
b860: 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64   ** to be called
b870: 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66  ..    */ .    if
b880: 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20  ( (pColl->enc & 
b890: 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  ~SQLITE_UTF16_AL
b8a0: 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a  IGNED)==enc2 ){.
b8b0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61        CollSeq *a
b8c0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
b8d0: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
b8e0: 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  lSeq, zName, nNa
b8f0: 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  me);.      int j
b900: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
b910: 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
b920: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
b930: 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   &aColl[j];.    
b940: 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d      if( p->enc==
b950: 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
b960: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78          if( p->x
b970: 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Del ){.         
b980: 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55     p->xDel(p->pU
b990: 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ser);.          
b9a0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78  }.          p->x
b9b0: 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cmp = 0;.       
b9c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b9d0: 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  }..  pColl = 
b9e0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
b9f0: 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
ba00: 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66   zName, 1);.  if
ba10: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70  ( pColl ){.    p
ba20: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f  Coll->xCmp = xCo
ba30: 6d 70 61 72 65 3b 0a 20 20 20 20 70 43 6f 6c 6c  mpare;.    pColl
ba40: 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a  ->pUser = pCtx;.
ba50: 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20      pColl->xDel 
ba60: 3d 20 78 44 65 6c 3b 0a 20 20 20 20 70 43 6f 6c  = xDel;.    pCol
ba70: 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e  l->enc = (u8)(en
ba80: 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49  c2 | (enc & SQLI
ba90: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
baa0: 29 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 74  ));.    pColl->t
bab0: 79 70 65 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a  ype = collType;.
bac0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
bad0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
bae0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
baf0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
bb00: 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64  .** This array d
bb10: 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65  efines hard uppe
bb20: 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69  r bounds on limi
bb30: 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a  t values.  The.*
bb40: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75  * initializer mu
bb50: 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79  st be kept in sy
bb60: 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  nc with the SQLI
bb70: 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64  TE_LIMIT_*.** #d
bb80: 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65  efines in sqlite
bb90: 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  3.h..*/.static c
bba0: 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69  onst int aHardLi
bbb0: 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49  mit[] = {.  SQLI
bbc0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20  TE_MAX_LENGTH,. 
bbd0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
bbe0: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
bbf0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53  _MAX_COLUMN,.  S
bc00: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
bc10: 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  EPTH,.  SQLITE_M
bc20: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
bc30: 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  CT,.  SQLITE_MAX
bc40: 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49  _VDBE_OP,.  SQLI
bc50: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
bc60: 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ARG,.  SQLITE_MA
bc70: 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51  X_ATTACHED,.  SQ
bc80: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
bc90: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20  TTERN_LENGTH,.  
bca0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
bcb0: 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51  BLE_NUMBER,.  SQ
bcc0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
bcd0: 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  _DEPTH,.};../*.*
bce0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
bcf0: 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20  hard limits are 
bd00: 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c  set to reasonabl
bd10: 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20  e values.*/.#if 
bd20: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
bd30: 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
bd40: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
bd50: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
bd60: 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
bd70: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
bd80: 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
bd90: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
bda0: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
bdb0: 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
bdc0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
bdd0: 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51  AX_SQL_LENGTH>SQ
bde0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
bdf0: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
be00: 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
be10: 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65  st not be greate
be20: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41  r than SQLITE_MA
be30: 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a  X_LENGTH.#endif.
be40: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
be50: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32  OMPOUND_SELECT<2
be60: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
be70: 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
be80: 45 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ECT must be at l
be90: 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69  east 2.#endif.#i
bea0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  f SQLITE_MAX_VDB
beb0: 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20  E_OP<40.# error 
bec0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
bed0: 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  OP must be at le
bee0: 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69  ast 40.#endif.#i
bef0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  f SQLITE_MAX_FUN
bf00: 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53  CTION_ARG<0 || S
bf10: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
bf20: 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72  ON_ARG>1000.# er
bf30: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  ror SQLITE_MAX_F
bf40: 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74  UNCTION_ARG must
bf50: 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
bf60: 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69  d 1000.#endif.#i
bf70: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  f SQLITE_MAX_ATT
bf80: 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54  ACHED<0 || SQLIT
bf90: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 33  E_MAX_ATTACHED>3
bfa0: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
bfb0: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75  _MAX_ATTACHED mu
bfc0: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
bfd0: 61 6e 64 20 33 30 0a 23 65 6e 64 69 66 0a 23 69  and 30.#endif.#i
bfe0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  f SQLITE_MAX_LIK
bff0: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
c000: 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
c010: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
c020: 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  RN_LENGTH must b
c030: 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
c040: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
c050: 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a  AX_COLUMN>32767.
c060: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
c070: 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e  AX_COLUMN must n
c080: 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a  ot exceed 32767.
c090: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
c0a0: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
c0b0: 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  PTH<1.# error SQ
c0c0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
c0d0: 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61  _DEPTH must be a
c0e0: 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
c0f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
c100: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c  the value of a l
c110: 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68  imit.  Report th
c120: 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20  e old value..** 
c130: 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69  If an invalid li
c140: 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75 70  mit index is sup
c150: 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31  plied, report -1
c160: 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61  ..** Make no cha
c170: 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72  nges but still r
c180: 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
c190: 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  lue if the.** ne
c1a0: 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  w limit is negat
c1b0: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ive..**.** A new
c1c0: 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65   lower limit doe
c1d0: 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69  s not shrink exi
c1e0: 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73  sting constructs
c1f0: 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70  ..** It merely p
c200: 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73  revents new cons
c210: 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63 65  tructs that exce
c220: 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20  ed the limit.** 
c230: 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f  from forming..*/
c240: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d  .int sqlite3_lim
c250: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
c260: 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74  int limitId, int
c270: 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e   newLimit){.  in
c280: 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 20 20 69 66  t oldLimit;.  if
c290: 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c  ( limitId<0 || l
c2a0: 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e  imitId>=SQLITE_N
c2b0: 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65  _LIMIT ){.    re
c2c0: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f  turn -1;.  }.  o
c2d0: 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c  ldLimit = db->aL
c2e0: 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
c2f0: 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
c300: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4c   ){.    if( newL
c310: 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b  imit>aHardLimit[
c320: 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20  limitId] ){.    
c330: 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61    newLimit = aHa
c340: 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
c350: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
c360: 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
c370: 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
c380: 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
c390: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
c3a0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
c3b0: 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e  e work of openin
c3c0: 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20  g a database on 
c3d0: 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c  behalf of.** sql
c3e0: 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20  ite3_open() and 
c3f0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
c400: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
c410: 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61  ilename "zFilena
c420: 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d  me"  .** is UTF-
c430: 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  8 encoded..*/.st
c440: 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74  atic int openDat
c450: 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
c460: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
c470: 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
c480: 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64  name UTF-8 encod
c490: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
c4a0: 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f  **ppDb,        /
c4b0: 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20  * OUT: Returned 
c4c0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
c4d0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 6c  */.  unsigned fl
c4e0: 61 67 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  ags,        /* O
c4f0: 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73  perational flags
c500: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
c510: 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20   *zVfs       /* 
c520: 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  Name of the VFS 
c530: 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73  to use */.){.  s
c540: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
c550: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 73 54 68  t rc;.  int isTh
c560: 72 65 61 64 73 61 66 65 3b 0a 0a 20 20 2a 70 70  readsafe;..  *pp
c570: 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
c580: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
c590: 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
c5a0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
c5b0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
c5c0: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a  urn rc;.#endif..
c5d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
c5e0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
c5f0: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  utex==0 ){.    i
c600: 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
c610: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
c620: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
c630: 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  _NOMUTEX ){.    
c640: 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
c650: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
c660: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
c670: 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20  N_FULLMUTEX ){. 
c680: 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
c690: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
c6a0: 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
c6b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
c6c0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b  nfig.bFullMutex;
c6d0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
c6e0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
c6f0: 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
c700: 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
c710: 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
c720: 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
c730: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
c740: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
c750: 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
c760: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c770: 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
c780: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
c790: 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
c7a0: 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
c7b0: 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
c7c0: 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
c7d0: 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
c7e0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
c7f0: 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
c800: 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
c810: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
c820: 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
c830: 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
c840: 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
c850: 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
c860: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
c870: 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
c880: 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
c890: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
c8a0: 44 57 52 49 54 45 2c 20 61 6e 64 20 53 51 4c 49  DWRITE, and SQLI
c8b0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2e 20  TE_OPEN_CREATE. 
c8c0: 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20   Silently mask. 
c8d0: 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65   ** off all othe
c8e0: 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20  r flags..  */.  
c8f0: 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c  flags &=  ~( SQL
c900: 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
c910: 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
c920: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
c930: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
c950: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
c960: 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
c970: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
c980: 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
c990: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
c9a0: 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
c9b0: 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
c9c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
c9d0: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
c9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c9f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
ca00: 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
ca10: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
ca20: 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
ca30: 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
ca40: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
ca50: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
ca60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ca70: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
ca80: 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
ca90: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
caa0: 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 20 20 20  _FULLMUTEX.     
cab0: 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
cac0: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
cad0: 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
cae0: 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
caf0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
cb00: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
cb10: 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
cb20: 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
cb30: 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
cb40: 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d  dsafe ){.    db-
cb50: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
cb60: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
cb70: 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
cb80: 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
cb90: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
cba0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
cbb0: 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
cbc0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
cbd0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
cbe0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
cbf0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
cc00: 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
cc10: 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
cc20: 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
cc30: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
cc40: 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
cc50: 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
cc60: 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  atic;..  assert(
cc70: 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
cc80: 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72  it)==sizeof(aHar
cc90: 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d  dLimit) );.  mem
cca0: 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20  cpy(db->aLimit, 
ccb0: 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65  aHardLimit, size
ccc0: 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b  of(db->aLimit));
ccd0: 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
cce0: 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78  t = 1;.  db->nex
ccf0: 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20  tAutovac = -1;. 
cd00: 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
cd10: 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  e = 0;.  db->fla
cd20: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
cd30: 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c  rtColNames | SQL
cd40: 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 69  ITE_AutoIndex.#i
cd50: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
cd60: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20  _FILE_FORMAT<4. 
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  | SQLITE_LegacyF
cd90: 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69  ileFmt.#endif.#i
cda0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cdb0: 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
cdc0: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
cdd0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64     | SQLITE_Load
cde0: 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66  Extension.#endif
cdf0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
ce00: 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52  ULT_RECURSIVE_TR
ce10: 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20  IGGERS.         
ce20: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
ce30: 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e  _RecTriggers.#en
ce40: 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
ce50: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
ce60: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
ce70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ce80: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
ce90: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
cea0: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
ceb0: 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56  #endif..  db->pV
cec0: 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
ced0: 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69  _find(zVfs);.  i
cee0: 66 28 20 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a  f( !db->pVfs ){.
cef0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cf00: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
cf10: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
cf20: 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73  "no such vfs: %s
cf30: 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f  ", zVfs);.    go
cf40: 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
cf50: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
cf60: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
cf70: 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
cf80: 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
cf90: 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
cfa0: 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
cfb0: 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
cfc0: 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
cfd0: 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
cfe0: 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
cff0: 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
d000: 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
d010: 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
d020: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
d030: 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
d040: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
d050: 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
d060: 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49  , SQLITE_COLL_BI
d070: 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20  NARY, 0,.       
d080: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f             binCo
d090: 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
d0a0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
d0b0: 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
d0c0: 54 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49  TE_UTF16BE, SQLI
d0d0: 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20  TE_COLL_BINARY, 
d0e0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
d0f0: 20 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63       binCollFunc
d100: 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
d110: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
d120: 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
d130: 31 36 4c 45 2c 20 53 51 4c 49 54 45 5f 43 4f 4c  16LE, SQLITE_COL
d140: 4c 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20  L_BINARY, 0,.   
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
d160: 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
d170: 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
d180: 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
d190: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
d1a0: 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 28 76  TE_COLL_USER, (v
d1b0: 6f 69 64 2a 29 31 2c 0a 20 20 20 20 20 20 20 20  oid*)1,.        
d1c0: 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c            binCol
d1d0: 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  lFunc, 0);.  if(
d1e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d1f0: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
d200: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
d210: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20  db->pDfltColl = 
d220: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
d230: 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
d240: 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29  F8, "BINARY", 0)
d250: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
d260: 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pDfltColl!=0 );.
d270: 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61  .  /* Also add a
d280: 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65   UTF-8 case-inse
d290: 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f  nsitive collatio
d2a0: 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20  n sequence. */. 
d2b0: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
d2c0: 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53  (db, "NOCASE", S
d2d0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
d2e0: 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20  TE_COLL_NOCASE, 
d2f0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
d300: 20 20 20 20 20 6e 6f 63 61 73 65 43 6f 6c 6c 61       nocaseColla
d310: 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20  tingFunc, 0);.. 
d320: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63   /* Open the bac
d330: 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72  kend database dr
d340: 69 76 65 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  iver */.  db->op
d350: 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
d360: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
d370: 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
d380: 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 53 51  zFilename, 0, SQ
d390: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
d3a0: 48 45 5f 53 49 5a 45 2c 20 0a 20 20 20 20 20 20  HE_SIZE, .      
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3c0: 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c       flags | SQL
d3d0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
d3e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 62               &db
d400: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
d410: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d420: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
d430: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  ==SQLITE_IOERR_N
d440: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  OMEM ){.      rc
d450: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
d460: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d470: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
d480: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  0);.    goto ope
d490: 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
d4a0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
d4b0: 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
d4c0: 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
d4d0: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
d4e0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
d4f0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
d500: 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a  t(db, 0);...  /*
d510: 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66   The default saf
d520: 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68  ety_level for th
d530: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
d540: 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74  is 'full'; for t
d550: 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
d560: 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e  abase it is 'NON
d570: 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73  E'. This matches
d580: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
d590: 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a   defaults.  .  *
d5a0: 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a  /.  db->aDb[0].z
d5b0: 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
d5c0: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
d5d0: 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20  ty_level = 3;.  
d5e0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65  db->aDb[1].zName
d5f0: 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
d600: 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
d610: 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d  evel = 1;..  db-
d620: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
d630: 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66  MAGIC_OPEN;.  if
d640: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
d650: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
d660: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
d670: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c    /* Register al
d680: 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74  l built-in funct
d690: 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74  ions, but do not
d6a0: 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64   attempt to read
d6b0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
d6c0: 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54  se schema yet. T
d6d0: 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75  his is delayed u
d6e0: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
d6f0: 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ime the database
d700: 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65  .  ** is accesse
d710: 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
d720: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
d730: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
d740: 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74  te3RegisterBuilt
d750: 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b  inFunctions(db);
d760: 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f  ..  /* Load auto
d770: 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73  matic extensions
d780: 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68   - extensions th
d790: 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67  at have been reg
d7a0: 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69  istered.  ** usi
d7b0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61  ng the sqlite3_a
d7c0: 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69  utomatic_extensi
d7d0: 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20  on() API..  */. 
d7e0: 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
d7f0: 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
d800: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
d810: 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66  rrcode(db);.  if
d820: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d830: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
d840: 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66  db_out;.  }..#if
d850: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d860: 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
d870: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d880: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
d890: 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
d8a0: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
d8b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
d8c0: 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
d8d0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
d8e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
d8f0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
d900: 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
d910: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d920: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
d930: 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
d940: 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
d950: 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
d960: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
d970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d980: 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20  ABLE_FTS3.  if( 
d990: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
d9a0: 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
d9b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
d9c0: 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64  qlite3Fts3Init(d
d9d0: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
d9e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d9f0: 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21  ABLE_ICU.  if( !
da00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
da10: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
da20: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
da30: 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
da40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
da50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
da60: 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
da70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
da80: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
da90: 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
daa0: 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
dab0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
dac0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
dad0: 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  , rc, 0);..  /* 
dae0: 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
daf0: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
db00: 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
db10: 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
db20: 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
db30: 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
db40: 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
db50: 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
db60: 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
db70: 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
db80: 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
db90: 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
dba0: 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
dbb0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
dbc0: 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
dbd0: 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
dbe0: 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
dbf0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
dc00: 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
dc10: 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
dc20: 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
dc30: 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
dc40: 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
dc70: 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
dc80: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62  endif..  /* Enab
dc90: 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
dca0: 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
dcb0: 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
dcc0: 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
dcd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
dce0: 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
dd10: 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
dd20: 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  side);..  sqlite
dd30: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
dd40: 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  oint(db, SQLITE_
dd50: 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f  DEFAULT_WAL_AUTO
dd60: 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70  CHECKPOINT);..op
dd70: 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20  endb_out:.  if( 
dd80: 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  db ){.    assert
dd90: 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c  ( db->mutex!=0 |
dda0: 7c 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d  | isThreadsafe==
ddb0: 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  0 || sqlite3Glob
ddc0: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
ddd0: 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
dde0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ddf0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
de00: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
de10: 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
de20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
de30: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69  OMEM ){.    sqli
de40: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
de50: 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c     db = 0;.  }el
de60: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
de70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  E_OK ){.    db->
de80: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
de90: 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20  AGIC_SICK;.  }. 
dea0: 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20 20 72   *ppDb = db;.  r
deb0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69  eturn sqlite3Api
dec0: 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a  Exit(0, rc);.}..
ded0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
dee0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
def0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
df00: 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
df10: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
df20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
df30: 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  b .){.  return o
df40: 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
df50: 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20  ename, ppDb,.   
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
df80: 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
df90: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
dfa0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
dfb0: 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73  _open_v2(.  cons
dfc0: 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
dfd0: 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ,   /* Database 
dfe0: 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29  filename (UTF-8)
dff0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
e000: 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  ppDb,         /*
e010: 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20   OUT: SQLite db 
e020: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
e030: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
e040: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
e050: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
e060: 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  fs        /* Nam
e070: 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20  e of VFS module 
e080: 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72  to use */.){.  r
e090: 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
e0a0: 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44  se(filename, ppD
e0b0: 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  b, flags, zVfs);
e0c0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
e0d0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
e0e0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
e0f0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
e100: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
e110: 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76  pen16(.  const v
e120: 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  oid *zFilename, 
e130: 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
e140: 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  b.){.  char cons
e150: 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20  t *zFilename8;  
e160: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e   /* zFilename en
e170: 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69  coded in UTF-8 i
e180: 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36  nstead of UTF-16
e190: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
e1a0: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
e1b0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
e1c0: 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 61  zFilename );.  a
e1d0: 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a 20  ssert( ppDb );. 
e1e0: 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
e1f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e200: 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
e210: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
e220: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
e230: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
e240: 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  if.  pVal = sqli
e250: 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
e260: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
e270: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a  tStr(pVal, -1, z
e280: 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45  Filename, SQLITE
e290: 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51  _UTF16NATIVE, SQ
e2a0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
e2b0: 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c  zFilename8 = sql
e2c0: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
e2d0: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  al, SQLITE_UTF8)
e2e0: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
e2f0: 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  e8 ){.    rc = o
e300: 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
e310: 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20  ename8, ppDb,.  
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
e340: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
e350: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
e360: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
e370: 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c  *ppDb || rc==SQL
e380: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
e390: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e3a0: 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70  OK && !DbHasProp
e3b0: 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44  erty(*ppDb, 0, D
e3c0: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20  B_SchemaLoaded) 
e3d0: 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70 70  ){.      ENC(*pp
e3e0: 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  Db) = SQLITE_UTF
e3f0: 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a  16NATIVE;.    }.
e400: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
e410: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
e420: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c    }.  sqlite3Val
e430: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
e440: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
e450: 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d  piExit(0, rc);.}
e460: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e470: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
e480: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
e490: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
e4a0: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
e4b0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
e4c0: 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
e4d0: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
e4e0: 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
e4f0: 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
e500: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
e510: 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
e520: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
e530: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
e540: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
e550: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
e560: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
e570: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e580: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e590: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
e5a0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
e5b0: 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
e5c0: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  ion(db, zName, (
e5d0: 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f 43  u8)enc, SQLITE_C
e5e0: 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c 20  OLL_USER, pCtx, 
e5f0: 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20  xCompare, 0);.  
e600: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
e610: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
e620: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e630: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
e640: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e650: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
e660: 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
e670: 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
e680: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
e690: 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
e6a0: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
e6b0: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
e6c0: 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
e6d0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
e6e0: 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
e6f0: 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
e700: 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
e710: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
e720: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
e730: 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
e740: 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
e750: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  c;.  sqlite3_mut
e760: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
e770: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
e780: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e790: 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
e7a0: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
e7b0: 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 53  Name, (u8)enc, S
e7c0: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c  QLITE_COLL_USER,
e7d0: 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
e7e0: 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73   xDel);.  rc = s
e7f0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
e800: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
e810: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
e820: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
e830: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
e840: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
e850: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
e860: 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
e870: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
e880: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
e890: 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
e8a0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
e8b0: 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  llation16(.  sql
e8c0: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
e8d0: 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a  st void *zName,.
e8e0: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
e8f0: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
e900: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
e910: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
e920: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
e930: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
e940: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
e950: 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c  r *zName8;.  sql
e960: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
e970: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
e980: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
e990: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e  ocFailed );.  zN
e9a0: 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74  ame8 = sqlite3Ut
e9b0: 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65  f16to8(db, zName
e9c0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
e9d0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28  16NATIVE);.  if(
e9e0: 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72   zName8 ){.    r
e9f0: 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
ea00: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20  ion(db, zName8, 
ea10: 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45 5f  (u8)enc, SQLITE_
ea20: 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78 2c  COLL_USER, pCtx,
ea30: 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
ea40: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ea50: 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20  (db, zName8);.  
ea60: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
ea70: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
ea80: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ea90: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
eaa0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
eab0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
eac0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
ead0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
eae0: 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
eaf0: 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61  uence factory ca
eb00: 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
eb10: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
eb20: 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61  ** db. Replace a
eb30: 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ny previously in
eb40: 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f  stalled collatio
eb50: 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
eb60: 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
eb70: 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
eb80: 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ded(.  sqlite3 *
eb90: 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
eba0: 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
ebb0: 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
ebc0: 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  d)(void*,sqlite3
ebd0: 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
ebe0: 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
ebf0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ec00: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
ec10: 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
ec20: 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  ed = xCollNeeded
ec30: 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
ec40: 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d  ded16 = 0;.  db-
ec50: 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
ec60: 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
ec70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ec80: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ec90: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
eca0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
ecb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
ecc0: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
ecd0: 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
ece0: 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
ecf0: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
ed00: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
ed10: 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
ed20: 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
ed30: 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
ed40: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
ed50: 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
ed60: 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
ed70: 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69  needed16(.  sqli
ed80: 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
ed90: 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
eda0: 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
edb0: 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c  Needed16)(void*,
edc0: 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
edd0: 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64  xtRep,const void
ede0: 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
edf0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
ee00: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
ee10: 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  ollNeeded = 0;. 
ee20: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
ee30: 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  16 = xCollNeeded
ee40: 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e  16;.  db->pCollN
ee50: 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
ee60: 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
ee70: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ee80: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ee90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
eea0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
eeb0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
eec0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
eed0: 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45 43  E_OMIT_GLOBALREC
eee0: 4f 56 45 52 0a 23 69 66 6e 64 65 66 20 53 51 4c  OVER.#ifndef SQL
eef0: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
ef00: 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  TED./*.** This f
ef10: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61  unction is now a
ef20: 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49  n anachronism. I
ef30: 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65  t used to be use
ef40: 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  d to recover fro
ef50: 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20  m a.** malloc() 
ef60: 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c  failure, but SQL
ef70: 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69  ite now does thi
ef80: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  s automatically.
ef90: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
efa0: 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76  global_recover(v
efb0: 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  oid){.  return S
efc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
efd0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
efe0: 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   Test to see whe
eff0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
f000: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
f010: 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  ion is in autoco
f020: 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52  mmit.** mode.  R
f030: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
f040: 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66   is and FALSE if
f050: 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69   not.  Autocommi
f060: 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20  t mode is on.** 
f070: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74  by default.  Aut
f080: 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62  ocommit is disab
f090: 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73  led by a BEGIN s
f0a0: 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65  tatement and ree
f0b0: 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65  nabled.** by the
f0c0: 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20   next COMMIT or 
f0d0: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a  ROLLBACK..**.***
f0e0: 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41 4e 20  **** THIS IS AN 
f0f0: 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41 50 49  EXPERIMENTAL API
f100: 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43 54 20   AND IS SUBJECT 
f110: 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a  TO CHANGE ******
f120: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
f130: 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
f140: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
f150: 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
f160: 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
f170: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
f180: 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69 74  tines are subtit
f190: 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e  utes for constan
f1a0: 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ts SQLITE_CORRUP
f1b0: 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  T,.** SQLITE_MIS
f1c0: 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  USE, SQLITE_CANT
f1d0: 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45  OPEN, SQLITE_IOE
f1e0: 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  RR and possibly 
f1f0: 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
f200: 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20  onstants.  They 
f210: 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70 6f  server two purpo
f220: 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
f230: 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
f240: 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
f250: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
f260: 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
f270: 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
f280: 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
f290: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
f2a0: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
f2b0: 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
f2c0: 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
f2d0: 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
f2e0: 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
f2f0: 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
f300: 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
f310: 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
f320: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
f330: 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
f340: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
f350: 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
f360: 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
f370: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
f380: 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  g(SQLITE_CORRUPT
f390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f3a0: 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
f3b0: 74 69 6f 6e 20 66 6f 75 6e 64 20 62 79 20 73 6f  tion found by so
f3c0: 75 72 63 65 20 6c 69 6e 65 20 25 64 22 2c 20 6c  urce line %d", l
f3d0: 69 6e 65 6e 6f 29 3b 0a 20 20 72 65 74 75 72 6e  ineno);.  return
f3e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
f3f0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69  .}.int sqlite3Mi
f400: 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69  suseError(int li
f410: 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
f420: 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
f430: 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
f440: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
f450: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 22  SQLITE_MISUSE, "
f460: 6d 69 73 75 73 65 20 64 65 74 65 63 74 65 64 20  misuse detected 
f470: 62 79 20 73 6f 75 72 63 65 20 6c 69 6e 65 20 25  by source line %
f480: 64 22 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 72  d", lineno);.  r
f490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
f4a0: 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  USE;.}.int sqlit
f4b0: 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28  e3CantopenError(
f4c0: 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
f4d0: 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
f4e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
f4f0: 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
f500: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e  3_log(SQLITE_CAN
f510: 54 4f 50 45 4e 2c 20 22 63 61 6e 6e 6f 74 20 6f  TOPEN, "cannot o
f520: 70 65 6e 20 66 69 6c 65 20 61 74 20 73 6f 75 72  pen file at sour
f530: 63 65 20 6c 69 6e 65 20 25 64 22 2c 20 6c 69 6e  ce line %d", lin
f540: 65 6e 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  eno);.  return S
f550: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
f560: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
f570: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
f580: 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ED./*.** This is
f590: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72   a convenience r
f5a0: 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65  outine that make
f5b0: 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  s sure that all 
f5c0: 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a  thread-specific.
f5d0: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  ** data for this
f5e0: 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e   thread has been
f5f0: 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a   deallocated..**
f600: 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f  .** SQLite no lo
f610: 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64  nger uses thread
f620: 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73  -specific data s
f630: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
f640: 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  s now a.** no-op
f650: 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65  .  It is retaine
f660: 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  d for historical
f670: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a   compatibility..
f680: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
f690: 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76  thread_cleanup(v
f6a0: 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oid){.}.#endif..
f6b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74  /*.** Return met
f6c0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  a information ab
f6d0: 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63  out a specific c
f6e0: 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62  olumn of a datab
f6f0: 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65  ase table..** Se
f700: 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c  e comment in sql
f710: 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68  ite3.h (sqlite.h
f720: 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73  .in) for details
f730: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
f740: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
f750: 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71  _METADATA.int sq
f760: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
f770: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73  mn_metadata(.  s
f780: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
f790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
f7a0: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
f7b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
f7c0: 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20  *zDbName,       
f7d0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
f7e0: 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  e or NULL */.  c
f7f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
f800: 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61  eName,     /* Ta
f810: 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ble name */.  co
f820: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
f830: 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c  nName,    /* Col
f840: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
f850: 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74  ar const **pzDat
f860: 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54  aType,    /* OUT
f870: 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61  PUT: Declared da
f880: 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  ta type */.  cha
f890: 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c  r const **pzColl
f8a0: 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50  Seq,     /* OUTP
f8b0: 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  UT: Collation se
f8c0: 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20  quence name */. 
f8d0: 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20   int *pNotNull, 
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8f0: 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
f900: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
f910: 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  int exists */.  
f920: 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  int *pPrimaryKey
f930: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
f940: 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
f950: 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b  olumn part of PK
f960: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f   */.  int *pAuto
f970: 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  inc             
f980: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
f990: 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61  e if column is a
f9a0: 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f  uto-increment */
f9b0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
f9c0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
f9d0: 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
f9e0: 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
f9f0: 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
fa00: 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f  iCol;..  char co
fa10: 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d  nst *zDataType =
fa20: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
fa30: 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a   *zCollSeq = 0;.
fa40: 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20    int notnull = 
fa50: 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  0;.  int primary
fa60: 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  key = 0;.  int a
fa70: 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f  utoinc = 0;..  /
fa80: 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74  * Ensure the dat
fa90: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
faa0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a   been loaded */.
fab0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fac0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
fad0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
fae0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
faf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74  rc = sqlite3Init
fb00: 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  (db, &zErrMsg);.
fb10: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
fb20: 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =rc ){.    goto 
fb30: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
fb40: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
fb50: 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f  table in questio
fb60: 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71  n */.  pTab = sq
fb70: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
fb80: 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a  b, zTableName, z
fb90: 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  DbName);.  if( !
fba0: 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53  pTab || pTab->pS
fbb0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61  elect ){.    pTa
fbc0: 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  b = 0;.    goto 
fbd0: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  error_out;.  }..
fbe0: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f    /* Find the co
fbf0: 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69  lumn for which i
fc00: 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64  nfo is requested
fc10: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
fc20: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e  3IsRowid(zColumn
fc30: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f  Name) ){.    iCo
fc40: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
fc50: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30  .    if( iCol>=0
fc60: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d   ){.      pCol =
fc70: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
fc80: 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  l];.    }.  }els
fc90: 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  e{.    for(iCol=
fca0: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
fcb0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
fcc0: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
fcd0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
fce0: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
fcf0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
fd00: 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d  Name, zColumnNam
fd10: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
fd20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
fd30: 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d   }.    if( iCol=
fd40: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
fd50: 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20       pTab = 0;. 
fd60: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
fd70: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
fd80: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
fd90: 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20  ng block stores 
fda0: 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  the meta informa
fdb0: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62  tion that will b
fdc0: 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20  e returned.  ** 
fdd0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e  to the caller in
fde0: 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
fdf0: 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c   zDataType, zCol
fe00: 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70  lSeq, notnull, p
fe10: 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61  rimarykey.  ** a
fe20: 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74  nd autoinc. At t
fe30: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
fe40: 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c  are two possibil
fe50: 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a  ities:.  ** .  *
fe60: 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65  *     1. The spe
fe70: 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  cified column na
fe80: 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22  me was rowid", "
fe90: 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f  oid" or "_rowid_
fea0: 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61  " .  **        a
feb0: 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65  nd there is no e
fec0: 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72  xplicitly declar
fed0: 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a  ed IPK column. .
fee0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e    **.  **     2.
fef0: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f   The table is no
ff00: 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65  t a view and the
ff10: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65   column name ide
ff20: 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a  ntified an .  **
ff30: 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74          explicit
ff40: 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  ly declared colu
ff50: 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e  mn. Copy meta in
ff60: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a  formation from *
ff70: 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  pCol..  */ .  if
ff80: 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44  ( pCol ){.    zD
ff90: 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e  ataType = pCol->
ffa0: 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c  zType;.    zColl
ffb0: 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  Seq = pCol->zCol
ffc0: 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d  l;.    notnull =
ffd0: 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d   pCol->notNull!=
ffe0: 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  0;.    primaryke
fff0: 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69  y  = pCol->isPri
10000 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20 61 75 74  mKey!=0;.    aut
10010 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
10020 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
10030 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
10040 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
10050 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
10060 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
10070 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
10080 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
10090 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
100a0 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
100b0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
100c0 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
100d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
100e0 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
100f0 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
10100 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
10110 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
10120 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
10130 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
10140 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
10150 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
10160 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
10170 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
10180 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
10190 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
101a0 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
101b0 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
101c0 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
101d0 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
101e0 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
101f0 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
10200 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
10210 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
10220 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
10230 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
10240 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
10250 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
10260 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
10270 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
10280 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
10290 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
102a0 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
102b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
102c0 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
102d0 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
102e0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
102f0 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
10300 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
10310 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
10320 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
10330 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
10340 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
10350 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
10360 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22  , rc, (zErrMsg?"
10370 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29  %s":0), zErrMsg)
10380 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
10390 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
103a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
103b0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
103c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
103d0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
103e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
103f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c  #endif../*.** Sl
10400 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
10410 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
10420 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
10430 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74  me slept..*/.int
10440 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69   sqlite3_sleep(i
10450 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65  nt ms){.  sqlite
10460 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69  3_vfs *pVfs;.  i
10470 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20  nt rc;.  pVfs = 
10480 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
10490 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d  (0);.  if( pVfs=
104a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
104b0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
104c0 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c  on works in mill
104d0 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68  iseconds, but th
104e0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53  e underlying OsS
104f0 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49  leep() .  ** API
10500 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e   uses microsecon
10510 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30  ds. Hence the 10
10520 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  00's..  */.  rc 
10530 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  = (sqlite3OsSlee
10540 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29  p(pVfs, 1000*ms)
10550 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  /1000);.  return
10560 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e   rc;.}../*.** En
10570 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
10580 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73  the extended res
10590 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e  ult codes..*/.in
105a0 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
105b0 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
105c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
105d0 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74   onoff){.  sqlit
105e0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
105f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
10600 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66  >errMask = onoff
10610 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
10620 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  0xff;.  sqlite3_
10630 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10640 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10660 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
10670 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74  xFileControl met
10680 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75  hod on a particu
10690 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  lar database..*/
106a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c  .int sqlite3_fil
106b0 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  e_control(sqlite
106c0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
106d0 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20  r *zDbName, int 
106e0 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
106f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10700 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20  TE_ERROR;.  int 
10710 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  iDb;.  sqlite3_m
10720 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
10730 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62  utex);.  if( zDb
10740 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
10750 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Db = 0;.  }else{
10760 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20  .    for(iDb=0; 
10770 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
10780 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
10790 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b 69 44  trcmp(db->aDb[iD
107a0 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  b].zName, zDbNam
107b0 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
107c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
107d0 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20  Db<db->nDb ){.  
107e0 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
107f0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
10800 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 72  Bt;.    if( pBtr
10810 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  ee ){.      Page
10820 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 20  r *pPager;.     
10830 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
10840 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  d;.      sqlite3
10850 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
10860 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
10870 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
10880 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  ager(pBtree);.  
10890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
108a0 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  er!=0 );.      f
108b0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
108c0 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
108d0 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d      assert( fd!=
108e0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  0 );.      if( f
108f0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
10900 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10910 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
10920 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  (fd, op, pArg);.
10930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
10940 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10950 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20  pBtree);.    }. 
10960 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
10970 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
10980 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
10990 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ;   .}../*.** In
109a0 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
109b0 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
109c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
109d0 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
109e0 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
109f0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
10a00 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
10a10 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74  N_TEST.  va_list
10a20 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
10a30 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
10a40 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  h( op ){..    /*
10a50 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65  .    ** Save the
10a60 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
10a70 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20  f the PRNG..    
10a80 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
10a90 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
10aa0 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  _SAVE: {.      s
10ab0 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74  qlite3PrngSaveSt
10ac0 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
10ad0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
10ae0 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65  *.    ** Restore
10af0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
10b00 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61  e PRNG to the la
10b10 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75  st state saved u
10b20 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47  sing.    ** PRNG
10b30 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f  _SAVE.  If PRNG_
10b40 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62  SAVE has never b
10b50 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65  efore been calle
10b60 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  d, then.    ** t
10b70 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69  his verb acts li
10b80 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20  ke PRNG_RESET.. 
10b90 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
10ba0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
10bb0 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20  RNG_RESTORE: {. 
10bc0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
10bd0 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a  RestoreState();.
10be0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10bf0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
10c00 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47  * Reset the PRNG
10c10 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69   back to its uni
10c20 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
10c30 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c  .  The next call
10c40 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
10c50 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20  e3_randomness() 
10c60 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20  will reseed the 
10c70 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e  PRNG using a sin
10c80 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  gle call.    ** 
10c90 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65  to the xRandomne
10ca0 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ss method of the
10cb0 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20   default VFS..  
10cc0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
10cd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
10ce0 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20  NG_RESET: {.    
10cf0 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73    sqlite3PrngRes
10d00 65 74 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  etState();.     
10d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
10d20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
10d30 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
10d40 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20  ol(BITVEC_TEST, 
10d50 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20  size, program). 
10d60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e     **.    ** Run
10d70 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20   a test against 
10d80 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20  a Bitvec object 
10d90 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72  of size.  The pr
10da0 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20  ogram argument. 
10db0 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61     ** is an arra
10dc0 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68  y of integers th
10dd0 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74  at defines the t
10de0 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  est.  Return -1 
10df0 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f  on a.    ** memo
10e00 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
10e10 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73  ror, 0 on succes
10e20 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66  s, or non-zero f
10e30 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  or an error..   
10e40 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69   ** See the sqli
10e50 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
10e60 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74  Test() for addit
10e70 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
10e80 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
10e90 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
10ea0 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20  RL_BITVEC_TEST: 
10eb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
10ec0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
10ed0 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72  ;.      int *aPr
10ee0 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
10ef0 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20  int*);.      rc 
10f00 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  = sqlite3BitvecB
10f10 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61  uiltinTest(sz, a
10f20 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65  Prog);.      bre
10f30 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
10f40 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
10f50 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
10f60 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
10f70 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e 64  KS, xBegin, xEnd
10f80 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
10f90 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20 74  Register hooks t
10fa0 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61  o call to indica
10fb0 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28  te which malloc(
10fc0 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20 20  ) failures .    
10fd0 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20  ** are benign.. 
10fe0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
10ff0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
11000 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f  ENIGN_MALLOC_HOO
11010 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  KS: {.      type
11020 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f  def void (*void_
11030 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b  function)(void);
11040 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63  .      void_func
11050 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67 69  tion xBenignBegi
11060 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  n;.      void_fu
11070 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e  nction xBenignEn
11080 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  d;.      xBenign
11090 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28 61  Begin = va_arg(a
110a0 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
110b0 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67 6e  );.      xBenign
110c0 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  End = va_arg(ap,
110d0 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b   void_function);
110e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
110f0 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28  nignMallocHooks(
11100 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42  xBenignBegin, xB
11110 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20  enignEnd);.     
11120 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
11130 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
11140 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
11150 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
11160 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  RL_PENDING_BYTE,
11170 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58 29   unsigned int X)
11180 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
11190 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  et the PENDING b
111a0 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75 65  yte to the value
111b0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
111c0 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a  , if X>0..    **
111d0 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
111e0 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75 72   if X==0.  Retur
111f0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
11200 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65 0a  he pending byte.
11210 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78 69      ** as it exi
11220 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68 69  sting before thi
11230 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
11240 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  lled..    **.   
11250 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20   ** IMPORTANT:  
11260 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
11270 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20 30  DING byte from 0
11280 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c 74  x40000000 result
11290 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69  s in.    ** an i
112a0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74 61  ncompatible data
112b0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  base file format
112c0 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  .  Changing the 
112d0 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20 20  PENDING byte.   
112e0 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64 61   ** while any da
112f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11300 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c 74  n is open result
11310 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20 61  s in undefined a
11320 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65 74 65  nd.    ** dilete
11330 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e 0a  rious behavior..
11340 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
11350 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
11360 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a  PENDING_BYTE: {.
11370 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
11380 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
11390 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
113a0 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
113b0 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42   sqlite3PendingB
113c0 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  yte;.      if( n
113d0 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50  ewVal ) sqlite3P
113e0 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77  endingByte = new
113f0 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  Val;.      break
11400 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
11410 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
11420 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
11430 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
11440 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  ERT, int X).    
11450 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
11460 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
11470 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
11480 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
11490 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65   not.    ** asse
114a0 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64  rt() was enabled
114b0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
114c0 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
114d0 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20  and assert().   
114e0 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20   ** is enabled, 
114f0 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
11500 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20  value is true.  
11510 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64  If X is true and
11520 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
11530 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
11540 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
11550 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66  lue is zero.  If
11560 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c   X is.    ** fal
11570 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
11580 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
11590 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66   the assertion f
115a0 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20  ires and the.   
115b0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72   ** process abor
115c0 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c  ts.  If X is fal
115d0 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
115e0 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
115f0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74  n the.    ** ret
11600 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
11610 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  o..    */.    ca
11620 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
11630 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20  RL_ASSERT: {.   
11640 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20     volatile int 
11650 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  x = 0;.      ass
11660 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72 67  ert( (x = va_arg
11670 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a  (ap,int))!=0 );.
11680 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20        rc = x;.  
11690 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
116a0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
116b0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
116c0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
116d0 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69  STCTRL_ALWAYS, i
116e0 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
116f0 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
11700 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
11710 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
11720 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61  how the ALWAYS a
11730 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20  nd.    ** NEVER 
11740 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69  macros were defi
11750 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
11760 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ime..    **.    
11770 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
11780 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29  lue is ALWAYS(X)
11790 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
117a0 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65  * The recommende
117b0 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20  d test is X==2. 
117c0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
117d0 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74 20  alue is 2, that 
117e0 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57  means.    ** ALW
117f0 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28  AYS() and NEVER(
11800 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70  ) are both no-op
11810 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
11820 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74  cros, which is t
11830 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
11840 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74  t setting.  If t
11850 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
11860 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59  is 1, then ALWAY
11870 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20 20  S() is either.  
11880 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20    ** hard-coded 
11890 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20  to true or else 
118a0 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69 74  it asserts if it
118b0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  s argument is fa
118c0 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  lse..    ** The 
118d0 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20 28  first behavior (
118e0 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
118f0 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  ue) is the case 
11900 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
11910 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
11920 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
11930 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
11940 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a   and the second.
11950 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20      ** behavior 
11960 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20 61  (assert if the a
11970 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59  rgument to ALWAY
11980 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69 73  S() is false) is
11990 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20   the case if.   
119a0 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43   ** SQLITE_TESTC
119b0 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73  TRL_ASSERT shows
119c0 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69   that assert() i
119d0 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a  s enabled..    *
119e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e  *.    ** The run
119f0 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65  -time test proce
11a00 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20  dure might look 
11a10 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74  something like t
11a20 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
11a30 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  **    if( sqlite
11a40 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
11a50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
11a60 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a  LWAYS, 2)==2 ){.
11a70 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
11a80 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
11a90 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61  R() are no-op pa
11aa0 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
11ab0 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  s.    **    }els
11ac0 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65  e if( sqlite3_te
11ad0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
11ae0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
11af0 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20  T, 1) ){.    ** 
11b00 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
11b10 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20 78  ) asserts that x
11b20 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28   is true. NEVER(
11b30 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73 20  x) asserts x is 
11b40 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20  false..    **   
11b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20   }else{.    **  
11b60 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29      // ALWAYS(x)
11b70 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31   is a constant 1
11b80 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20 61  .  NEVER(x) is a
11b90 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20   constant 0..   
11ba0 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a   **    }.    */.
11bb0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
11bc0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a  TESTCTRL_ALWAYS:
11bd0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d   {.      int x =
11be0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
11bf0 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41  .      rc = ALWA
11c00 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65  YS(x);.      bre
11c10 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
11c20 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
11c30 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
11c40 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
11c50 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
11c60 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
11c70 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73   ** Set the nRes
11c80 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66  erve size to N f
11c90 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
11ca0 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61  base on the data
11cb0 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e  base.    ** conn
11cc0 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a  ection db..    *
11cd0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
11ce0 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
11cf0 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
11d00 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
11d10 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
11d20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
11d30 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
11d40 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
11d50 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
11d60 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
11d70 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
11d80 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
11d90 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20  , 0, x, 0);.    
11da0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11db0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
11dc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11dd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
11de0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
11df0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
11e00 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
11e10 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
11e20 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
11e30 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   ** Enable or di
11e40 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70  sable various op
11e50 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20  timizations for 
11e60 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
11e70 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61  .  The .    ** a
11e80 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62  rgument N is a b
11e90 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69  itmask of optimi
11ea0 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69  zations to be di
11eb0 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72  sabled.  For nor
11ec0 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  mal.    ** opera
11ed0 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65  tion N should be
11ee0 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73   0.  The idea is
11ef0 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f   that a test pro
11f00 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20  gram (like the. 
11f10 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20     ** SQL Logic 
11f20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74  Test or SLT test
11f30 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e   module) can run
11f40 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75   the same SQL mu
11f50 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20  ltiple times.   
11f60 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73   ** with various
11f70 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64   optimizations d
11f80 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66  isabled to verif
11f90 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  y that the same 
11fa0 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73  answer.    ** is
11fb0 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65   obtained in eve
11fc0 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  ry case..    */.
11fd0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
11fe0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
11ff0 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20  ATIONS: {.      
12000 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
12010 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
12020 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  *);.      int x 
12030 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
12040 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
12050 73 20 3d 20 28 78 20 26 20 53 51 4c 49 54 45 5f  s = (x & SQLITE_
12060 4f 70 74 4d 61 73 6b 29 20 7c 20 28 64 62 2d 3e  OptMask) | (db->
12070 66 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  flags & ~SQLITE_
12080 4f 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  OptMask);.      
12090 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
120a0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  fdef SQLITE_N_KE
120b0 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c  YWORD.    /* sql
120c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
120d0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
120e0 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e  L_ISKEYWORD, con
120f0 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a  st char *zWord).
12100 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
12110 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77   zWord is a keyw
12120 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62  ord recognized b
12130 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  y the parser, th
12140 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20  en return the.  
12150 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b    ** number of k
12160 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20  eywords.  Or if 
12170 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b  zWord is not a k
12180 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30  eyword, return 0
12190 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
121a0 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75   This test featu
121b0 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  re is only avail
121c0 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c  able in the amal
121d0 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20  gamation since. 
121e0 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45     ** the SQLITE
121f0 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f  _N_KEYWORD macro
12200 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
12210 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20  in this file if 
12220 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73  SQLite.    ** is
12230 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70   built using sep
12240 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c  arate source fil
12250 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
12260 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
12270 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b  TRL_ISKEYWORD: {
12280 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
12290 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72  r *zWord = va_ar
122a0 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
122b0 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  *);.      int n 
122c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
122d0 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20  0(zWord);.      
122e0 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79  rc = (sqlite3Key
122f0 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57  wordCode((u8*)zW
12300 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20  ord, n)!=TK_ID) 
12310 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  ? SQLITE_N_KEYWO
12320 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72  RD : 0;.      br
12330 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
12340 66 20 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64  f ..  }.  va_end
12350 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
12360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
12370 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65  TIN_TEST */.  re
12380 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.