/ Hex Artifact Content
Login

Artifact 66ea03499db1add96bcd20f38fdd04599d2a54db:


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 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
47f0: 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  destructor funct
4800: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
4810: 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69  ith FuncDef p, i
4820: 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a  f any. Except,.*
4830: 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * if this is not
4840: 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f   the last copy o
4850: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20  f the function, 
4860: 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74  do not invoke it
4870: 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f  . Multiple.** co
4880: 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  pies of a single
4890: 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72   function are cr
48a0: 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61 74  eated when creat
48b0: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  e_function() is 
48c0: 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53  called.** with S
48d0: 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65  QLITE_ANY as the
48e0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74   encoding..*/.st
48f0: 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69  atic void functi
4900: 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65  onDestroy(sqlite
4910: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
4920: 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75  p){.  FuncDestru
4930: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
4940: 72 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74  r = p->pDestruct
4950: 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72  or;.  if( pDestr
4960: 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65  uctor ){.    pDe
4970: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d  structor->nRef--
4980: 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74 72  ;.    if( pDestr
4990: 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  uctor->nRef==0 )
49a0: 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75 63  {.      pDestruc
49b0: 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44  tor->xDestroy(pD
49c0: 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72  estructor->pUser
49d0: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  Data);.      sql
49e0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
49f0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
4a00: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4a10: 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Close an existin
4a20: 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  g SQLite databas
4a30: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
4a40: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
4a50: 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  db){.  HashElem 
4a60: 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *i;             
4a70: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
4a80: 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f  able iterator */
4a90: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66 28  .  int j;..  if(
4aa0: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
4ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
4ac0: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
4ad0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
4ae0: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
4af0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
4b00: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
4b10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
4b20: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
4b30: 0a 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49  .  sqlite3ResetI
4b40: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
4b50: 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  , 0);..  /* If a
4b60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
4b70: 6f 70 65 6e 2c 20 74 68 65 20 52 65 73 65 74 49  open, the ResetI
4b80: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 29 20  nternalSchema() 
4b90: 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20  call above.  ** 
4ba0: 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61  will not have ca
4bb0: 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e  lled the xDiscon
4bc0: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e  nect() method on
4bd0: 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a   any virtual.  *
4be0: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
4bf0: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
4c00: 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ray. The followi
4c10: 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  ng sqlite3VtabRo
4c20: 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61  llback().  ** ca
4c30: 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57  ll will do so. W
4c40: 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69  e need to do thi
4c50: 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65  s before the che
4c60: 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20  ck for active.  
4c70: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
4c80: 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20  s below, as the 
4c90: 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  v-table implemen
4ca0: 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74  tation may be st
4cb0: 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20  oring.  ** some 
4cc0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
4cd0: 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  nts internally..
4ce0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74    */.  sqlite3Vt
4cf0: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
4d00: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
4d10: 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69  re any outstandi
4d20: 6e 67 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 53  ng VMs, return S
4d30: 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20  QLITE_BUSY. */. 
4d40: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
4d50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4d60: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
4d70: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
4d80: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
4d90: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 73 65 64  e to unfinalised
4da0: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
4db0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
4dc0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4dd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
4de0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
4df0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4e00: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
4e10: 72 4f 6b 28 64 62 29 20 29 3b 0a 0a 20 20 66 6f  rOk(db) );..  fo
4e20: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
4e30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; j++){.    Btre
4e40: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
4e50: 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [j].pBt;.    if(
4e60: 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42   pBt && sqlite3B
4e70: 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70  treeIsInBackup(p
4e80: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Bt) ){.      sql
4e90: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
4ea0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
4eb0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
4ec0: 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e   close due to un
4ed0: 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 20  finished backup 
4ee0: 6f 70 65 72 61 74 69 6f 6e 22 29 3b 0a 20 20 20  operation");.   
4ef0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
4f00: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4f10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
4f20: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
4f30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
4f40: 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e  e any outstandin
4f50: 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  g Savepoint stru
4f60: 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c  ctures. */.  sql
4f70: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
4f80: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  nts(db);..  for(
4f90: 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20  j=0; j<db->nDb; 
4fa0: 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  j++){.    struct
4fb0: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
4fc0: 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[j];.    if( 
4fd0: 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pDb->pBt ){.    
4fe0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
4ff0: 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ose(pDb->pBt);. 
5000: 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20       pDb->pBt = 
5010: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d  0;.      if( j!=
5020: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  1 ){.        pDb
5030: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  ->pSchema = 0;. 
5040: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5050: 0a 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49  .  sqlite3ResetI
5060: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
5070: 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c  , 0);..  /* Tell
5080: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74   the code in not
5090: 69 66 79 2e 63 20 74 68 61 74 20 74 68 65 20 63  ify.c that the c
50a0: 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e  onnection no lon
50b0: 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20  ger holds any.  
50c0: 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65  ** locks and doe
50d0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
50e0: 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b  y further unlock
50f0: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
5100: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
5110: 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65  3ConnectionClose
5120: 64 28 64 62 29 3b 0a 0a 20 20 61 73 73 65 72 74  d(db);..  assert
5130: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
5140: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
5150: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
5160: 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   );.  for(j=0; j
5170: 3c 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61  <ArraySize(db->a
5180: 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20  Func.a); j++){. 
5190: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78     FuncDef *pNex
51a0: 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20  t, *pHash, *p;. 
51b0: 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75     for(p=db->aFu
51c0: 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48  nc.a[j]; p; p=pH
51d0: 61 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73  ash){.      pHas
51e0: 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20  h = p->pHash;.  
51f0: 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a      while( p ){.
5200: 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
5210: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
5220: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
5230: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
5240: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5250: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
5260: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20  p = pNext;.     
5270: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
5280: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
5290: 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  irst(&db->aCollS
52a0: 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  eq); i; i=sqlite
52b0: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
52c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
52d0: 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71   = (CollSeq *)sq
52e0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
52f0: 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61  .    /* Invoke a
5300: 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72  ny destructors r
5310: 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f  egistered for co
5320: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5330: 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20   user data. */. 
5340: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
5350: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
5360: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29   pColl[j].xDel )
5370: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b  {.        pColl[
5380: 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d  j].xDel(pColl[j]
5390: 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d  .pUser);.      }
53a0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
53b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
53c0: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
53d0: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
53e0: 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
53f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5400: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66  VIRTUALTABLE.  f
5410: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
5420: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
5430: 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  e); i; i=sqliteH
5440: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
5450: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
5460: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
5470: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
5480: 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74   if( pMod->xDest
5490: 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f  roy ){.      pMo
54a0: 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64  d->xDestroy(pMod
54b0: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20  ->pAux);.    }. 
54c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
54d0: 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a  (db, pMod);.  }.
54e0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
54f0: 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  ar(&db->aModule)
5500: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
5510: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
5520: 49 54 45 5f 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44  ITE_OK, 0); /* D
5530: 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63  eallocates any c
5540: 61 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69  ached error stri
5550: 6e 67 73 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62  ngs. */.  if( db
5560: 2d 3e 70 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->pErr ){.    sq
5570: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64  lite3ValueFree(d
5580: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 7d 0a 20 20  b->pErr);.  }.  
5590: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
55a0: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64  nsions(db);..  d
55b0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
55c0: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a  E_MAGIC_ERROR;..
55d0: 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61    /* The temp-da
55e0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
55f0: 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65   allocated diffe
5600: 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rently from the 
5610: 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a  other schema.  *
5620: 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67  * objects (using
5630: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
5640: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
5650: 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  d of sqlite3Btre
5660: 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a  eSchema())..  **
5670: 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   So it needs to 
5680: 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54  be freed here. T
5690: 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c  odo: Why not rol
56a0: 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d  l the temp schem
56b0: 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  a into.  ** the 
56c0: 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  same sqliteMallo
56d0: 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74  c() as the one t
56e0: 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68  hat allocates th
56f0: 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a  e database .  **
5700: 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f   structure?.  */
5710: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5720: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  (db, db->aDb[1].
5730: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
5740: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
5750: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
5760: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
5770: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
5780: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
5790: 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ree(db->mutex);.
57a0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
57b0: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20  okaside.nOut==0 
57c0: 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20  );  /* Fails on 
57d0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  a lookaside memo
57e0: 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28  ry leak */.  if(
57f0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
5800: 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20  Malloced ){.    
5810: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
5820: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
5830: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
5840: 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 72 65  3_free(db);.  re
5850: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5860: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
5870: 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  k all database f
5880: 69 6c 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iles..*/.void sq
5890: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
58a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
58b0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e   int i;.  int in
58c0: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 61 73 73  Trans = 0;.  ass
58d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
58e0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
58f0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
5900: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
5910: 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ();.  for(i=0; i
5920: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
5930: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
5940: 69 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  i].pBt ){.      
5950: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
5960: 49 73 49 6e 54 72 61 6e 73 28 64 62 2d 3e 61 44  IsInTrans(db->aD
5970: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
5980: 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31       inTrans = 1
5990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
59a0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
59b0: 62 61 63 6b 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  back(db->aDb[i].
59c0: 70 42 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  pBt);.      db->
59d0: 61 44 62 5b 69 5d 2e 69 6e 54 72 61 6e 73 20 3d  aDb[i].inTrans =
59e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
59f0: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
5a00: 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ack(db);.  sqlit
5a10: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
5a20: 63 28 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  c();..  if( db->
5a30: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74  flags&SQLITE_Int
5a40: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
5a50: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
5a60: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
5a70: 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  s(db);.    sqlit
5a80: 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53  e3ResetInternalS
5a90: 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20  chema(db, 0);.  
5aa0: 7d 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65  }..  /* Any defe
5ab0: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
5ac0: 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20  violations have 
5ad0: 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  now been resolve
5ae0: 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66  d. */.  db->nDef
5af0: 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 0a  erredCons = 0;..
5b00: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20    /* If one has 
5b10: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
5b20: 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c   invoke the roll
5b30: 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61  back-hook callba
5b40: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ck */.  if( db->
5b50: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
5b60: 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c  k && (inTrans ||
5b70: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
5b80: 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f  ) ){.    db->xRo
5b90: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64  llbackCallback(d
5ba0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29  b->pRollbackArg)
5bb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
5bc0: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
5bd0: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
5be0: 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
5bf0: 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
5c00: 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
5c10: 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ent..*/.const ch
5c20: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74  ar *sqlite3ErrSt
5c30: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61  r(int rc){.  sta
5c40: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  tic const char* 
5c50: 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b  const aMsg[] = {
5c60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  .    /* SQLITE_O
5c70: 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e  K          */ "n
5c80: 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20  ot an error",.  
5c90: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f    /* SQLITE_ERRO
5ca0: 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20  R       */ "SQL 
5cb0: 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d  logic error or m
5cc0: 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22  issing database"
5cd0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
5ce0: 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30  INTERNAL    */ 0
5cf0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
5d00: 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22  PERM        */ "
5d10: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
5d20: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
5d30: 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20  * SQLITE_ABORT  
5d40: 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63       */ "callbac
5d50: 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72  k requested quer
5d60: 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a  y abort",.    /*
5d70: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20   SQLITE_BUSY    
5d80: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
5d90: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
5da0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   /* SQLITE_LOCKE
5db0: 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  D      */ "datab
5dc0: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
5dd0: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
5de0: 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20  ITE_NOMEM       
5df0: 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  */ "out of memor
5e00: 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  y",.    /* SQLIT
5e10: 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f  E_READONLY    */
5e20: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69   "attempt to wri
5e30: 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61  te a readonly da
5e40: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
5e50: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
5e60: 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74     */ "interrupt
5e70: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
5e80: 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a  TE_IOERR       *
5e90: 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  / "disk I/O erro
5ea0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
5eb0: 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f  E_CORRUPT     */
5ec0: 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   "database disk 
5ed0: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
5ee0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
5ef0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a  TE_NOTFOUND    *
5f00: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
5f10: 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a  TE_FULL        *
5f20: 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64  / "database or d
5f30: 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20  isk is full",.  
5f40: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54    /* SQLITE_CANT
5f50: 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62  OPEN    */ "unab
5f60: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
5f70: 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f  ase file",.    /
5f80: 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  * SQLITE_PROTOCO
5f90: 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67  L    */ "locking
5fa0: 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20   protocol",.    
5fb0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  /* SQLITE_EMPTY 
5fc0: 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20        */ "table 
5fd0: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
5fe0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
5ff0: 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20  _SCHEMA      */ 
6000: 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
6010: 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20   has changed",. 
6020: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f     /* SQLITE_TOO
6030: 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72  BIG      */ "str
6040: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20  ing or blob too 
6050: 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  big",.    /* SQL
6060: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20  ITE_CONSTRAINT  
6070: 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66  */ "constraint f
6080: 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ailed",.    /* S
6090: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20  QLITE_MISMATCH  
60a0: 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d    */ "datatype m
60b0: 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a  ismatch",.    /*
60c0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20   SQLITE_MISUSE  
60d0: 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20      */ "library 
60e0: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f  routine called o
60f0: 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c  ut of sequence",
6100: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
6110: 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c  OLFS       */ "l
6120: 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72  arge file suppor
6130: 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a  t is disabled",.
6140: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55      /* SQLITE_AU
6150: 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75  TH        */ "au
6160: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69  thorization deni
6170: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
6180: 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a  TE_FORMAT      *
6190: 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74  / "auxiliary dat
61a0: 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72  abase format err
61b0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
61c0: 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a  TE_RANGE       *
61d0: 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d  / "bind or colum
61e0: 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72  n index out of r
61f0: 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ange",.    /* SQ
6200: 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20  LITE_NOTADB     
6210: 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63   */ "file is enc
6220: 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74  rypted or is not
6230: 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20   a database",.  
6240: 7d 3b 0a 20 20 72 63 20 26 3d 20 30 78 66 66 3b  };.  rc &= 0xff;
6250: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 72 63  .  if( ALWAYS(rc
6260: 3e 3d 30 29 20 26 26 20 72 63 3c 28 69 6e 74 29  >=0) && rc<(int)
6270: 28 73 69 7a 65 6f 66 28 61 4d 73 67 29 2f 73 69  (sizeof(aMsg)/si
6280: 7a 65 6f 66 28 61 4d 73 67 5b 30 5d 29 29 20 26  zeof(aMsg[0])) &
6290: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
62a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 61 4d 73 67  .    return aMsg
62b0: 5b 72 63 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [rc];.  }else{. 
62c0: 20 20 20 72 65 74 75 72 6e 20 22 75 6e 6b 6e 6f     return "unkno
62d0: 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 7d 0a 7d  wn error";.  }.}
62e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
62f0: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
6300: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
6310: 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20  that sleeps and 
6320: 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75  tries.** again u
6330: 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76  ntil a timeout v
6340: 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e  alue is reached.
6350: 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61    The timeout va
6360: 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74  lue is.** an int
6370: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d  eger number of m
6380: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73  illiseconds pass
6390: 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72  ed in as the fir
63a0: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  st.** argument..
63b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
63c0: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
63d0: 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a  allback(. void *
63e0: 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
63f0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
6400: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e  onnection */. in
6410: 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20  t count         
6420: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6430: 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20   of times table 
6440: 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f  has been busy */
6450: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
6460: 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65  S_WIN || (define
6470: 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
6480: 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20  & HAVE_USLEEP). 
6490: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
64a0: 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20   delays[] =.    
64b0: 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20   { 1, 2, 5, 10, 
64c0: 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20  15, 20, 25, 25, 
64d0: 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31   25,  50,  50, 1
64e0: 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  00 };.  static c
64f0: 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d  onst u8 totals[]
6500: 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20   =.     { 0, 1, 
6510: 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35  3,  8, 18, 33, 5
6520: 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c  3, 78, 103, 128,
6530: 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64   178, 228 };.# d
6540: 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 28 73 69  efine NDELAY (si
6550: 7a 65 6f 66 28 64 65 6c 61 79 73 29 2f 73 69 7a  zeof(delays)/siz
6560: 65 6f 66 28 64 65 6c 61 79 73 5b 30 5d 29 29 0a  eof(delays[0])).
6570: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6580: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a  (sqlite3 *)ptr;.
6590: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20    int timeout = 
65a0: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  db->busyTimeout;
65b0: 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72  .  int delay, pr
65c0: 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ior;..  assert( 
65d0: 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66  count>=0 );.  if
65e0: 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59  ( count < NDELAY
65f0: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
6600: 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20  delays[count];. 
6610: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
6620: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73  s[count];.  }els
6630: 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  e{.    delay = d
6640: 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b  elays[NDELAY-1];
6650: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
6660: 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20  als[NDELAY-1] + 
6670: 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44  delay*(count-(ND
6680: 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  ELAY-1));.  }.  
6690: 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61  if( prior + dela
66a0: 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  y > timeout ){. 
66b0: 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f     delay = timeo
66c0: 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20  ut - prior;.    
66d0: 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72  if( delay<=0 ) r
66e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
66f0: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
6700: 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30  ->pVfs, delay*10
6710: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
6720: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
6730: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
6740: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
6750: 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33  eout = ((sqlite3
6760: 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d   *)ptr)->busyTim
6770: 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75  eout;.  if( (cou
6780: 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d  nt+1)*1000 > tim
6790: 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  eout ){.    retu
67a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
67b0: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
67c0: 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20  Vfs, 1000000);. 
67d0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
67e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  f.}../*.** Invok
67f0: 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79  e the given busy
6800: 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   handler..**.** 
6810: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6820: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f  called when an o
6830: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20  peration failed 
6840: 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20  with a lock..** 
6850: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
6860: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
6870: 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65  , the lock is re
6880: 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  tried.  If it.**
6890: 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20   returns 0, the 
68a0: 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73  operation aborts
68b0: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
68c0: 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  BUSY error..*/.i
68d0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  nt sqlite3Invoke
68e0: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79  BusyHandler(Busy
68f0: 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69  Handler *p){.  i
6900: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56  nt rc;.  if( NEV
6910: 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78  ER(p==0) || p->x
6920: 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42  Func==0 || p->nB
6930: 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30  usy<0 ) return 0
6940: 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e  ;.  rc = p->xFun
6950: 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42  c(p->pArg, p->nB
6960: 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  usy);.  if( rc==
6970: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  0 ){.    p->nBus
6980: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
6990: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b  .    p->nBusy++;
69a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
69b0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ; .}../*.** This
69c0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
69d0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
69e0: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
69f0: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
6a00: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
6a10: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
6a20: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
6a30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6a40: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20  _busy_handler(. 
6a50: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
6a60: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
6a70: 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  d*,int),.  void 
6a80: 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74  *pArg.){.  sqlit
6a90: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
6aa0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
6ab0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75  >busyHandler.xFu
6ac0: 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62  nc = xBusy;.  db
6ad0: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41  ->busyHandler.pA
6ae0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d  rg = pArg;.  db-
6af0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75  >busyHandler.nBu
6b00: 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sy = 0;.  sqlite
6b10: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6b20: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
6b30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6b40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6b50: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
6b60: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
6b70: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
6b80: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
6b90: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
6ba0: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
6bb0: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
6bc0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
6bd0: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
6be0: 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72  ument. The progr
6bf0: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c  ess callback wil
6c00: 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  l.** be invoked 
6c10: 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64  every nOps opcod
6c20: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
6c30: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
6c40: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
6c50: 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73  *db, .  int nOps
6c60: 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72  ,.  int (*xProgr
6c70: 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20  ess)(void*), .  
6c80: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
6c90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6ca0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6cb0: 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a    if( nOps>0 ){.
6cc0: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
6cd0: 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20  s = xProgress;. 
6ce0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
6cf0: 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20  Ops = nOps;.    
6d00: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
6d10: 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65   = pArg;.  }else
6d20: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
6d30: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ess = 0;.    db-
6d40: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
6d50: 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  0;.    db->pProg
6d60: 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d  ressArg = 0;.  }
6d70: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6d80: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6d90: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
6da0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6db0: 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61   installs a defa
6dc0: 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ult busy handler
6dd0: 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20   that waits for 
6de0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
6df0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
6e00: 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72  seconds before r
6e10: 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69  eturning 0..*/.i
6e20: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
6e30: 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20  timeout(sqlite3 
6e40: 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20  *db, int ms){.  
6e50: 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20  if( ms>0 ){.    
6e60: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
6e70: 3d 20 6d 73 3b 0a 20 20 20 20 73 71 6c 69 74 65  = ms;.    sqlite
6e80: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
6e90: 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  b, sqliteDefault
6ea0: 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76  BusyCallback, (v
6eb0: 6f 69 64 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73  oid*)db);.  }els
6ec0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  e{.    sqlite3_b
6ed0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
6ee0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
6ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6f00: 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e  ../*.** Cause an
6f10: 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74  y pending operat
6f20: 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69  ion to stop at i
6f30: 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f  ts earliest oppo
6f40: 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  rtunity..*/.void
6f50: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
6f60: 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  pt(sqlite3 *db){
6f70: 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  .  db->u1.isInte
6f80: 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a  rrupted = 1;.}..
6f90: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
6fa0: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
6fb0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
6fc0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
6fd0: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
6fe0: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
6ff0: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
7000: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
7010: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
7020: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
7030: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
7040: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
7050: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
7060: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
7070: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7080: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
7090: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
70a0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
70b0: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
70c0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
70d0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
70e0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
70f0: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
7100: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
7110: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
7120: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7130: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
7140: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
7150: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
7160: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
7170: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
7180: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
7190: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
71a0: 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72  t*),.  FuncDestr
71b0: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
71c0: 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  or.){.  FuncDef 
71d0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
71e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
71f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
7200: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
7210: 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  f( zFunctionName
7220: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46  ==0 ||.      (xF
7230: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c  unc && (xFinal |
7240: 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20  | xStep)) || .  
7250: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
7260: 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70  xFinal && !xStep
7270: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46  )) ||.      (!xF
7280: 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20  unc && (!xFinal 
7290: 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  && xStep)) ||.  
72a0: 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20      (nArg<-1 || 
72b0: 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  nArg>SQLITE_MAX_
72c0: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c  FUNCTION_ARG) ||
72d0: 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61  .      (255<(nNa
72e0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
72f0: 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e  en30( zFunctionN
7300: 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65  ame))) ){.    re
7310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
7320: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a  SE_BKPT;.  }.  .
7330: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7340: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49  MIT_UTF16.  /* I
7350: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
7360: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
7370: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
7380: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
7390: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
73a0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
73b0: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
73c0: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
73d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
73e0: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
73f0: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
7400: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
7410: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49   **.  ** If SQLI
7420: 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66  TE_ANY is specif
7430: 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76  ied, add three v
7440: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  ersions of the f
7450: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  unction.  ** to 
7460: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  the hash table..
7470: 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d    */.  if( enc==
7480: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a  SQLITE_UTF16 ){.
7490: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
74a0: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
74b0: 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53  }else if( enc==S
74c0: 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20  QLITE_ANY ){.   
74d0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
74e0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
74f0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
7500: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
7510: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
7520: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
7530: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
7540: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
7550: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
7560: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
7580: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
7590: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
75a0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
75b0: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
75c0: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
75d0: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
75e0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
75f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7600: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
7610: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
7620: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
7630: 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65  _UTF16BE;.  }.#e
7640: 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49  lse.  enc = SQLI
7650: 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a  TE_UTF8;.#endif.
7660: 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
7670: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e   an existing fun
7680: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f  ction is being o
7690: 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c  verridden or del
76a0: 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a  eted. If so,.  *
76b0: 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
76c0: 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e  active VMs, then
76d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
76e0: 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69  USY. If a functi
76f0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  on.  ** is being
7700: 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65   overridden/dele
7710: 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72  ted but there ar
7720: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
7730: 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20   allow the.  ** 
7740: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  operation to con
7750: 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69  tinue but invali
7760: 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70  date all precomp
7770: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
7780: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
7790: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
77a0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
77b0: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
77c0: 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69  (u8)enc, 0);.  i
77d0: 66 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66  f( p && p->iPref
77e0: 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e  Enc==enc && p->n
77f0: 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20  Arg==nArg ){.   
7800: 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65 56   if( db->activeV
7810: 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20 20  dbeCnt ){.      
7820: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
7830: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
7840: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
7850: 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
7860: 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75  user-function du
7870: 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
7880: 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
7890: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
78a0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
78b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
78c0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
78d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
78e0: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
78f0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
7900: 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71   }.  }..  p = sq
7910: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
7920: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
7930: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
7940: 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20  , (u8)enc, 1);. 
7950: 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d   assert(p || db-
7960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a  >mallocFailed);.
7970: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
7980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
7990: 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
79a0: 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69  f an older versi
79b0: 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  on of the functi
79c0: 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67  on with a config
79d0: 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20  ured destructor 
79e0: 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  is.  ** being re
79f0: 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68  placed invoke th
7a00: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e  e destructor fun
7a10: 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20  ction here. */. 
7a20: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
7a30: 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20  (db, p);..  if( 
7a40: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
7a50: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
7a60: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d  nRef++;.  }.  p-
7a70: 3e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  >pDestructor = p
7a80: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d  Destructor;.  p-
7a90: 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d  >flags = 0;.  p-
7aa0: 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a  >xFunc = xFunc;.
7ab0: 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74    p->xStep = xSt
7ac0: 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69  ep;.  p->xFinali
7ad0: 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70  ze = xFinal;.  p
7ae0: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 55  ->pUserData = pU
7af0: 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41  serData;.  p->nA
7b00: 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a  rg = (u16)nArg;.
7b10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7b20: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
7b30: 61 74 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e  ate new user fun
7b40: 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ctions..*/.int s
7b50: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
7b60: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
7b70: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
7b80: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
7b90: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
7ba0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
7bb0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
7bc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
7bd0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
7be0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
7bf0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
7c00: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
7c10: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
7c20: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
7c30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
7c40: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
7c50: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
7c60: 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e  tion_v2(db, zFun
7c70: 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c  c, nArg, enc, p,
7c80: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20   xFunc, xStep,. 
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d     xFinal, 0);.}
7cc0: 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  ..int sqlite3_cr
7cd0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
7ce0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
7cf0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7d00: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
7d10: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
7d20: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
7d30: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
7d40: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
7d50: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
7d60: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
7d70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
7d80: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
7d90: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
7da0: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
7db0: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
7dc0: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
7dd0: 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  oid *).){.  int 
7de0: 72 63 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75  rc;.  FuncDestru
7df0: 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a  ctor *pArg = 0;.
7e00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7e10: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
7e20: 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f 79  ;.  if( xDestroy
7e30: 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28   ){.    pArg = (
7e40: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
7e50: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
7e60: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
7e70: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29  FuncDestructor))
7e80: 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72 67 20  ;.    if( !pArg 
7e90: 29 7b 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f  ){.      xDestro
7ea0: 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  y(p);.      goto
7eb0: 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20   out;.    }.    
7ec0: 70 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d  pArg->xDestroy =
7ed0: 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70   xDestroy;.    p
7ee0: 41 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d  Arg->pUserData =
7ef0: 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   p;.  }.  rc = s
7f00: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
7f10: 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67  (db, zFunc, nArg
7f20: 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c  , enc, p, xFunc,
7f30: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
7f40: 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72  pArg);.  if( pAr
7f50: 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d  g && pArg->nRef=
7f60: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7f70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7f80: 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28  );.    xDestroy(
7f90: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
7fa0: 62 46 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b  bFree(db, pArg);
7fb0: 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63  .  }.. out:.  rc
7fc0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
7fd0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
7fe0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
7ff0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
8000: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
8010: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8020: 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74  _UTF16.int sqlit
8030: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8040: 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  on16(.  sqlite3 
8050: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db,.  const voi
8060: 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  d *zFunctionName
8070: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
8080: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
8090: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
80a0: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
80b0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
80c0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
80d0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
80e0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
80f0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
8100: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
8110: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
8120: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69  context*).){.  i
8130: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
8140: 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33  Func8;.  sqlite3
8150: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
8160: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
8170: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
8180: 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38  iled );.  zFunc8
8190: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
81a0: 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  o8(db, zFunction
81b0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
81c0: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
81d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
81e0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
81f0: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
8200: 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  ep, p, xFunc, xS
8210: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a  tep, xFinal,0);.
8220: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8230: 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72  db, zFunc8);.  r
8240: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
8250: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
8260: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
8270: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
8280: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
8290: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  dif.../*.** Decl
82a0: 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74  are that a funct
82b0: 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ion has been ove
82c0: 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72  rloaded by a vir
82d0: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
82e0: 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f  * If the functio
82f0: 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  n already exists
8300: 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c   as a regular gl
8310: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74  obal function, t
8320: 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
8330: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
8340: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
8350: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
8360: 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20   then create.** 
8370: 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61  a new one that a
8380: 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72  lways throws a r
8390: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20  un-time error.  
83a0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74  .**.** When virt
83b0: 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e  ual tables inten
83c0: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  d to provide an 
83d0: 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74  overloaded funct
83e0: 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f  ion, they.** sho
83f0: 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  uld call this ro
8400: 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75  utine to make su
8410: 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75  re the global fu
8420: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a  nction exists..*
8430: 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  * A global funct
8440: 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69  ion must exist i
8450: 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65  n order for name
8460: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77   resolution to w
8470: 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e  ork.** properly.
8480: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8490: 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
84a0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
84b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
84c0: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  zName,.  int nAr
84d0: 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  g.){.  int nName
84e0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
84f0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74  30(zName);.  int
8500: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
8510: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
8520: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
8530: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
8540: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  (db, zName, nNam
8550: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
8560: 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  UTF8, 0)==0 ){. 
8570: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
8580: 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  Func(db, zName, 
8590: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
85a0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
85b0: 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69           0, sqli
85c0: 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69  te3InvalidFuncti
85d0: 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  on, 0, 0, 0);.  
85e0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
85f0: 41 70 69 45 78 69 74 28 64 62 2c 20 53 51 4c 49  ApiExit(db, SQLI
8600: 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65  TE_OK);.  sqlite
8610: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
8620: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
8630: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
8640: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
8650: 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ACE./*.** Regist
8660: 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74  er a trace funct
8670: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
8680: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
8690: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72  ly registered tr
86a0: 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ace.** is return
86b0: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
86c0: 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f  LL trace functio
86d0: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
86e0: 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75  tracing is execu
86f0: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
8700: 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70  .** trace is a p
8710: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
8720: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
8730: 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72  oked at the star
8740: 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c  t of each.** SQL
8750: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
8760: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61  oid *sqlite3_tra
8770: 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ce(sqlite3 *db, 
8780: 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28 76  void (*xTrace)(v
8790: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
87a0: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
87b0: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
87c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
87d0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
87e0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72    pOld = db->pTr
87f0: 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54  aceArg;.  db->xT
8800: 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20  race = xTrace;. 
8810: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
8820: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
8830: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8840: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
8850: 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  n pOld;.}./*.** 
8860: 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69  Register a profi
8870: 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  le function.  Th
8880: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
8890: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
88a0: 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c  tered .** profil
88b0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  e function is re
88c0: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
88d0: 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66  A NULL profile f
88e0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
88f0: 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20  at no profiling 
8900: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
8910: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66  non-NULL.** prof
8920: 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ile is a pointer
8930: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
8940: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
8950: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
8960: 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20   of.** each SQL 
8970: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
8980: 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  s run..*/.void *
8990: 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
89a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
89b0: 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c    void (*xProfil
89c0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
89d0: 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74  har*,sqlite_uint
89e0: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
89f0: 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  g.){.  void *pOl
8a00: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  d;.  sqlite3_mut
8a10: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
8a20: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
8a30: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20  ->pProfileArg;. 
8a40: 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20   db->xProfile = 
8a50: 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e  xProfile;.  db->
8a60: 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41  pProfileArg = pA
8a70: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
8a80: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
8a90: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
8aa0: 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Old;.}.#endif /*
8ab0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
8ac0: 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 20 45 58 50 45  CE */../*** EXPE
8ad0: 52 49 4d 45 4e 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a  RIMENTAL ***.**.
8ae0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75  ** Register a fu
8af0: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
8b00: 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  oked when a tran
8b10: 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73  saction comments
8b20: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f  ..** If the invo
8b30: 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ked function ret
8b40: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
8b50: 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62  hen the commit b
8b60: 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c  ecomes a.** roll
8b70: 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  back..*/.void *s
8b80: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
8b90: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
8ba0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
8bb0: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
8bc0: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
8bd0: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ase */.  int (*x
8be0: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
8bf0: 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ,  /* Function t
8c00: 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68  o invoke on each
8c10: 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69   commit */.  voi
8c20: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
8c30: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
8c40: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
8c50: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
8c60: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
8c70: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
8c80: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
8c90: 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  = db->pCommitArg
8ca0: 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  ;.  db->xCommitC
8cb0: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
8cc0: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d  ack;.  db->pComm
8cd0: 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  itArg = pArg;.  
8ce0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8cf0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8d00: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
8d10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
8d20: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
8d30: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
8d40: 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64  ime a row is upd
8d50: 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65  ated,.** inserte
8d60: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69  d or deleted usi
8d70: 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65  ng this database
8d80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
8d90: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70  void *sqlite3_up
8da0: 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  date_hook(.  sql
8db0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
8dc0: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
8dd0: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
8de0: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
8df0: 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
8e00: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72  )(void*,int,char
8e10: 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f   const *,char co
8e20: 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74  nst *,sqlite_int
8e30: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
8e40: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
8e50: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
8e60: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
8e70: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
8e80: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8e90: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8ea0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
8eb0: 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62  pUpdateArg;.  db
8ec0: 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
8ed0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
8ee0: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20   db->pUpdateArg 
8ef0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
8f00: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
8f10: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
8f20: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
8f30: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
8f40: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
8f50: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
8f60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
8f70: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79  olled.** back by
8f80: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
8f90: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
8fa0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c  id *sqlite3_roll
8fb0: 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  back_hook(.  sql
8fc0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
8fd0: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
8fe0: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
8ff0: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
9000: 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
9010: 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c  )(void*), /* Cal
9020: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
9030: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9050: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
9060: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
9070: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
9080: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9090: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
90a0: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f    pRet = db->pRo
90b0: 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d  llbackArg;.  db-
90c0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
90d0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
90e0: 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41    db->pRollbackA
90f0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
9100: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9110: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9120: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
9130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9140: 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65  IT_WAL./*.** The
9150: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
9160: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67  k() callback reg
9170: 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74  istered by sqlit
9180: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
9190: 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f  point()..** Invo
91a0: 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  ke sqlite3_wal_c
91b0: 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
91c0: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
91d0: 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  s in the log fil
91e0: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
91f0: 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61  than sqlite3.pWa
9200: 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20  lArg cast to an 
9210: 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c  integer (the val
9220: 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ue configured by
9230: 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  .** wal_autochec
9240: 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69  kpoint())..*/ .i
9250: 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  nt sqlite3WalDef
9260: 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64  aultHook(.  void
9270: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20   *pClientData,  
9280: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a     /* Argument *
9290: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
92a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
92b0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  nnection */.  co
92c0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
92d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
92e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65   */.  int nFrame
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9300: 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29  Size of WAL */.)
9310: 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d  {.  if( nFrame>=
9320: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
9330: 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29  T(pClientData) )
9340: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
9350: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
9360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  ;.    sqlite3_wa
9370: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  l_checkpoint(db,
9380: 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   zDb);.    sqlit
9390: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
93a0: 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  c();.  }.  retur
93b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
93c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
93d0: 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
93e0: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20  ** Configure an 
93f0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
9400: 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61  () callback to a
9410: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65  utomatically che
9420: 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74  ckpoint.** a dat
9430: 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d  abase after comm
9440: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
9450: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
9460: 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d  e nFrame or.** m
9470: 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68  ore frames in th
9480: 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73  e log file. Pass
9490: 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65  ing zero or a ne
94a0: 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20  gative value as 
94b0: 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61  the.** nFrame pa
94c0: 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73  rameter disables
94d0: 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
94e0: 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e  points entirely.
94f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62  .**.** The callb
9500: 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62  ack registered b
9510: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
9520: 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69  replaces any exi
9530: 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a  sting callback.*
9540: 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69  * registered usi
9550: 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
9560: 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c  ook(). Likewise,
9570: 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63   registering a c
9580: 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  allback.** using
9590: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
95a0: 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65  k() disables the
95b0: 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b   automatic check
95c0: 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a  point mechanism.
95d0: 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
95e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
95f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
9600: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
9610: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
9620: 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 6e  nt nFrame){.#ifn
9630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9640: 57 41 4c 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  WAL.  if( nFrame
9650: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
9660: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73  3_wal_hook(db, s
9670: 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
9680: 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54  Hook, SQLITE_INT
9690: 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29  _TO_PTR(nFrame))
96a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
96b0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
96c0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23  db, 0, 0);.  }.#
96d0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
96e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
96f0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
9700: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
9710: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
9720: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
9730: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
9740: 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d  the write-ahead-
9750: 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61  log by this data
9760: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
9770: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
9780: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71  3_wal_hook(.  sq
9790: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
97a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
97b0: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
97c0: 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64   to this db hand
97d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61  le */.  int(*xCa
97e0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20  llback)(void *, 
97f0: 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20  sqlite3*, const 
9800: 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76  char*, int),.  v
9810: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9830: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
9840: 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c   passed to xCall
9850: 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66  back() */.){.#if
9860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9870: 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65  _WAL.  void *pRe
9880: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
9890: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
98a0: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
98b0: 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d  ->pWalArg;.  db-
98c0: 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20  >xWalCallback = 
98d0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
98e0: 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b  >pWalArg = pArg;
98f0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9900: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
9920: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
9930: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f   0;.#endif.}.../
9940: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
9950: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
9960: 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
9970: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
9980: 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
9990: 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
99a0: 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
99b0: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
99c0: 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
99d0: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
99e0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
99f0: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
9a00: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
9a10: 72 20 2a 7a 44 62 29 7b 0a 23 69 66 64 65 66 20  r *zDb){.#ifdef 
9a20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
9a30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9a40: 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  OK;.#else.  int 
9a50: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9a70: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9a80: 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45  int iDb = SQLITE
9a90: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20  _MAX_ATTACHED;  
9aa0: 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d  /* sqlite3.aDb[]
9ab0: 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20   index of db to 
9ac0: 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20  checkpoint */.. 
9ad0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
9ae0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
9af0: 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44  .  if( zDb && zD
9b00: 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20  b[0] ){.    iDb 
9b10: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
9b20: 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
9b30: 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b  }.  if( iDb<0 ){
9b40: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9b50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
9b60: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
9b70: 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e  ITE_ERROR, "unkn
9b80: 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73  own database: %s
9b90: 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65  ", zDb);.  }else
9ba0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
9bb0: 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
9bc0: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
9bd0: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
9be0: 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  0);.  }.  rc = s
9bf0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
9c00: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
9c10: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
9c20: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
9c30: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
9c40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
9c50: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75  MIT_WAL./*.** Ru
9c60: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f  n a checkpoint o
9c70: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
9c80: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
9c90: 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  if database iDb 
9ca0: 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e  is.** not curren
9cb0: 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20  tly open in WAL 
9cc0: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  mode..**.** If a
9cd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
9ce0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
9cf0: 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b  base being check
9d00: 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a  pointed, this .*
9d10: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
9d20: 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ns SQLITE_LOCKED
9d30: 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e   and a checkpoin
9d40: 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  t is not attempt
9d50: 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  ed. If .** an er
9d60: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
9d70: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65   running the che
9d80: 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69  ckpoint, an SQLi
9d90: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
9da0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69   .** returned (i
9db0: 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .e. SQLITE_IOERR
9dc0: 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ). Otherwise, SQ
9dd0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
9de0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
9df0: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73  base handle db s
9e00: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79  hould be held by
9e10: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65   the caller. The
9e20: 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69   mutex.** associ
9e30: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ated with the sp
9e40: 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65  ecific b-tree be
9e50: 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
9e60: 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20   is taken by.** 
9e70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68  this function wh
9e80: 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
9e90: 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a  nt is running..*
9ea0: 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70  *.** If iDb is p
9eb0: 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  assed SQLITE_MAX
9ec0: 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20  _ATTACHED, then 
9ed0: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
9ee0: 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68  abases are.** ch
9ef0: 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61  eckpointed. If a
9f00: 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
9f10: 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74  ntered it is ret
9f20: 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
9f30: 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70  y -.** no attemp
9f40: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65  t is made to che
9f50: 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61  ckpoint any rema
9f60: 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e  ining databases.
9f70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
9f80: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
9f90: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
9fa0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
9fb0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
9fc0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
9fd0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
a000: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
a010: 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a  h attached dbs *
a020: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
a030: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
a040: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
a050: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
a060: 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  nDb && rc==SQLIT
a070: 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
a080: 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44  if( i==iDb || iD
a090: 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  b==SQLITE_MAX_AT
a0a0: 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20  TACHED ){.      
a0b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
a0c0: 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e  eCheckpoint(db->
a0d0: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
a0e0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
a0f0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
a100: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
a110: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
a120: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
a130: 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65   true if main-me
a140: 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mory should be u
a150: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  sed instead of.*
a160: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
a170: 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  le for transient
a180: 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64   pager files and
a190: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
a1a0: 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  als..** The valu
a1b0: 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e  e returned depen
a1c0: 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
a1d0: 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  of db->temp_stor
a1e0: 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61  e (runtime.** pa
a1f0: 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65  rameter) and the
a200: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
a210: 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45  lue of SQLITE_TE
a220: 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a  MP_STORE. The.**
a230: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
a240: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
a250: 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
a260: 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61  een these two va
a270: 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73  lues.** and this
a280: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
a290: 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  n value..**.**  
a2a0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
a2b0: 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
a2c0: 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
a2d0: 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
a2e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
a2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
a300: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
a310: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
a320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a330: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
a360: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
a370: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a390: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
a3a0: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
a3b0: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
a3c0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
a3d0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
a3e0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
a3f0: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
a400: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
a410: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
a430: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
a440: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a470: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
a480: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
a4b0: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
a4c0: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20  turn 1).**   2  
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4e0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
a4f0: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
a500: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
a510: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
a520: 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
a530: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
a540: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f     (return 1).*/
a550: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70  .int sqlite3Temp
a560: 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73  InMemory(const s
a570: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
a580: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
a590: 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28  RE==1.  return (
a5a0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
a5b0: 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =2 );.#endif.#if
a5c0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
a5d0: 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28  RE==2.  return (
a5e0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
a5f0: 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =1 );.#endif.#if
a600: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
a610: 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31  RE==3.  return 1
a620: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
a630: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31  ITE_TEMP_STORE<1
a640: 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   || SQLITE_TEMP_
a650: 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e  STORE>3.  return
a660: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
a670: 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38  .** Return UTF-8
a680: 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
a690: 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
a6a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
a6b0: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
a6c0: 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
a6d0: 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
a6e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
a6f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
a700: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
a710: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
a720: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
a730: 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  EM);.  }.  if( !
a740: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
a750: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
a760: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
a770: 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
a780: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a  E_MISUSE_BKPT);.
a790: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
a7a0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
a7b0: 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
a7c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
a7d0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
a7e0: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
a7f0: 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EM);.  }else{.  
a800: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c    z = (char*)sql
a810: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
a820: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61  db->pErr);.    a
a830: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
a840: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a850: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
a860: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
a870: 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
a880: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
a890: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a8a0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a8b0: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
a8c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a8d0: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74  _UTF16./*.** Ret
a8e0: 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64  urn UTF-16 encod
a8f0: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
a900: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
a910: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
a920: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
a930: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
a940: 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c  te3_errmsg16(sql
a950: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61  ite3 *db){.  sta
a960: 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75  tic const u16 ou
a970: 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20  tOfMem[] = {.   
a980: 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
a990: 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27  ' ', 'o', 'f', '
a9a0: 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d   ', 'm', 'e', 'm
a9b0: 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27  ', 'o', 'r', 'y'
a9c0: 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  , 0.  };.  stati
a9d0: 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75  c const u16 misu
a9e0: 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27  se[] = {.    'l'
a9f0: 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c  , 'i', 'b', 'r',
aa00: 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'a', 'r', 'y', 
aa10: 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27  ' ', .    'r', '
aa20: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69  o', 'u', 't', 'i
aa30: 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27  ', 'n', 'e', ' '
aa40: 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c  , .    'c', 'a',
aa50: 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20   'l', 'l', 'e', 
aa60: 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'd', ' ', .    '
aa70: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
aa80: 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27  ', .    'o', 'f'
aa90: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c  , ' ', .    's',
aaa0: 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20   'e', 'q', 'u', 
aab0: 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27  'e', 'n', 'c', '
aac0: 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f  e', 0.  };..  co
aad0: 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69  nst void *z;.  i
aae0: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
aaf0: 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74  turn (void *)out
ab00: 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  OfMem;.  }.  if(
ab10: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
ab20: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
ab30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
ab40: 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20  void *)misuse;. 
ab50: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
ab60: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ab70: 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
ab80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ab90: 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f     z = (void *)o
aba0: 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65  utOfMem;.  }else
abb0: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
abc0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
abd0: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66  b->pErr);.    if
abe0: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
abf0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
ac00: 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
ac10: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
ac20: 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20  b->errCode),.   
ac30: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
ac40: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
ac50: 49 43 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73  IC);.      z = s
ac60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
ac70: 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  t16(db->pErr);. 
ac80: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61     }.    /* A ma
ac90: 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20  lloc() may have 
aca0: 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68  failed within th
acb0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
acc0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
acd0: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49  .    ** above. I
ace0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
acf0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d  se, then the db-
ad00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
ad10: 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  ag needs to.    
ad20: 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65  ** be cleared be
ad30: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
ad40: 44 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79  Do this directly
ad50: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61  , instead of via
ad60: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41  .    ** sqlite3A
ad70: 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f  piExit(), to avo
ad80: 69 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64  id setting the d
ad90: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65  atabase handle e
ada0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20  rror message..  
adb0: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
adc0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
add0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
ade0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
adf0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
ae00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
ae10: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
ae20: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
ae30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
ae40: 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72  error code gener
ae50: 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74  ated by an SQLit
ae60: 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55  e routine. If NU
ae70: 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20  LL is.** passed 
ae80: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
ae90: 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61  , we assume a ma
aea0: 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75  lloc() failed du
aeb0: 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65  ring sqlite3_ope
aec0: 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
aed0: 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69  te3_errcode(sqli
aee0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
aef0: 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61  db && !sqlite3Sa
af00: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
af10: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
af20: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
af30: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  E_BKPT;.  }.  if
af40: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
af50: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
af60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
af70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
af80: 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26  rn db->errCode &
af90: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
afa0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
afb0: 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c  nded_errcode(sql
afc0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
afd0: 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
afe0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
aff0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
b000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
b010: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  SE_BKPT;.  }.  i
b020: 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61  f( !db || db->ma
b030: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
b040: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b050: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
b060: 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b  urn db->errCode;
b070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
b080: 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67   a new collating
b090: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61   function for da
b0a0: 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68  tabase "db".  Th
b0b0: 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a  e name is zName.
b0c0: 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64  ** and the encod
b0d0: 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73  ing is enc..*/.s
b0e0: 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
b0f0: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  Collation(.  sql
b100: 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73  ite3* db,.  cons
b110: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
b120: 20 20 75 38 20 65 6e 63 2c 0a 20 20 75 38 20 63    u8 enc,.  u8 c
b130: 6f 6c 6c 54 79 70 65 2c 0a 20 20 76 6f 69 64 2a  ollType,.  void*
b140: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
b150: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
b160: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
b170: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
b180: 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
b190: 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  id*).){.  CollSe
b1a0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
b1b0: 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  enc2;.  int nNam
b1c0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
b1d0: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20  n30(zName);.  . 
b1e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b1f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
b200: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
b210: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
b220: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
b230: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
b240: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
b250: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
b260: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
b270: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
b280: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
b290: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
b2a0: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
b2b0: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
b2c0: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
b2d0: 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
b2e0: 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  c;.  testcase( e
b2f0: 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
b300: 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
b310: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
b320: 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20  F16_ALIGNED );. 
b330: 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54   if( enc2==SQLIT
b340: 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d  E_UTF16 || enc2=
b350: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
b360: 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63  IGNED ){.    enc
b370: 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
b380: 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
b390: 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54  ( enc2<SQLITE_UT
b3a0: 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54  F8 || enc2>SQLIT
b3b0: 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
b3c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
b3d0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
b3e0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
b3f0: 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f  his call is remo
b400: 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e  ving or replacin
b410: 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f  g an existing co
b420: 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65  llation .  ** se
b430: 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61  quence. If so, a
b440: 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
b450: 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20  ive VMs, return 
b460: 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20  busy. If there. 
b470: 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76   ** are no activ
b480: 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74  e VMs, invalidat
b490: 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c  e any pre-compil
b4a0: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
b4b0: 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   */.  pColl = sq
b4c0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
b4d0: 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
b4e0: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
b4f0: 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
b500: 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20  xCmp ){.    if( 
b510: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
b520: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
b530: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
b540: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
b550: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
b560: 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
b570: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
b580: 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
b590: 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
b5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
b5b0: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
b5c0: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
b5d0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
b5e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f  );..    /* If co
b5f0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b600: 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74   pColl was creat
b610: 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61  ed directly by a
b620: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
b630: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
b640: 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f  ollation, and no
b650: 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73  t generated by s
b660: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20  ynthCollSeq(),. 
b670: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63     ** then any c
b680: 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79  opies made by sy
b690: 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65  nthCollSeq() nee
b6a0: 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61  d to be invalida
b6b0: 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  ted..    ** Also
b6c0: 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74  , collation dest
b6d0: 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71  ructor - CollSeq
b6e0: 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69  .xDel() - functi
b6f0: 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  on may need.    
b700: 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e  ** to be called.
b710: 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28  .    */ .    if(
b720: 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e   (pColl->enc & ~
b730: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
b740: 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20  GNED)==enc2 ){. 
b750: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43       CollSeq *aC
b760: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
b770: 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
b780: 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  Seq, zName, nNam
b790: 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  e);.      int j;
b7a0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
b7b0: 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<3; j++){.     
b7c0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20     CollSeq *p = 
b7d0: 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  &aColl[j];.     
b7e0: 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70     if( p->enc==p
b7f0: 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
b800: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44         if( p->xD
b810: 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  el ){.          
b820: 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73    p->xDel(p->pUs
b830: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
b840: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43  .          p->xC
b850: 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mp = 0;.        
b860: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b870: 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    }..  pColl = s
b880: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
b890: 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
b8a0: 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28  zName, 1);.  if(
b8b0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43   pColl ){.    pC
b8c0: 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
b8d0: 70 61 72 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d  pare;.    pColl-
b8e0: 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20  >pUser = pCtx;. 
b8f0: 20 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d     pColl->xDel =
b900: 20 78 44 65 6c 3b 0a 20 20 20 20 70 43 6f 6c 6c   xDel;.    pColl
b910: 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
b920: 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
b930: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
b940: 29 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79  );.    pColl->ty
b950: 70 65 20 3d 20 63 6f 6c 6c 54 79 70 65 3b 0a 20  pe = collType;. 
b960: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
b970: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
b980: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
b990: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
b9a0: 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65  ** This array de
b9b0: 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72  fines hard upper
b9c0: 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74   bounds on limit
b9d0: 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a   values.  The.**
b9e0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73   initializer mus
b9f0: 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e  t be kept in syn
ba00: 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  c with the SQLIT
ba10: 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65  E_LIMIT_*.** #de
ba20: 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33  fines in sqlite3
ba30: 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  .h..*/.static co
ba40: 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d  nst int aHardLim
ba50: 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54  it[] = {.  SQLIT
ba60: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20  E_MAX_LENGTH,.  
ba70: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
ba80: 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
ba90: 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51  MAX_COLUMN,.  SQ
baa0: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
bab0: 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
bac0: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
bad0: 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  T,.  SQLITE_MAX_
bae0: 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54  VDBE_OP,.  SQLIT
baf0: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
bb00: 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  RG,.  SQLITE_MAX
bb10: 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c  _ATTACHED,.  SQL
bb20: 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
bb30: 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  TERN_LENGTH,.  S
bb40: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
bb50: 4c 45 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c  LE_NUMBER,.  SQL
bb60: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
bb70: 44 45 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  DEPTH,.};../*.**
bb80: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68   Make sure the h
bb90: 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73  ard limits are s
bba0: 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65  et to reasonable
bbb0: 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53   values.*/.#if S
bbc0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
bbd0: 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
bbe0: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d  ITE_MAX_LENGTH m
bbf0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
bc00: 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
bc10: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
bc20: 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
bc30: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
bc40: 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
bc50: 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
bc60: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
bc70: 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c  X_SQL_LENGTH>SQL
bc80: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
bc90: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
bca0: 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
bcb0: 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72  t not be greater
bcc0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58   than SQLITE_MAX
bcd0: 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23  _LENGTH.#endif.#
bce0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
bcf0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a  MPOUND_SELECT<2.
bd00: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
bd10: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
bd20: 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  CT must be at le
bd30: 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66  ast 2.#endif.#if
bd40: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
bd50: 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53  _OP<40.# error S
bd60: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
bd70: 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  P must be at lea
bd80: 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66  st 40.#endif.#if
bd90: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
bda0: 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51  TION_ARG<0 || SQ
bdb0: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
bdc0: 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72  N_ARG>1000.# err
bdd0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  or SQLITE_MAX_FU
bde0: 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20  NCTION_ARG must 
bdf0: 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
be00: 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66   1000.#endif.#if
be10: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
be20: 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45  CHED<0 || SQLITE
be30: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 33 30  _MAX_ATTACHED>30
be40: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
be50: 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73  MAX_ATTACHED mus
be60: 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
be70: 6e 64 20 33 30 0a 23 65 6e 64 69 66 0a 23 69 66  nd 30.#endif.#if
be80: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
be90: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c  _PATTERN_LENGTH<
bea0: 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
beb0: 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
bec0: 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  N_LENGTH must be
bed0: 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
bee0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
bef0: 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23  X_COLUMN>32767.#
bf00: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
bf10: 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f  X_COLUMN must no
bf20: 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23  t exceed 32767.#
bf30: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
bf40: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
bf50: 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
bf60: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
bf70: 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74  DEPTH must be at
bf80: 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
bf90: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
bfa0: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69  he value of a li
bfb0: 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65  mit.  Report the
bfc0: 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49   old value..** I
bfd0: 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d  f an invalid lim
bfe0: 69 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70  it index is supp
bff0: 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e  lied, report -1.
c000: 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
c010: 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65  ges but still re
c020: 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c  port the old val
c030: 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77  ue if the.** new
c040: 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69   limit is negati
c050: 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  ve..**.** A new 
c060: 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73  lower limit does
c070: 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73   not shrink exis
c080: 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e  ting constructs.
c090: 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72  .** It merely pr
c0a0: 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74  events new const
c0b0: 72 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65  ructs that excee
c0c0: 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66  d the limit.** f
c0d0: 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a  rom forming..*/.
c0e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  int sqlite3_limi
c0f0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
c100: 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20  nt limitId, int 
c110: 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74  newLimit){.  int
c120: 20 6f 6c 64 4c 69 6d 69 74 3b 0a 20 20 69 66 28   oldLimit;.  if(
c130: 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69   limitId<0 || li
c140: 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f  mitId>=SQLITE_N_
c150: 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74  LIMIT ){.    ret
c160: 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c  urn -1;.  }.  ol
c170: 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69  dLimit = db->aLi
c180: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20  mit[limitId];.  
c190: 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
c1a0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  ){.    if( newLi
c1b0: 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
c1c0: 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
c1d0: 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
c1e0: 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
c1f0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
c200: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d  Limit[limitId] =
c210: 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   newLimit;.  }. 
c220: 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74   return oldLimit
c230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
c240: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
c250: 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67   work of opening
c260: 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62   a database on b
c270: 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69  ehalf of.** sqli
c280: 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73  te3_open() and s
c290: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e  qlite3_open16().
c2a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
c2b0: 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d  lename "zFilenam
c2c0: 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38  e"  .** is UTF-8
c2d0: 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61   encoded..*/.sta
c2e0: 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61  tic int openData
c2f0: 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  base(.  const ch
c300: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f  ar *zFilename, /
c310: 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
c320: 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ame UTF-8 encode
c330: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
c340: 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a  *ppDb,        /*
c350: 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64   OUT: Returned d
c360: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
c370: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 6c 61  /.  unsigned fla
c380: 67 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  gs,        /* Op
c390: 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20  erational flags 
c3a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
c3b0: 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e  *zVfs       /* N
c3c0: 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
c3d0: 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  o use */.){.  sq
c3e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
c3f0: 20 72 63 3b 0a 20 20 69 6e 74 20 69 73 54 68 72   rc;.  int isThr
c400: 65 61 64 73 61 66 65 3b 0a 0a 20 20 2a 70 70 44  eadsafe;..  *ppD
c410: 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
c420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
c430: 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
c440: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
c450: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
c460: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
c470: 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   /* Only allow s
c480: 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
c490: 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
c4a0: 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
c4b0: 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
c4c0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
c4d0: 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
c4e0: 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
c4f0: 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
c500: 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
c510: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
c520: 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
c530: 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
c540: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
c550: 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
c560: 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
c570: 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
c580: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
c590: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
c5a0: 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
c5b0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
c5c0: 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
c5d0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
c5e0: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
c5f0: 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
c600: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
c610: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
c620: 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
c630: 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
c640: 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
c650: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
c660: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
c670: 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
c680: 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
c690: 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
c6a0: 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
c6b0: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
c6c0: 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
c6d0: 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
c6e0: 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
c6f0: 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
c700: 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
c710: 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
c720: 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
c730: 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
c740: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
c750: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 0a 20 20  LITE_MISUSE;..  
c760: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
c770: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
c780: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54  ex==0 ){.    isT
c790: 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
c7a0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
c7b0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e   & SQLITE_OPEN_N
c7c0: 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73  OMUTEX ){.    is
c7d0: 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
c7e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
c7f0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
c800: 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20  FULLMUTEX ){.   
c810: 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
c820: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
c830: 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73  isThreadsafe = s
c840: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
c850: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20  ig.bFullMutex;. 
c860: 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26   }.  if( flags &
c870: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
c880: 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20  VATECACHE ){.   
c890: 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
c8a0: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
c8b0: 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  HE;.  }else if( 
c8c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
c8d0: 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45  fig.sharedCacheE
c8e0: 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c  nabled ){.    fl
c8f0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
c900: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  EN_SHAREDCACHE;.
c910: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
c920: 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72   harmful bits fr
c930: 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  om the flags par
c940: 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a  ameter.  **.  **
c950: 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   The SQLITE_OPEN
c960: 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c  _NOMUTEX and SQL
c970: 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
c980: 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20  EX flags were.  
c990: 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e  ** dealt with in
c9a0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
c9b0: 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64  de block.  Besid
c9c0: 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e  es these, the on
c9d0: 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e  ly.  ** valid in
c9e0: 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71  put flags for sq
c9f0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20  lite3_open_v2() 
ca00: 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  are SQLITE_OPEN_
ca10: 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53  READONLY,.  ** S
ca20: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
ca30: 52 49 54 45 2c 20 61 6e 64 20 53 51 4c 49 54 45  RITE, and SQLITE
ca40: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2e 20 20 53  _OPEN_CREATE.  S
ca50: 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
ca60: 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
ca70: 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
ca80: 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
ca90: 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
caa0: 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
cab0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
cac0: 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
cae0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
caf0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
cb00: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
cb10: 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
cb20: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
cb30: 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
cb40: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
cb50: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
cb60: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
cb80: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
cb90: 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
cba0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
cbb0: 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
cbc0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
cbd0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
cbe0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
cc00: 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
cc10: 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
cc20: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
cc30: 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  ULLMUTEX |.     
cc40: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
cc50: 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20  _OPEN_WAL.      
cc60: 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20         );..  /* 
cc70: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
cc80: 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
cc90: 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
cca0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
ccb0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20  sizeof(sqlite3) 
ccc0: 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
ccd0: 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
cce0: 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64  ;.  if( isThread
ccf0: 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  safe ){.    db->
cd00: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
cd10: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
cd20: 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
cd30: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
cd40: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
cd50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
cd60: 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
cd70: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
cd80: 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
cd90: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
cda0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
cdb0: 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
cdc0: 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
cdd0: 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d  nDb = 2;.  db->m
cde0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
cdf0: 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e  GIC_BUSY;.  db->
ce00: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
ce10: 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tic;..  assert( 
ce20: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
ce30: 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
ce40: 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
ce50: 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
ce60: 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
ce70: 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
ce80: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
ce90: 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
cea0: 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
ceb0: 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
cec0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
ced0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
cee0: 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49  tColNames | SQLI
cef0: 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 69 66  TE_AutoIndex.#if
cf00: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
cf10: 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20  FILE_FORMAT<4.  
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
cf30: 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
cf40: 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66  leFmt.#endif.#if
cf50: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cf60: 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
cf70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf80: 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45    | SQLITE_LoadE
cf90: 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a  xtension.#endif.
cfa0: 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
cfb0: 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49  LT_RECURSIVE_TRI
cfc0: 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20  GGERS.          
cfd0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
cfe0: 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64  RecTriggers.#end
cff0: 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c  if.      ;.  sql
d000: 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62  ite3HashInit(&db
d010: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66  ->aCollSeq);.#if
d020: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d030: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
d040: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
d050: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23  &db->aModule);.#
d060: 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66  endif..  db->pVf
d070: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
d080: 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66  find(zVfs);.  if
d090: 28 20 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20  ( !db->pVfs ){. 
d0a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
d0b0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
d0c0: 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 22  3Error(db, rc, "
d0d0: 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22  no such vfs: %s"
d0e0: 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f 74  , zVfs);.    got
d0f0: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
d100: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
d110: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
d120: 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
d130: 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20  Y. BINARY works 
d140: 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20  for both UTF-8. 
d150: 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20   ** and UTF-16, 
d160: 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e  so add a version
d170: 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f   for each to avo
d180: 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61  id any unnecessa
d190: 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69  ry.  ** conversi
d1a0: 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72  ons. The only er
d1b0: 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63  ror that can occ
d1c0: 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c  ur here is a mal
d1d0: 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20  loc() failure.. 
d1e0: 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
d1f0: 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
d200: 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  Y", SQLITE_UTF8,
d210: 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e   SQLITE_COLL_BIN
d220: 41 52 59 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ARY, 0,.        
d230: 20 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c            binCol
d240: 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
d250: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
d260: 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
d270: 45 5f 55 54 46 31 36 42 45 2c 20 53 51 4c 49 54  E_UTF16BE, SQLIT
d280: 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 2c 20 30  E_COLL_BINARY, 0
d290: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d2a0: 20 20 20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c      binCollFunc,
d2b0: 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
d2c0: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
d2d0: 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  RY", SQLITE_UTF1
d2e0: 36 4c 45 2c 20 53 51 4c 49 54 45 5f 43 4f 4c 4c  6LE, SQLITE_COLL
d2f0: 5f 42 49 4e 41 52 59 2c 20 30 2c 0a 20 20 20 20  _BINARY, 0,.    
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69                bi
d310: 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
d320: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
d330: 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51  (db, "RTRIM", SQ
d340: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
d350: 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 28 76 6f  E_COLL_USER, (vo
d360: 69 64 2a 29 31 2c 0a 20 20 20 20 20 20 20 20 20  id*)1,.         
d370: 20 20 20 20 20 20 20 20 20 62 69 6e 43 6f 6c 6c           binColl
d380: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
d390: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d3a0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
d3b0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
d3c0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
d3d0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
d3e0: 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
d3f0: 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b  8, "BINARY", 0);
d400: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
d410: 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a  DfltColl!=0 );..
d420: 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20    /* Also add a 
d430: 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e  UTF-8 case-insen
d440: 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e  sitive collation
d450: 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20   sequence. */.  
d460: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
d470: 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51  db, "NOCASE", SQ
d480: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
d490: 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 2c 20 30  E_COLL_NOCASE, 0
d4a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d4b0: 20 20 20 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74      nocaseCollat
d4c0: 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20  ingFunc, 0);..  
d4d0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b  /* Open the back
d4e0: 65 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69  end database dri
d4f0: 76 65 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65  ver */.  db->ope
d500: 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  nFlags = flags;.
d510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
d520: 72 65 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  reeOpen(zFilenam
d530: 65 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b  e, db, &db->aDb[
d540: 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20  0].pBt, 0,.     
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54     flags | SQLIT
d570: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b  E_OPEN_MAIN_DB);
d580: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d590: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
d5a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
d5b0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
d5c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
d5d0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  M;.    }.    sql
d5e0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
d5f0: 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  , 0);.    goto o
d600: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
d610: 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68   db->aDb[0].pSch
d620: 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
d630: 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61  emaGet(db, db->a
d640: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62  Db[0].pBt);.  db
d650: 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
d660: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
d670: 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20  Get(db, 0);...  
d680: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  /* The default s
d690: 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20  afety_level for 
d6a0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
d6b0: 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72  e is 'full'; for
d6c0: 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64   the temp.  ** d
d6d0: 61 74 61 62 61 73 65 20 69 74 20 69 73 20 27 4e  atabase it is 'N
d6e0: 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68  ONE'. This match
d6f0: 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  es the pager lay
d700: 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20  er defaults.  . 
d710: 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d   */.  db->aDb[0]
d720: 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  .zName = "main";
d730: 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61  .  db->aDb[0].sa
d740: 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a  fety_level = 3;.
d750: 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61    db->aDb[1].zNa
d760: 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64  me = "temp";.  d
d770: 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79  b->aDb[1].safety
d780: 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64  _level = 1;..  d
d790: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
d7a0: 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20  E_MAGIC_OPEN;.  
d7b0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
d7c0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
d7d0: 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
d7e0: 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
d7f0: 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  all built-in fun
d800: 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e  ctions, but do n
d810: 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ot attempt to re
d820: 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ad the.  ** data
d830: 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e  base schema yet.
d840: 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64   This is delayed
d850: 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
d860: 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
d870: 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73  se.  ** is acces
d880: 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
d890: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
d8a0: 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71  ITE_OK, 0);.  sq
d8b0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69  lite3RegisterBui
d8c0: 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
d8d0: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75  );..  /* Load au
d8e0: 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f  tomatic extensio
d8f0: 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20  ns - extensions 
d900: 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72  that have been r
d910: 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75  egistered.  ** u
d920: 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
d930: 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e  _automatic_exten
d940: 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f  sion() API..  */
d950: 0a 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f  .  sqlite3AutoLo
d960: 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  adExtensions(db)
d970: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
d980: 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
d990: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d9a0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  K ){.    goto op
d9b0: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23  endb_out;.  }..#
d9c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d9d0: 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21  BLE_FTS1.  if( !
d9e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d9f0: 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
da00: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e  nt sqlite3Fts1In
da10: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
da20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
da30: 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s1Init(db);.  }.
da40: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
da50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
da60: 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  2.  if( !db->mal
da70: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
da80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
da90: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
daa0: 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c  ite3Fts2Init(sql
dab0: 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
dac0: 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
dad0: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
dae0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
daf0: 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66  ENABLE_FTS3.  if
db00: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
db10: 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
db20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
db30: 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
db40: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
db50: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
db60: 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28  ENABLE_ICU.  if(
db70: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
db80: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
db90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
dba0: 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64  sqlite3IcuInit(d
dbb0: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
dbc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
dbd0: 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28  ABLE_RTREE.  if(
dbe0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
dbf0: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
dc00: 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
dc10: 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28  qlite3RtreeInit(
dc20: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
dc30: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
dc40: 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f  db, rc, 0);..  /
dc50: 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
dc60: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
dc70: 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
dc80: 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
dc90: 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
dca0: 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
dcb0: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
dcc0: 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
dcd0: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
dce0: 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
dcf0: 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
dd00: 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
dd10: 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
dd20: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
dd30: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
dd40: 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
dd50: 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
dd60: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
dd70: 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
dd80: 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
dd90: 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
dda0: 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
ddb0: 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
dde0: 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
ddf0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
de00: 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69  able the lookasi
de10: 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  de-malloc subsys
de20: 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f  tem */.  setupLo
de30: 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73  okaside(db, 0, s
de40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
de50: 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a  ig.szLookaside,.
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
de80: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f  lobalConfig.nLoo
de90: 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69  kaside);..  sqli
dea0: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
deb0: 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54  kpoint(db, SQLIT
dec0: 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55  E_DEFAULT_WAL_AU
ded0: 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a  TOCHECKPOINT);..
dee0: 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66  opendb_out:.  if
def0: 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
df00: 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
df10: 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
df20: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  ==0 || sqlite3Gl
df30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
df40: 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
df50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
df60: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
df70: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
df80: 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
df90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dfa0: 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71  _NOMEM ){.    sq
dfb0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
dfc0: 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d  .    db = 0;.  }
dfd0: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
dfe0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62  ITE_OK ){.    db
dff0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
e000: 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d  _MAGIC_SICK;.  }
e010: 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 20  .  *ppDb = db;. 
e020: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41   return sqlite3A
e030: 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d  piExit(0, rc);.}
e040: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
e050: 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
e060: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
e070: 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  e3_open(.  const
e080: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
e090: 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
e0a0: 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e  pDb .){.  return
e0b0: 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
e0c0: 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20  ilename, ppDb,. 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
e0f0: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
e100: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
e110: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
e120: 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f  e3_open_v2(.  co
e130: 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  nst char *filena
e140: 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73  me,   /* Databas
e150: 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d  e filename (UTF-
e160: 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  8) */.  sqlite3 
e170: 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20  **ppDb,         
e180: 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64  /* OUT: SQLite d
e190: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
e1a0: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
e1b0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a        /* Flags *
e1c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e1d0: 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e  zVfs        /* N
e1e0: 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c  ame of VFS modul
e1f0: 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  e to use */.){. 
e200: 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
e210: 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70  base(filename, p
e220: 70 44 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73  pDb, flags, zVfs
e230: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
e240: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
e250: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
e260: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e270: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e280: 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74  _open16(.  const
e290: 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
e2a0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
e2b0: 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  pDb.){.  char co
e2c0: 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b  nst *zFilename8;
e2d0: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
e2e0: 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38  encoded in UTF-8
e2f0: 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d   instead of UTF-
e300: 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  16 */.  sqlite3_
e310: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
e320: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
e330: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  ( zFilename );. 
e340: 20 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b   assert( ppDb );
e350: 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
e360: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e370: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
e380: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
e390: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
e3a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
e3b0: 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71  ndif.  pVal = sq
e3c0: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
e3d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
e3e0: 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
e3f0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49   zFilename, SQLI
e400: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20  TE_UTF16NATIVE, 
e410: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
e420: 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73    zFilename8 = s
e430: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
e440: 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
e450: 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  8);.  if( zFilen
e460: 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
e470: 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
e480: 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a  ilename8, ppDb,.
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
e4b0: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
e4c0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
e4d0: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
e4e0: 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53  ( *ppDb || rc==S
e4f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
e500: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e510: 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72  E_OK && !DbHasPr
e520: 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c  operty(*ppDb, 0,
e530: 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64   DB_SchemaLoaded
e540: 29 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a  ) ){.      ENC(*
e550: 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
e560: 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
e570: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
e580: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
e590: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
e5a0: 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
e5b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
e5c0: 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
e5d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e5e0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
e5f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
e600: 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
e610: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
e620: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
e630: 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
e640: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
e650: 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
e660: 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
e670: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
e680: 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
e690: 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
e6a0: 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
e6b0: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
e6c0: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
e6d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
e6e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e6f0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e700: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
e710: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
e720: 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
e730: 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
e740: 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54 45   (u8)enc, SQLITE
e750: 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74 78  _COLL_USER, pCtx
e760: 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
e770: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
e780: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
e790: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
e7a0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
e7b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e7c0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
e7d0: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
e7e0: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
e7f0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
e800: 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
e810: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
e820: 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ation_v2(.  sqli
e830: 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
e840: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
e850: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
e860: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
e870: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
e880: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
e890: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
e8a0: 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
e8b0: 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74  (void*).){.  int
e8c0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
e8d0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
e8e0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
e8f0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
e900: 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
e910: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
e920: 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
e930: 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 55 53 45   SQLITE_COLL_USE
e940: 52 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  R, pCtx, xCompar
e950: 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d  e, xDel);.  rc =
e960: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e970: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
e980: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e990: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e9a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
e9b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
e9c0: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
e9d0: 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
e9e0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
e9f0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
ea00: 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
ea10: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
ea20: 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73  collation16(.  s
ea30: 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
ea40: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
ea50: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20  ,.  int enc, .  
ea60: 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
ea70: 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
ea80: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
ea90: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
eaa0: 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  d*).){.  int rc 
eab0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
eac0: 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73  har *zName8;.  s
ead0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
eae0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
eaf0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
eb00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
eb10: 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  zName8 = sqlite3
eb20: 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61  Utf16to8(db, zNa
eb30: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
eb40: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69  TF16NATIVE);.  i
eb50: 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20  f( zName8 ){.   
eb60: 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
eb70: 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38  ation(db, zName8
eb80: 2c 20 28 75 38 29 65 6e 63 2c 20 53 51 4c 49 54  , (u8)enc, SQLIT
eb90: 45 5f 43 4f 4c 4c 5f 55 53 45 52 2c 20 70 43 74  E_COLL_USER, pCt
eba0: 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
ebb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
ebc0: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
ebd0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
ebe0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
ebf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
ec00: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
ec10: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
ec20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
ec30: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
ec40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
ec50: 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
ec60: 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
ec70: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
ec80: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
ec90: 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
eca0: 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
ecb0: 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
ecc0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
ecd0: 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
ece0: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
ecf0: 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
ed00: 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
ed10: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
ed20: 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
ed30: 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
ed40: 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
ed50: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
ed60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ed70: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
ed80: 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
ed90: 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  eded = xCollNeed
eda0: 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ed;.  db->xCollN
edb0: 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64  eeded16 = 0;.  d
edc0: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
edd0: 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
ede0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
edf0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
ee00: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
ee10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
ee20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ee30: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
ee40: 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
ee50: 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
ee60: 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
ee70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
ee80: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
ee90: 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
eea0: 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
eeb0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
eec0: 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
eed0: 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
eee0: 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71  n_needed16(.  sq
eef0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
ef00: 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
ef10: 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
ef20: 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64  llNeeded16)(void
ef30: 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
ef40: 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f  TextRep,const vo
ef50: 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  id*).){.  sqlite
ef60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ef70: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
ef80: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b  xCollNeeded = 0;
ef90: 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
efa0: 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  ed16 = xCollNeed
efb0: 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c  ed16;.  db->pCol
efc0: 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
efd0: 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
efe0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
eff0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f010: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
f020: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
f030: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
f040: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
f050: 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  TED./*.** This f
f060: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61  unction is now a
f070: 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49  n anachronism. I
f080: 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65  t used to be use
f090: 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  d to recover fro
f0a0: 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20  m a.** malloc() 
f0b0: 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c  failure, but SQL
f0c0: 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69  ite now does thi
f0d0: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  s automatically.
f0e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
f0f0: 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76  global_recover(v
f100: 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  oid){.  return S
f110: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
f120: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  if../*.** Test t
f130: 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
f140: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
f150: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
f160: 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a  in autocommit.**
f170: 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54   mode.  Return T
f180: 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64  RUE if it is and
f190: 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20   FALSE if not.  
f1a0: 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  Autocommit mode 
f1b0: 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61  is on.** by defa
f1c0: 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  ult.  Autocommit
f1d0: 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20   is disabled by 
f1e0: 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
f1f0: 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a  t and reenabled.
f200: 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43  ** by the next C
f210: 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
f220: 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48  K..**.******* TH
f230: 49 53 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d  IS IS AN EXPERIM
f240: 45 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53  ENTAL API AND IS
f250: 20 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e   SUBJECT TO CHAN
f260: 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74  GE ******.*/.int
f270: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
f280: 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  ocommit(sqlite3 
f290: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
f2a0: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d  b->autoCommit;.}
f2b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
f2c0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
f2d0: 72 65 20 73 75 62 74 69 74 75 74 65 73 20 66 6f  re subtitutes fo
f2e0: 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
f2f0: 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
f300: 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
f310: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
f320: 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20  QLITE_IOERR and 
f330: 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
f340: 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
f350: 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 72 20  s.  They server 
f360: 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a  two purposes:.**
f370: 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20  .**   1.  Serve 
f380: 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  as a convenient 
f390: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
f3a0: 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64  reakpoint in a d
f3b0: 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20  ebugger.**      
f3c0: 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20   to detect when 
f3d0: 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f  version error co
f3e0: 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e  nditions occurs.
f3f0: 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76  .**.**   2.  Inv
f400: 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  oke sqlite3_log(
f410: 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  ) to provide the
f420: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63   source code loc
f430: 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20  ation where.**  
f440: 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c       a low-level
f450: 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20   error is first 
f460: 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74  detected..*/.int
f470: 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45   sqlite3CorruptE
f480: 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
f490: 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
f4a0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
f4b0: 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
f4c0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
f4d0: 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20  E_CORRUPT,.     
f4e0: 20 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61           "databa
f4f0: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74  se corruption at
f500: 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
f510: 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
f520: 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
f530: 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
f540: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
f550: 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69  ITE_CORRUPT;.}.i
f560: 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65  nt sqlite3Misuse
f570: 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
f580: 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
f590: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
f5a0: 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
f5b0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
f5c0: 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20  TE_MISUSE, .    
f5d0: 20 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73            "misus
f5e0: 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
f5f0: 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
f600: 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
f610: 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
f620: 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
f630: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
f640: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e  }.int sqlite3Can
f650: 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c  topenError(int l
f660: 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
f670: 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
f680: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
f690: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  );.  sqlite3_log
f6a0: 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
f6b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
f6c0: 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69   "cannot open fi
f6d0: 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  le at line %d of
f6e0: 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
f6f0: 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c           lineno,
f700: 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72   20+sqlite3_sour
f710: 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  ceid());.  retur
f720: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
f730: 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  N;.}...#ifndef S
f740: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
f750: 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
f760: 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
f770: 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
f780: 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
f790: 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
f7a0: 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
f7b0: 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
f7c0: 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
f7d0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
f7e0: 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
f7f0: 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
f800: 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
f810: 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
f820: 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
f830: 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
f840: 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
f850: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
f860: 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
f870: 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69  p(void){.}.#endi
f880: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
f890: 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
f8a0: 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69   about a specifi
f8b0: 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61  c column of a da
f8c0: 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a  tabase table..**
f8d0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20   See comment in 
f8e0: 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74  sqlite3.h (sqlit
f8f0: 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61  e.h.in) for deta
f900: 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ils..*/.#ifdef S
f910: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
f920: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74  UMN_METADATA.int
f930: 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
f940: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
f950: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f970: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
f980: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
f990: 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
f9a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
f9b0: 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
f9c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
f9d0: 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
f9e0: 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
f9f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
fa00: 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
fa10: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
fa20: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
fa30: 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
fa40: 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
fa50: 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
fa60: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
fa70: 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
fa80: 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
fa90: 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
faa0: 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
fab0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
fac0: 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
fad0: 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
fae0: 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
faf0: 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
fb00: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
fb10: 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
fb20: 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
fb30: 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
fb40: 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
fb50: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
fb60: 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
fb70: 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
fb80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
fb90: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
fba0: 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
fbb0: 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
fbc0: 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
fbd0: 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72  nt iCol;..  char
fbe0: 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70   const *zDataTyp
fbf0: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
fc00: 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20  nst *zCollSeq = 
fc10: 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  0;.  int notnull
fc20: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d   = 0;.  int prim
fc30: 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  arykey = 0;.  in
fc40: 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a  t autoinc = 0;..
fc50: 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
fc60: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
fc70: 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
fc80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
fc90: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
fca0: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
fcb0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
fcc0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
fcd0: 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
fce0: 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
fcf0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
fd00: 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
fd10: 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
fd20: 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
fd30: 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
fd40: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
fd50: 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
fd60: 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
fd70: 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
fd80: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
fd90: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
fda0: 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
fdb0: 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
fdc0: 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
fdd0: 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
fde0: 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ted */.  if( sql
fdf0: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
fe00: 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
fe10: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
fe20: 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ey;.    if( iCol
fe30: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  >=0 ){.      pCo
fe40: 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
fe50: 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  iCol];.    }.  }
fe60: 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
fe70: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
fe80: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
fe90: 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
fea0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
feb0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
fec0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
fed0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
fee0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
fef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ff00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
ff10: 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
ff20: 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 30  {.      pTab = 0
ff30: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72  ;.      goto err
ff40: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  or_out;.    }.  
ff50: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
ff60: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
ff70: 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
ff80: 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
ff90: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
ffa0: 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
ffb0: 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
ffc0: 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
ffd0: 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
ffe0: 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
fff0: 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
10000 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
10010 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
10020 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
10030 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
10040 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
10050 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
10060 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
10070 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
10080 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
10090 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
100a0 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
100b0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
100c0 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
100d0 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
100e0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
100f0 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
10100 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
10110 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
10120 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
10130 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
10140 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
10150 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
10160 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f   zDataType = pCo
10170 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43  l->zType;.    zC
10180 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
10190 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
101a0 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
101b0 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
101c0 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69 73  ykey  = pCol->is
101d0 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20 20  PrimKey!=0;.    
101e0 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e  autoinc = pTab->
101f0 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28  iPKey==iCol && (
10200 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
10210 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e   TF_Autoincremen
10220 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)!=0;.  }else{.
10230 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
10240 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70  "INTEGER";.    p
10250 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20  rimarykey = 1;. 
10260 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53   }.  if( !zCollS
10270 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53  eq ){.    zCollS
10280 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  eq = "BINARY";. 
10290 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20   }..error_out:. 
102a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
102b0 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a  veAll(db);..  /*
102c0 20 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e   Whether the fun
102d0 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65  ction call succe
102e0 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20  eded or failed, 
102f0 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
10300 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74  arameters.  ** t
10310 6f 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72  o whatever their
10320 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61   local counterpa
10330 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20  rts contain. If 
10340 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63  an error did occ
10350 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61  ur,.  ** this ha
10360 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
10370 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70  zeroing all outp
10380 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20  ut parameters.. 
10390 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61   */.  if( pzData
103a0 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79  Type ) *pzDataTy
103b0 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a  pe = zDataType;.
103c0 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20    if( pzCollSeq 
103d0 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a  ) *pzCollSeq = z
103e0 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70  CollSeq;.  if( p
103f0 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e  NotNull ) *pNotN
10400 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20  ull = notnull;. 
10410 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79   if( pPrimaryKey
10420 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20   ) *pPrimaryKey 
10430 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20  = primarykey;.  
10440 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a  if( pAutoinc ) *
10450 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69  pAutoinc = autoi
10460 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  nc;..  if( SQLIT
10470 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61  E_OK==rc && !pTa
10480 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
10490 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d  DbFree(db, zErrM
104a0 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67  sg);.    zErrMsg
104b0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
104c0 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74  f(db, "no such t
104d0 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e  able column: %s.
104e0 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c  %s", zTableName,
104f0 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e  .        zColumn
10500 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  Name);.    rc = 
10510 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
10520 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  }.  sqlite3Error
10530 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73  (db, rc, (zErrMs
10540 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d  g?"%s":0), zErrM
10550 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
10560 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
10570 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
10580 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
10590 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
105a0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
105b0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
105c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
105d0 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
105e0 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
105f0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
10600 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
10610 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65  int sqlite3_slee
10620 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c  p(int ms){.  sql
10630 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
10640 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73    int rc;.  pVfs
10650 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
10660 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56  ind(0);.  if( pV
10670 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  fs==0 ) return 0
10680 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
10690 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d  ction works in m
106a0 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74  illiseconds, but
106b0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
106c0 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20  OsSleep() .  ** 
106d0 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65  API uses microse
106e0 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65  conds. Hence the
106f0 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20   1000's..  */.  
10700 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53  rc = (sqlite3OsS
10710 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a  leep(pVfs, 1000*
10720 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74  ms)/1000);.  ret
10730 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10740 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
10750 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20  le the extended 
10760 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f  result codes..*/
10770 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
10780 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64  ended_result_cod
10790 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
107a0 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71  int onoff){.  sq
107b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
107c0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
107d0 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e  db->errMask = on
107e0 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66  off ? 0xffffffff
107f0 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74   : 0xff;.  sqlit
10800 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10810 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10830 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
10840 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  he xFileControl 
10850 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74  method on a part
10860 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e  icular database.
10870 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
10880 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c  file_control(sql
10890 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
108a0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69  char *zDbName, i
108b0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
108c0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
108d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69  QLITE_ERROR;.  i
108e0 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
108f0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10900 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
10910 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  zDbName==0 ){.  
10920 20 20 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c    iDb = 0;.  }el
10930 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d  se{.    for(iDb=
10940 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  0; iDb<db->nDb; 
10950 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  iDb++){.      if
10960 28 20 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62  ( strcmp(db->aDb
10970 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62  [iDb].zName, zDb
10980 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
10990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
109a0 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b  ( iDb<db->nDb ){
109b0 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 72  .    Btree *pBtr
109c0 65 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ee = db->aDb[iDb
109d0 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
109e0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50  Btree ){.      P
109f0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
10a00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
10a10 20 2a 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69   *fd;.      sqli
10a20 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
10a30 74 72 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61  tree);.      pPa
10a40 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
10a50 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b  eePager(pBtree);
10a60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10a70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
10a80 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61    fd = sqlite3Pa
10a90 67 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b  gerFile(pPager);
10aa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
10ab0 64 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  d!=0 );.      if
10ac0 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
10ad0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10ae0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
10af0 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
10b00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10b10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10b20 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  ve(pBtree);.    
10b30 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
10b40 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10b50 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10b60 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a   rc;   .}../*.**
10b70 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68   Interface to th
10b80 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e  e testing logic.
10b90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
10ba0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
10bb0 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74   op, ...){.  int
10bc0 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66   rc = 0;.#ifndef
10bd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
10be0 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c  LTIN_TEST.  va_l
10bf0 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
10c00 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
10c10 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
10c20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
10c30 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
10c40 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
10c50 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
10c60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
10c70 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
10c80 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
10c90 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
10ca0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
10cb0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
10cc0 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
10cd0 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
10ce0 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
10cf0 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
10d00 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
10d10 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
10d20 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
10d30 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
10d40 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
10d50 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
10d60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
10d70 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
10d80 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
10d90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
10da0 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
10db0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
10dc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
10dd0 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
10de0 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
10df0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
10e00 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
10e10 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
10e20 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
10e30 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
10e40 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
10e50 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
10e60 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
10e70 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
10e80 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
10e90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
10ea0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
10eb0 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
10ec0 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
10ed0 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20 20  ResetState();.  
10ee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10ef0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
10f00 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
10f10 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
10f20 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
10f30 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
10f40 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
10f50 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
10f60 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
10f70 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
10f80 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
10f90 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
10fa0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
10fb0 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
10fc0 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
10fd0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
10fe0 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
10ff0 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
11000 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
11010 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
11020 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
11030 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
11040 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
11050 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
11060 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
11070 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
11080 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
11090 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
110a0 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
110b0 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
110c0 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
110d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
110e0 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
110f0 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
11100 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
11110 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
11120 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
11130 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  l(BENIGN_MALLOC_
11140 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78  HOOKS, xBegin, x
11150 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  End).    **.    
11160 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b  ** Register hook
11170 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64  s to call to ind
11180 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c  icate which mall
11190 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20  oc() failures . 
111a0 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e     ** are benign
111b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
111c0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
111d0 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
111e0 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74  HOOKS: {.      t
111f0 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f  ypedef void (*vo
11200 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69  id_function)(voi
11210 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  d);.      void_f
11220 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42  unction xBenignB
11230 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64  egin;.      void
11240 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
11250 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e  nEnd;.      xBen
11260 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72  ignBegin = va_ar
11270 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
11280 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e  ion);.      xBen
11290 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28  ignEnd = va_arg(
112a0 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
112b0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
112c0 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f  3BenignMallocHoo
112d0 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c  ks(xBenignBegin,
112e0 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20   xBenignEnd);.  
112f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11300 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
11310 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
11320 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
11330 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
11340 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  TE, unsigned int
11350 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
11360 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e  * Set the PENDIN
11370 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61  G byte to the va
11380 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d  lue in the argum
11390 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20  ent, if X>0..   
113a0 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e   ** Make no chan
113b0 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65  ges if X==0.  Re
113c0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
113d0 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79  f the pending by
113e0 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20  te.    ** as it 
113f0 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20  existing before 
11400 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
11410 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a   called..    **.
11420 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54      ** IMPORTANT
11430 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  :  Changing the 
11440 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f  PENDING byte fro
11450 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73  m 0x40000000 res
11460 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61  ults in.    ** a
11470 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64  n incompatible d
11480 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
11490 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74  mat.  Changing t
114a0 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a  he PENDING byte.
114b0 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79      ** while any
114c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
114d0 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73  tion is open res
114e0 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65  ults in undefine
114f0 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c  d and.    ** dil
11500 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f  eterious behavio
11510 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
11520 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
11530 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a  RL_PENDING_BYTE:
11540 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45   {.      rc = PE
11550 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e  NDING_BYTE;.#ifn
11560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11570 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  WSD.      {.    
11580 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
11590 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67   newVal = va_arg
115a0 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
115b0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
115c0 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33  newVal ) sqlite3
115d0 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65  PendingByte = ne
115e0 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  wVal;.      }.#e
115f0 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
11600 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
11610 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
11620 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
11630 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
11640 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  ERT, int X).    
11650 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
11660 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
11670 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
11680 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
11690 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65   not.    ** asse
116a0 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64  rt() was enabled
116b0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
116c0 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
116d0 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20  and assert().   
116e0 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20   ** is enabled, 
116f0 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
11700 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20  value is true.  
11710 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64  If X is true and
11720 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
11730 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
11740 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
11750 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66  lue is zero.  If
11760 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c   X is.    ** fal
11770 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
11780 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
11790 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66   the assertion f
117a0 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20  ires and the.   
117b0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72   ** process abor
117c0 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c  ts.  If X is fal
117d0 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
117e0 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
117f0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74  n the.    ** ret
11800 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
11810 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  o..    */.    ca
11820 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
11830 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20  RL_ASSERT: {.   
11840 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20     volatile int 
11850 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  x = 0;.      ass
11860 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72 67  ert( (x = va_arg
11870 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a  (ap,int))!=0 );.
11880 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20        rc = x;.  
11890 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
118a0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
118b0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
118c0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
118d0 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69  STCTRL_ALWAYS, i
118e0 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
118f0 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
11900 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
11910 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
11920 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61  how the ALWAYS a
11930 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20  nd.    ** NEVER 
11940 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69  macros were defi
11950 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
11960 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ime..    **.    
11970 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
11980 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29  lue is ALWAYS(X)
11990 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
119a0 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65  * The recommende
119b0 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20  d test is X==2. 
119c0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
119d0 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74 20  alue is 2, that 
119e0 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57  means.    ** ALW
119f0 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28  AYS() and NEVER(
11a00 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70  ) are both no-op
11a10 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
11a20 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74  cros, which is t
11a30 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
11a40 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74  t setting.  If t
11a50 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
11a60 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59  is 1, then ALWAY
11a70 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20 20  S() is either.  
11a80 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20    ** hard-coded 
11a90 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20  to true or else 
11aa0 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69 74  it asserts if it
11ab0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  s argument is fa
11ac0 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  lse..    ** The 
11ad0 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20 28  first behavior (
11ae0 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
11af0 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  ue) is the case 
11b00 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
11b10 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
11b20 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
11b30 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
11b40 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a   and the second.
11b50 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20      ** behavior 
11b60 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20 61  (assert if the a
11b70 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59  rgument to ALWAY
11b80 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69 73  S() is false) is
11b90 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20   the case if.   
11ba0 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43   ** SQLITE_TESTC
11bb0 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73  TRL_ASSERT shows
11bc0 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69   that assert() i
11bd0 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a  s enabled..    *
11be0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e  *.    ** The run
11bf0 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65  -time test proce
11c00 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20  dure might look 
11c10 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74  something like t
11c20 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
11c30 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  **    if( sqlite
11c40 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
11c50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
11c60 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a  LWAYS, 2)==2 ){.
11c70 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
11c80 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
11c90 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61  R() are no-op pa
11ca0 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
11cb0 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  s.    **    }els
11cc0 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65  e if( sqlite3_te
11cd0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
11ce0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
11cf0 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20  T, 1) ){.    ** 
11d00 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
11d10 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20 78  ) asserts that x
11d20 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28   is true. NEVER(
11d30 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73 20  x) asserts x is 
11d40 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20  false..    **   
11d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20   }else{.    **  
11d60 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29      // ALWAYS(x)
11d70 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31   is a constant 1
11d80 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20 61  .  NEVER(x) is a
11d90 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20   constant 0..   
11da0 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a   **    }.    */.
11db0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
11dc0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a  TESTCTRL_ALWAYS:
11dd0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d   {.      int x =
11de0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
11df0 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41  .      rc = ALWA
11e00 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65  YS(x);.      bre
11e10 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
11e20 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
11e30 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
11e40 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
11e50 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
11e60 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
11e70 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73   ** Set the nRes
11e80 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66  erve size to N f
11e90 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
11ea0 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61  base on the data
11eb0 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e  base.    ** conn
11ec0 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a  ection db..    *
11ed0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
11ee0 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
11ef0 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
11f00 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
11f10 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
11f20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
11f30 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
11f40 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
11f50 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
11f60 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
11f70 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
11f80 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
11f90 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20  , 0, x, 0);.    
11fa0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11fb0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
11fc0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11fd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
11fe0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
11ff0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
12000 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
12010 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
12020 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
12030 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   ** Enable or di
12040 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70  sable various op
12050 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20  timizations for 
12060 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
12070 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61  .  The .    ** a
12080 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62  rgument N is a b
12090 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69  itmask of optimi
120a0 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69  zations to be di
120b0 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72  sabled.  For nor
120c0 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  mal.    ** opera
120d0 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65  tion N should be
120e0 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73   0.  The idea is
120f0 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f   that a test pro
12100 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20  gram (like the. 
12110 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20     ** SQL Logic 
12120 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74  Test or SLT test
12130 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e   module) can run
12140 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75   the same SQL mu
12150 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20  ltiple times.   
12160 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73   ** with various
12170 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64   optimizations d
12180 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66  isabled to verif
12190 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  y that the same 
121a0 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73  answer.    ** is
121b0 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65   obtained in eve
121c0 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  ry case..    */.
121d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
121e0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
121f0 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20  ATIONS: {.      
12200 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
12210 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
12220 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  *);.      int x 
12230 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
12240 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67  ;.      db->flag
12250 73 20 3d 20 28 78 20 26 20 53 51 4c 49 54 45 5f  s = (x & SQLITE_
12260 4f 70 74 4d 61 73 6b 29 20 7c 20 28 64 62 2d 3e  OptMask) | (db->
12270 66 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  flags & ~SQLITE_
12280 4f 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20  OptMask);.      
12290 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
122a0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  fdef SQLITE_N_KE
122b0 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c  YWORD.    /* sql
122c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
122d0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
122e0 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e  L_ISKEYWORD, con
122f0 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a  st char *zWord).
12300 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
12310 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77   zWord is a keyw
12320 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62  ord recognized b
12330 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  y the parser, th
12340 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20  en return the.  
12350 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b    ** number of k
12360 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20  eywords.  Or if 
12370 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b  zWord is not a k
12380 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30  eyword, return 0
12390 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
123a0 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75   This test featu
123b0 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  re is only avail
123c0 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c  able in the amal
123d0 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20  gamation since. 
123e0 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45     ** the SQLITE
123f0 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f  _N_KEYWORD macro
12400 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
12410 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20  in this file if 
12420 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73  SQLite.    ** is
12430 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70   built using sep
12440 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c  arate source fil
12450 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
12460 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
12470 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b  TRL_ISKEYWORD: {
12480 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
12490 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72  r *zWord = va_ar
124a0 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
124b0 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  *);.      int n 
124c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
124d0 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20  0(zWord);.      
124e0 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79  rc = (sqlite3Key
124f0 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57  wordCode((u8*)zW
12500 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20  ord, n)!=TK_ID) 
12510 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  ? SQLITE_N_KEYWO
12520 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72  RD : 0;.      br
12530 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
12540 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  f ..    /* sqlit
12550 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
12560 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
12570 50 47 48 44 52 53 5a 29 0a 20 20 20 20 2a 2a 0a  PGHDRSZ).    **.
12580 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 68      ** Return th
12590 65 20 73 69 7a 65 20 6f 66 20 61 20 70 63 61 63  e size of a pcac
125a0 68 65 20 68 65 61 64 65 72 20 69 6e 20 62 79 74  he header in byt
125b0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
125c0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
125d0 54 52 4c 5f 50 47 48 44 52 53 5a 3a 20 7b 0a 20  TRL_PGHDRSZ: {. 
125e0 20 20 20 20 20 72 63 20 3d 20 73 69 7a 65 6f 66       rc = sizeof
125f0 28 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 62  (PgHdr);.      b
12600 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
12610 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
12620 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
12630 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
12640 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65  MALLOC, sz, &pNe
12650 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a  w, pFree);.    *
12660 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46  *.    ** Pass pF
12670 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33  ree into sqlite3
12680 53 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a  ScratchFree(). .
12690 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74      ** If sz>0 t
126a0 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73  hen allocate a s
126b0 63 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e  cratch buffer in
126c0 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a  to pNew.  .    *
126d0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
126e0 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54  E_TESTCTRL_SCRAT
126f0 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20  CHMALLOC: {.    
12700 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a    void *pFree, *
12710 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e  *ppNew;.      in
12720 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d  t sz;.      sz =
12730 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
12740 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20  ;.      ppNew = 
12750 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
12760 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20  *);.      pFree 
12770 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
12780 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  d*);.      if( s
12790 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c  z ) *ppNew = sql
127a0 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
127b0 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  c(sz);.      sql
127c0 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
127d0 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72  pFree);.      br
127e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a  eak;.    }..  }.
127f0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65    va_end(ap);.#e
12800 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12810 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
12820 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
12830 0a 7d 0a                                         .}.