/ Hex Artifact Content
Login

Artifact 6873986c416ce78e8102b5189aef1179053be4e9:


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 69 66 28 20 21 73 71 6c 69 74 65 33 47  .  if( !sqlite3G
11c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
11d0: 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20  llocInit ){.    
11e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  rc = sqlite3Mall
11f0: 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20  ocInit();.  }.  
1200: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1210: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
1220: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
1230: 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20  allocInit = 1;. 
1240: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 47     if( !sqlite3G
1250: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
1260: 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  tMutex ){.      
1270: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1280: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d  fig.pInitMutex =
1290: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
12a0: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
12b0: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
12c0: 53 49 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIVE);.      if(
12d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e0: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
12f0: 26 26 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61  && !sqlite3Globa
1300: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1310: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ex ){.        rc
1320: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1330: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1340: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1350: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1360: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1370: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b  g.nRefInitMutex+
1380: 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
1390: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
13a0: 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ster);..  /* If 
13b0: 75 6e 61 62 6c 65 20 74 6f 20 69 6e 69 74 69 61  unable to initia
13c0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  lize the malloc 
13d0: 73 75 62 73 79 73 74 65 6d 2c 20 74 68 65 6e 20  subsystem, then 
13e0: 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 0a 20 20  return early..  
13f0: 2a 2a 20 54 68 65 72 65 20 69 73 20 6c 69 74 74  ** There is litt
1400: 6c 65 20 68 6f 70 65 20 6f 66 20 67 65 74 74 69  le hope of getti
1410: 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72 75 6e  ng SQLite to run
1420: 20 69 66 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20   if the malloc. 
1430: 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63 61   ** subsystem ca
1440: 6e 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c 69  nnot be initiali
1450: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
1460: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1470: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1480: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1490: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
14a0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
14b0: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
14c0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
14d0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
14e0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
14f0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1500: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1510: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1520: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1530: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1540: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1550: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1560: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1570: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1580: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1590: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
15a0: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
15b0: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
15c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
15d0: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
15e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
15f0: 69 74 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  itMutex);.  if( 
1600: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1610: 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26  fig.isInit==0 &&
1620: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1630: 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d  nfig.inProgress=
1640: 3d 30 20 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  =0 ){.    FuncDe
1650: 66 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26  fHash *pHash = &
1660: 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61  GLOBAL(FuncDefHa
1670: 73 68 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  sh, sqlite3Globa
1680: 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20  lFunctions);.   
1690: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
16a0: 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20  nfig.inProgress 
16b0: 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 1;.    memset(
16c0: 70 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  pHash, 0, sizeof
16d0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75  (sqlite3GlobalFu
16e0: 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73  nctions));.    s
16f0: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c  qlite3RegisterGl
1700: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b  obalFunctions();
1710: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1720: 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a  3PcacheInitializ
1730: 65 28 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  e();.    if( rc=
1740: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1750: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1760: 5f 6f 73 5f 69 6e 69 74 28 29 3b 0a 20 20 20 20  _os_init();.    
1770: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1780: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1790: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75   sqlite3PCacheBu
17a0: 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69 74  fferSetup( sqlit
17b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
17c0: 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Page, .         
17d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
17e0: 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c  nfig.szPage, sql
17f0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1800: 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73  .nPage);.      s
1810: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1820: 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  ig.isInit = 1;. 
1830: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1840: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1850: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d  rogress = 0;.  }
1860: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1870: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c  _leave(sqlite3Gl
1880: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1890: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f  Mutex);..  /* Go
18a0: 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20   back under the 
18b0: 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64  static mutex and
18c0: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
18d0: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74  cursive.  ** mut
18e0: 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20  ex to prevent a 
18f0: 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20  resource leak.. 
1900: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1910: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
1920: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
1930: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1940: 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28  itMutex--;.  if(
1950: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1960: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1970: 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ex<=0 ){.    ass
1980: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
1990: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
19a0: 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  tMutex==0 );.   
19b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
19c0: 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ree(sqlite3Globa
19d0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
19e0: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
19f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1a00: 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d  itMutex = 0;.  }
1a10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a20: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
1a30: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1a40: 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73  wing is just a s
1a50: 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d  anity check to m
1a60: 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20  ake sure SQLite 
1a70: 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
1a80: 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  mpiled correctly
1a90: 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  .  It is importa
1aa0: 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63  nt to run this c
1ab0: 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65  ode, but.  ** we
1ac0: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
1ad0: 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20  un it too often 
1ae0: 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20  and soak up CPU 
1af0: 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20  cycles for no.  
1b00: 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77  ** reason.  So w
1b10: 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75  e run it once du
1b20: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
1b30: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
1b40: 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66  f NDEBUG.#ifndef
1b50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1b60: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a  ATING_POINT.  /*
1b70: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66   This section of
1b80: 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75   code's only "ou
1b90: 74 70 75 74 22 20 69 73 20 76 69 61 20 61 73 73  tput" is via ass
1ba0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1bb0: 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d  . */.  if ( rc==
1bc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bd0: 20 75 36 34 20 78 20 3d 20 28 28 28 75 36 34 29   u64 x = (((u64)
1be0: 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64  1)<<63)-1;.    d
1bf0: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73  ouble y;.    ass
1c00: 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38  ert(sizeof(x)==8
1c10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69  );.    assert(si
1c20: 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28  zeof(x)==sizeof(
1c30: 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  y));.    memcpy(
1c40: 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  &y, &x, 8);.    
1c50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49  assert( sqlite3I
1c60: 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23  sNaN(y) );.  }.#
1c70: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
1c80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c90: 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66  .** Undo the eff
1ca0: 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ects of sqlite3_
1cb0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d  initialize().  M
1cc0: 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  ust not be calle
1cd0: 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65  d while.** there
1ce0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
1cf0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1d00: 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20  tions or memory 
1d10: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a  allocations or.*
1d20: 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74  * while any part
1d30: 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74   of SQLite is ot
1d40: 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69  herwise in use i
1d50: 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54  n any thread.  T
1d60: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
1d70: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
1d80: 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61 66  .  But it is saf
1d90: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73  e to invoke this
1da0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77   routine.** on w
1db0: 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c  hen SQLite is al
1dc0: 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e  ready shut down.
1dd0: 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61    If SQLite is a
1de0: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
1df0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
1e00: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
1e10: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
1e20: 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
1e30: 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  s no-op..*/.int 
1e40: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
1e50: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71  (void){.  if( sq
1e60: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e70: 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  g.isInit ){.    
1e80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1e90: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1ea0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1eb0: 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28  3PcacheShutdown(
1ec0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  );.    sqlite3_o
1ed0: 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  s_end();.    sql
1ee0: 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f  ite3_reset_auto_
1ef0: 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20  extension();.   
1f00: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e   sqlite3MallocEn
1f10: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
1f20: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20  MutexEnd();.    
1f30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1f40: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  fig.isInit = 0;.
1f50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1f60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f70: 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73   This API allows
1f80: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f   applications to
1f90: 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62   modify the glob
1fa0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
1fb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74   of.** the SQLit
1fc0: 65 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e  e library at run
1fd0: 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -time..**.** Thi
1fe0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1ff0: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
2000: 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
2010: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a  o outstanding.**
2020: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2030: 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20  tions or memory 
2040: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  allocations.  Th
2050: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
2060: 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e  t.** threadsafe.
2070: 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65    Failure to hee
2080: 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73  d these warnings
2090: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70   can lead to unp
20a0: 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65  redictable.** be
20b0: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
20c0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e  qlite3_config(in
20d0: 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  t op, ...){.  va
20e0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
20f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2100: 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  /* sqlite3_co
2110: 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74  nfig() shall ret
2120: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
2130: 45 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b  E if it is invok
2140: 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68  ed while.  ** th
2150: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
2160: 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20   is in use. */. 
2170: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2180: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2190: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21a0: 4d 49 53 55 53 45 3b 0a 0a 20 20 76 61 5f 73 74  MISUSE;..  va_st
21b0: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
21c0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
21d0: 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69    /* Mutex confi
21e0: 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
21f0: 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61   are only availa
2200: 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73  ble in a threads
2210: 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  afe.    ** compi
2220: 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20  le. .    */.#if 
2230: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2240: 45 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  E.    case SQLIT
2250: 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54  E_CONFIG_SINGLET
2260: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
2270: 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75  * Disable all mu
2280: 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  texing */.      
2290: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
22a0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
22b0: 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
22c0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
22d0: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20  ullMutex = 0;.  
22e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
22f0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2300: 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52  _CONFIG_MULTITHR
2310: 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAD: {.      /* 
2320: 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67  Disable mutexing
2330: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
2340: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  nections */.    
2350: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
2360: 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74  xing of core dat
2370: 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
2380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2390: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
23a0: 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  utex = 1;.      
23b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
23c0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
23d0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
23e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
23f0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45  SQLITE_CONFIG_SE
2400: 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20  RIALIZED: {.    
2410: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20    /* Enable 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 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      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 31 3b 0a  bFullMutex = 1;.
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 54 45 58 3a  TE_CONFIG_MUTEX:
24b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
24c0: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
24d0: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
24e0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
24f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2500: 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61  nfig.mutex = *va
2510: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
2520: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
2530: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2540: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2550: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d  LITE_CONFIG_GETM
2560: 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  UTEX: {.      /*
2570: 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75   Retrieve the cu
2580: 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c  rrent mutex impl
2590: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
25a0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
25b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
25c0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
25d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75  3GlobalConfig.mu
25e0: 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tex;.      break
25f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
2600: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2610: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20  _CONFIG_MALLOC: 
2620: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
2630: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
2640: 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65  e malloc impleme
2650: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
2660: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2670: 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67  nfig.m = *va_arg
2680: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
2690: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
26a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
26c0: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a  ONFIG_GETMALLOC:
26d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
26e0: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
26f0: 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d   malloc() implem
2700: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2720: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c  balConfig.m.xMal
2730: 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  loc==0 ) sqlite3
2740: 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b  MemSetDefault();
2750: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
2760: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  p, sqlite3_mem_m
2770: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
2780: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2790: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
27a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
27b0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53  LITE_CONFIG_MEMS
27c0: 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f  TATUS: {.      /
27d0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
27e0: 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73  ble the malloc s
27f0: 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e  tatus collection
2800: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2810: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d  3GlobalConfig.bM
2820: 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28  emstat = va_arg(
2830: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
2840: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2850: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2860: 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20  FIG_SCRATCH: {. 
2870: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
2880: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73  e a buffer for s
2890: 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70  cratch memory sp
28a0: 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ace */.      sql
28b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
28c0: 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .pScratch = va_a
28d0: 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
28e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
28f0: 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74  alConfig.szScrat
2900: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
2910: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
2920: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2930: 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  nScratch = va_ar
2940: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
2950: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2960: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2970: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a  ONFIG_PAGECACHE:
2980: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69   {.      /* Desi
2990: 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66  gnate a buffer f
29a0: 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65  or page cache me
29b0: 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20  mory space */.  
29c0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
29d0: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20  lConfig.pPage = 
29e0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
29f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50  GlobalConfig.szP
2a10: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
2a20: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
2a30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2a40: 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28  .nPage = va_arg(
2a50: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
2a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
2a70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2a80: 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20  NFIG_PCACHE: {. 
2a90: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
2aa0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
2ab0: 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d  age cache implem
2ac0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2ad0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2ae0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 20 3d 20 2a  onfig.pcache = *
2af0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
2b00: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
2b10: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
2b20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
2b30: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2b40: 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20  GETPCACHE: {.   
2b50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2b60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
2b70: 65 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  e.xInit==0 ){.  
2b80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
2b90: 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b  cheSetDefault();
2ba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
2bb0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
2bc0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
2bd0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
2be0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
2bf0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2c00: 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65     }..#if define
2c10: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
2c20: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
2c30: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2c40: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
2c50: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2c60: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
2c70: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
2c80: 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d  uffer for heap m
2c90: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
2ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2cb0: 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d  alConfig.pHeap =
2cc0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
2cd0: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
2ce0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
2cf0: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
2d00: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
2d10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d20: 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28  .mnReq = va_arg(
2d30: 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20  ap, int);..     
2d40: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2d50: 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d  alConfig.pHeap==
2d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2d70: 49 66 20 74 68 65 20 68 65 61 70 20 70 6f 69 6e  If the heap poin
2d80: 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ter is NULL, the
2d90: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 6d 61  n restore the ma
2da0: 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lloc implementat
2db0: 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ion.        ** b
2dc0: 61 63 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e  ack to NULL poin
2dd0: 74 65 72 73 20 74 6f 6f 2e 20 20 54 68 69 73 20  ters too.  This 
2de0: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d  will cause the m
2df0: 61 6c 6c 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20  alloc to go.    
2e00: 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69      ** back to i
2e10: 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65  ts default imple
2e20: 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73  mentation when s
2e30: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
2e40: 65 28 29 20 69 73 0a 20 20 20 20 20 20 20 20 2a  e() is.        *
2e50: 2a 20 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a  * run..        *
2e60: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  /.        memset
2e70: 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  (&sqlite3GlobalC
2e80: 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65  onfig.m, 0, size
2e90: 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  of(sqlite3Global
2ea0: 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20  Config.m));.    
2eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ec0: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 70 6f 69   /* The heap poi
2ed0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
2ee0: 2c 20 74 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f  , then install o
2ef0: 6e 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ne of the.      
2f00: 20 20 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33    ** mem5.c/mem3
2f10: 2e 63 20 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e  .c methods. If n
2f20: 65 69 74 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45  either ENABLE_ME
2f30: 4d 53 59 53 33 20 6e 6f 72 0a 20 20 20 20 20 20  MSYS3 nor.      
2f40: 20 20 2a 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53    ** ENABLE_MEMS
2f50: 59 53 35 20 69 73 20 64 65 66 69 6e 65 64 2c 20  YS5 is defined, 
2f60: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e  return an error.
2f70: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
2f80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2f90: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
2fa0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2fb0: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
2fc0: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
2fd0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
2fe0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
2ff0: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
3000: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3010: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
3020: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
3030: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
3040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3050: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
3060: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3070: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
3080: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3090: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
30a0: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
30b0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
30c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
30d0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
30e0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
30f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3100: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
3110: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
3120: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
3130: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3140: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
3150: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3160: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20  *.** Set up the 
3170: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
3180: 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  s for a database
3190: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20   connection..** 
31a0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
31b0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a   on success.  .*
31c0: 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69  * If lookaside i
31d0: 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
31e0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
31f0: 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BUSY..**.** The 
3200: 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  sz parameter is 
3210: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
3220: 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b  tes in each look
3230: 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54  aside slot..** T
3240: 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72  he cnt parameter
3250: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
3260: 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74  f slots.  If pSt
3270: 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a  art is NULL the.
3280: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
3290: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
32a0: 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
32b0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
32c0: 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72  c()..** If pStar
32d0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
32e0: 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20  en it is sz*cnt 
32f0: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
3300: 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68  to use for.** th
3310: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
3320: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
3330: 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  t setupLookaside
3340: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
3350: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a  id *pBuf, int sz
3360: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f  , int cnt){.  vo
3370: 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66  id *pStart;.  if
3380: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
3390: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  nOut ){.    retu
33a0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
33b0: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
33c0: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
33d0: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
33e0: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
33f0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
3400: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
3410: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
3420: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
3430: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
3440: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
3450: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
3460: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
3470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
3480: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
3490: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
34a0: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
34b0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
34c0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
34d0: 67 65 72 20 74 68 61 6e 20 61 20 70 6f 69 6e 74  ger than a point
34e0: 65 72 0a 20 20 2a 2a 20 74 6f 20 62 65 20 75 73  er.  ** to be us
34f0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  eful..  */.  if(
3500: 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66   sz<=(int)sizeof
3510: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
3520: 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28   ) sz = 0;.  if(
3530: 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30   cnt<0 ) cnt = 0
3540: 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c  ;.  if( sz==0 ||
3550: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73   cnt==0 ){.    s
3560: 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  z = 0;.    pStar
3570: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
3580: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
3590: 20 20 73 7a 20 3d 20 52 4f 55 4e 44 38 28 73 7a    sz = ROUND8(sz
35a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
35b0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
35c0: 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  );.    pStart = 
35d0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73  sqlite3Malloc( s
35e0: 7a 2a 63 6e 74 20 29 3b 0a 20 20 20 20 73 71 6c  z*cnt );.    sql
35f0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
3600: 6c 6f 63 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  loc();.  }else{.
3610: 20 20 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f      sz = ROUNDDO
3620: 57 4e 38 28 73 7a 29 3b 0a 20 20 20 20 70 53 74  WN8(sz);.    pSt
3630: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
3640: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
3650: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
3660: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
3670: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
3680: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
3690: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
36a0: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
36b0: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
36c0: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
36d0: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
36e0: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
36f0: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
3700: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
3710: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
3720: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
3730: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
3740: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
3750: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
3760: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
3770: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
3780: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
3790: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
37a0: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
37b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
37c0: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
37d0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
37e0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
37f0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
3800: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
3810: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
3820: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3830: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  End = 0;.    db-
3840: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
3850: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
3860: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
3870: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
3880: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
38a0: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
38b0: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
38c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
38d0: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
38e0: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
38f0: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
3900: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
3910: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
3920: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   Configuration s
3930: 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69  ettings for an i
3940: 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61  ndividual databa
3950: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f  se connection.*/
3960: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
3970: 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a  config(sqlite3 *
3980: 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  db, int op, ...)
3990: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
39a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
39b0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
39c0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
39d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42    case SQLITE_DB
39e0: 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45  CONFIG_LOOKASIDE
39f0: 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  : {.      void *
3a00: 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70  pBuf = va_arg(ap
3a10: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
3a20: 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28  int sz = va_arg(
3a30: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3a40: 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67  int cnt = va_arg
3a50: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3a60: 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61   rc = setupLooka
3a70: 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73  side(db, pBuf, s
3a80: 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62  z, cnt);.      b
3a90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3aa0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
3ab0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
3ac0: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
3ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
3ae0: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
3af0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
3b00: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
3b10: 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e  he buffer z[0..n
3b20: 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  -1] contains all
3b30: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
3b40: 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73  ic int allSpaces
3b50: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
3b60: 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28  int n){.  while(
3b70: 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
3b80: 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ' ' ){ n--; }.  
3b90: 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a  return n==0;.}..
3ba0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
3bb0: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
3bc0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ing function nam
3bd0: 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63  ed "BINARY" whic
3be0: 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61  h is always.** a
3bf0: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
3c00: 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61  If the padFlag a
3c10: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
3c20: 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70  ULL then space p
3c30: 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e  adding at the en
3c40: 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20  d.** of strings 
3c50: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  is ignored.  Thi
3c60: 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  s implements the
3c70: 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e   RTRIM collation
3c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c90: 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  binCollFunc(.  v
3ca0: 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20  oid *padFlag,.  
3cb0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
3cc0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
3cd0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
3ce0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
3cf0: 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e    int rc, n;.  n
3d00: 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f   = nKey1<nKey2 ?
3d10: 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a   nKey1 : nKey2;.
3d20: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
3d30: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
3d40: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
3d50: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
3d60: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
3d70: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
3d80: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
3d90: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
3da0: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
3db0: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
3dc0: 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72        /* Leave r
3dd0: 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30  c unchanged at 0
3de0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
3df0: 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20       rc = nKey1 
3e00: 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20  - nKey2;.    }. 
3e10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
3e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72  }../*.** Another
3e30: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
3e40: 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f  ing sequence: NO
3e50: 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  CASE. .**.** Thi
3e60: 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  s collating sequ
3e70: 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64  ence is intended
3e80: 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20   to be used for 
3e90: 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64 61 6e  "case independan
3ea0: 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22  t.** comparison"
3eb0: 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c  . SQLite's knowl
3ec0: 65 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e  edge of upper an
3ed0: 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75  d lower case equ
3ee0: 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65  ivalents.** exte
3ef0: 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20  nds only to the 
3f00: 32 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73  26 characters us
3f10: 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73  ed in the Englis
3f20: 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a  h language..**.*
3f30: 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20  * At the moment 
3f40: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20  there is only a 
3f50: 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61  UTF-8 implementa
3f60: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
3f70: 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74  int nocaseCollat
3f80: 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20  ingFunc(.  void 
3f90: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20  *NotUsed,.  int 
3fa0: 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
3fb0: 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20  d *pKey1,.  int 
3fc0: 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey2, const voi
3fd0: 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e  d *pKey2.){.  in
3fe0: 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t r = sqlite3Str
3ff0: 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f  NICmp(.      (co
4000: 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31  nst char *)pKey1
4010: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
4020: 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b  pKey2, (nKey1<nK
4030: 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32  ey2)?nKey1:nKey2
4040: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
4050: 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
4060: 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20    if( 0==r ){.  
4070: 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79    r = nKey1-nKey
4080: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
4090: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
40a0: 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  rn the ROWID of 
40b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
40c0: 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65  insert.*/.sqlite
40d0: 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c  _int64 sqlite3_l
40e0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
40f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4100: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74   return db->last
4110: 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
4120: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
4130: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20  r of changes in 
4140: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
4150: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
4160: 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  exec()..*/.int s
4170: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73  qlite3_changes(s
4180: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
4190: 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67  eturn db->nChang
41a0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
41b0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
41c0: 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74   changes since t
41d0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
41e0: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a  le was opened..*
41f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  /.int sqlite3_to
4200: 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  tal_changes(sqli
4210: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
4220: 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  rn db->nTotalCha
4230: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  nge;.}../*.** Cl
4240: 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  ose all open sav
4250: 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75  epoints. This fu
4260: 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69  nction only mani
4270: 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f  pulates fields o
4280: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
4290: 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c  e handle object,
42a0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f   it does not clo
42b0: 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  se any savepoint
42c0: 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70  s that may be op
42d0: 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74  en.** at the b-t
42e0: 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e  ree/pager level.
42f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4300: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
4310: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
4320: 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65  while( db->pSave
4330: 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76  point ){.    Sav
4340: 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64  epoint *pTmp = d
4350: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20  b->pSavepoint;. 
4360: 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e     db->pSavepoin
4370: 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b  t = pTmp->pNext;
4380: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4390: 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20  ee(db, pTmp);.  
43a0: 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69  }.  db->nSavepoi
43b0: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53  nt = 0;.  db->nS
43c0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
43d0: 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f  db->isTransactio
43e0: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
43f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
4400: 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74  n existing SQLit
4410: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e  e database.*/.in
4420: 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  t sqlite3_close(
4430: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
4440: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
4450: 6e 74 20 6a 3b 0a 0a 20 20 69 66 28 20 21 64 62  nt j;..  if( !db
4460: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4470: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
4480: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
4490: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
44a0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
44b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
44c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
44d0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
44e0: 75 74 65 78 29 3b 0a 0a 20 20 73 71 6c 69 74 65  utex);..  sqlite
44f0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
4500: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20  hema(db, 0);..  
4510: 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  /* If a transact
4520: 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ion is open, the
4530: 20 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63   ResetInternalSc
4540: 68 65 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f 76  hema() call abov
4550: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
4560: 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20  have called the 
4570: 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65  xDisconnect() me
4580: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
4590: 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  ual.  ** tables 
45a0: 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  in the db->aVTra
45b0: 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20  ns[] array. The 
45c0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
45d0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a  3VtabRollback().
45e0: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64    ** call will d
45f0: 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f  o so. We need to
4600: 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
4610: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63  the check for ac
4620: 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74  tive.  ** SQL st
4630: 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20  atements below, 
4640: 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69  as the v-table i
4650: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61  mplementation ma
4660: 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a  y be storing.  *
4670: 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20  * some prepared 
4680: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72  statements inter
4690: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  nally..  */.  sq
46a0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
46b0: 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  k(db);..  /* If 
46c0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
46d0: 74 73 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72  tstanding VMs, r
46e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
46f0: 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  Y. */.  if( db->
4700: 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c  pVdbe ){.    sql
4710: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
4720: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
4730: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63      "unable to c
4740: 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69  lose due to unfi
4750: 6e 61 6c 69 73 65 64 20 73 74 61 74 65 6d 65 6e  nalised statemen
4760: 74 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ts");.    sqlite
4770: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
4780: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
4790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
47a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
47b0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
47c0: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
47d0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  ;..  for(j=0; j<
47e0: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
47f0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
4800: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a  db->aDb[j].pBt;.
4810: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
4820: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42  qlite3BtreeIsInB
4830: 61 63 6b 75 70 28 70 42 74 29 20 29 7b 0a 20 20  ackup(pBt) ){.  
4840: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4850: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
4860: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
4870: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
4880: 65 20 74 6f 20 75 6e 66 69 6e 69 73 68 65 64 20  e to unfinished 
4890: 62 61 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e  backup operation
48a0: 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
48b0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
48c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
48d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
48e0: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  SY;.    }.  }.. 
48f0: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74   /* Free any out
4900: 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69  standing Savepoi
4910: 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a  nt structures. *
4920: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  /.  sqlite3Close
4930: 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
4940: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
4950: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
4960: 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20   struct Db *pDb 
4970: 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20  = &db->aDb[j];. 
4980: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20     if( pDb->pBt 
4990: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
49a0: 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e  BtreeClose(pDb->
49b0: 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  pBt);.      pDb-
49c0: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  >pBt = 0;.      
49d0: 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20  if( j!=1 ){.    
49e0: 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61      pDb->pSchema
49f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4a00: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
4a10: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
4a20: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20  hema(db, 0);..  
4a30: 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65  /* Tell the code
4a40: 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61   in notify.c tha
4a50: 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
4a60: 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73   no longer holds
4a70: 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20   any.  ** locks 
4a80: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  and does not req
4a90: 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72  uire any further
4aa0: 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
4ab0: 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
4ac0: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
4ad0: 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20  onClosed(db);.. 
4ae0: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62   assert( db->nDb
4af0: 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=2 );.  assert(
4b00: 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44   db->aDb==db->aD
4b10: 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72  bStatic );.  for
4b20: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
4b30: 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20  e(db->aFunc.a); 
4b40: 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  j++){.    FuncDe
4b50: 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68  f *pNext, *pHash
4b60: 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  , *p;.    for(p=
4b70: 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20  db->aFunc.a[j]; 
4b80: 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20  p; p=pHash){.   
4b90: 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48     pHash = p->pH
4ba0: 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ash;.      while
4bb0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ( p ){.        p
4bc0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
4bd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4be0: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
4bf0: 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74         p = pNext
4c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4c10: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69    }.  for(i=sqli
4c20: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
4c30: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
4c40: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
4c50: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
4c60: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
4c70: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
4c80: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
4c90: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
4ca0: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
4cb0: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
4cc0: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
4cd0: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
4ce0: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
4cf0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
4d00: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
4d10: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
4d20: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
4d30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4d40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4d50: 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, pColl);.  }.
4d60: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
4d70: 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  ar(&db->aCollSeq
4d80: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
4d90: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4da0: 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  BLE.  for(i=sqli
4db0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
4dc0: 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d  >aModule); i; i=
4dd0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
4de0: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
4df0: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
4e00: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
4e10: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  i);.    if( pMod
4e20: 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->xDestroy ){.  
4e30: 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72      pMod->xDestr
4e40: 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a  oy(pMod->pAux);.
4e50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4e60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64  3DbFree(db, pMod
4e70: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
4e80: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
4e90: 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
4ea0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
4eb0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
4ec0: 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65  ); /* Deallocate
4ed0: 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72  s any cached err
4ee0: 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20  or strings. */. 
4ef0: 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b   if( db->pErr ){
4f00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
4f10: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
4f20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c  .  }.  sqlite3Cl
4f30: 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oseExtensions(db
4f40: 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  );..  db->magic 
4f50: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
4f60: 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  RROR;..  /* The 
4f70: 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63  temp-database sc
4f80: 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  hema is allocate
4f90: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  d differently fr
4fa0: 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68  om the other sch
4fb0: 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ema.  ** objects
4fc0: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61   (using sqliteMa
4fd0: 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c  lloc() directly,
4fe0: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
4ff0: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29  te3BtreeSchema()
5000: 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65  )..  ** So it ne
5010: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
5020: 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20  here. Todo: Why 
5030: 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d  not roll the tem
5040: 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20  p schema into.  
5050: 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69  ** the same sqli
5060: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68  teMalloc() as th
5070: 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63  e one that alloc
5080: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
5090: 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  e .  ** structur
50a0: 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e?.  */.  sqlite
50b0: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
50c0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
50d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
50e0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
50f0: 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  );.  db->magic =
5100: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
5110: 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OSED;.  sqlite3_
5120: 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d  mutex_free(db->m
5130: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
5140: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
5150: 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61  Out==0 );  /* Fa
5160: 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69  ils on a lookasi
5170: 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a  de memory leak *
5180: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
5190: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
51a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
51b0: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
51c0: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
51d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
51e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
51f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5200: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74  Rollback all dat
5210: 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a  abase files..*/.
5220: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
5230: 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20  backAll(sqlite3 
5240: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
5250: 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30   int inTrans = 0
5260: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5270: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
5280: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
5290: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
52a0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72  nMalloc();.  for
52b0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
52c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64   i++){.    if( d
52d0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b  b->aDb[i].pBt ){
52e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
52f0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
5300: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  (db->aDb[i].pBt)
5310: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72   ){.        inTr
5320: 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ans = 1;.      }
5330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
5340: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e  reeRollback(db->
5350: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
5360: 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e     db->aDb[i].in
5370: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Trans = 0;.    }
5380: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
5390: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
53a0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
53b0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69  gnMalloc();..  i
53c0: 66 28 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  f( db->flags&SQL
53d0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
53e0: 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
53f0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
5400: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
5410: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
5420: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
5430: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
5440: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
5450: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
5460: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
5470: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
5480: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
5490: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
54a0: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
54b0: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
54c0: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
54d0: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
54e0: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
54f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5500: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
5510: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
5520: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
5530: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
5540: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
5550: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
5560: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
5570: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
5580: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
5590: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
55a0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
55b0: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
55c0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
55d0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
55e0: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
55f0: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
5600: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
5610: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
5620: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
5630: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
5640: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
5650: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
5660: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
5670: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
5680: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
5690: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
56a0: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
56b0: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
56c0: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
56d0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
56e0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
56f0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
5700: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
5710: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
5720: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
5730: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
5740: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
5750: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
5760: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
5770: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
5780: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
5790: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
57a0: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
57b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
57c0: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
57d0: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
57e0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
57f0: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
5800: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
5810: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
5820: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
5830: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 30 2c 0a 20  FOUND    */ 0,. 
5840: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
5850: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
5860: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
5870: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
5880: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
5890: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
58a0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
58b0: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
58c0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
58d0: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
58e0: 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a  TE_EMPTY       *
58f0: 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  / "table contain
5900: 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20  s no data",.    
5910: 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  /* SQLITE_SCHEMA
5920: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
5930: 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68  se schema has ch
5940: 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  anged",.    /* S
5950: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20  QLITE_TOOBIG    
5960: 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20    */ "string or 
5970: 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20  blob too big",. 
5980: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     /* SQLITE_CON
5990: 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e  STRAINT  */ "con
59a0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c  straint failed",
59b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
59c0: 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64  ISMATCH    */ "d
59d0: 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68  atatype mismatch
59e0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
59f0: 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20  _MISUSE      */ 
5a00: 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65  "library routine
5a10: 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73   called out of s
5a20: 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a  equence",.    /*
5a30: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20   SQLITE_NOLFS   
5a40: 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69      */ "large fi
5a50: 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69  le support is di
5a60: 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20  sabled",.    /* 
5a70: 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20  SQLITE_AUTH     
5a80: 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61     */ "authoriza
5a90: 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  tion denied",.  
5aa0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d    /* SQLITE_FORM
5ab0: 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69  AT      */ "auxi
5ac0: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66  liary database f
5ad0: 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20  ormat error",.  
5ae0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47    /* SQLITE_RANG
5af0: 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64  E       */ "bind
5b00: 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78   or column index
5b10: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a   out of range",.
5b20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
5b30: 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69  TADB      */ "fi
5b40: 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20  le is encrypted 
5b50: 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61  or is not a data
5b60: 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 72 63  base",.  };.  rc
5b70: 20 26 3d 20 30 78 66 66 3b 0a 20 20 69 66 28 20   &= 0xff;.  if( 
5b80: 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26  ALWAYS(rc>=0) &&
5b90: 20 72 63 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66   rc<(int)(sizeof
5ba0: 28 61 4d 73 67 29 2f 73 69 7a 65 6f 66 28 61 4d  (aMsg)/sizeof(aM
5bb0: 73 67 5b 30 5d 29 29 20 26 26 20 61 4d 73 67 5b  sg[0])) && aMsg[
5bc0: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  rc]!=0 ){.    re
5bd0: 74 75 72 6e 20 61 4d 73 67 5b 72 63 5d 3b 0a 20  turn aMsg[rc];. 
5be0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
5bf0: 72 6e 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f  rn "unknown erro
5c00: 72 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r";.  }.}../*.**
5c10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
5c20: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
5c30: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
5c40: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
5c50: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
5c60: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
5c70: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
5c80: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
5c90: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
5ca0: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
5cb0: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
5cc0: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
5cd0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
5ce0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
5cf0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
5d00: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5d20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5d30: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
5d60: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
5d70: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
5d80: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
5d90: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
5da0: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
5db0: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
5dc0: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
5dd0: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
5de0: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
5df0: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
5e00: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
5e10: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
5e20: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
5e30: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
5e40: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
5e50: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
5e60: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
5e70: 44 45 4c 41 59 20 28 73 69 7a 65 6f 66 28 64 65  DELAY (sizeof(de
5e80: 6c 61 79 73 29 2f 73 69 7a 65 6f 66 28 64 65 6c  lays)/sizeof(del
5e90: 61 79 73 5b 30 5d 29 29 0a 20 20 73 71 6c 69 74  ays[0])).  sqlit
5ea0: 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65  e3 *db = (sqlite
5eb0: 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74  3 *)ptr;.  int t
5ec0: 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73  imeout = db->bus
5ed0: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20  yTimeout;.  int 
5ee0: 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20  delay, prior;.. 
5ef0: 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d   assert( count>=
5f00: 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74  0 );.  if( count
5f10: 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20   < NDELAY ){.   
5f20: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
5f30: 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f  count];.    prio
5f40: 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74  r = totals[count
5f50: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
5f60: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e  delay = delays[N
5f70: 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72  DELAY-1];.    pr
5f80: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45  ior = totals[NDE
5f90: 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28  LAY-1] + delay*(
5fa0: 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29  count-(NDELAY-1)
5fb0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69  );.  }.  if( pri
5fc0: 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d  or + delay > tim
5fd0: 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61  eout ){.    dela
5fe0: 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72  y = timeout - pr
5ff0: 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c  ior;.    if( del
6000: 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ay<=0 ) return 0
6010: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
6020: 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c  sSleep(db->pVfs,
6030: 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20   delay*1000);.  
6040: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a  return 1;.#else.
6050: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
6060: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a  (sqlite3 *)ptr;.
6070: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20    int timeout = 
6080: 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29  ((sqlite3 *)ptr)
6090: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20  ->busyTimeout;. 
60a0: 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31   if( (count+1)*1
60b0: 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b  000 > timeout ){
60c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
60d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
60e0: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30  eep(db->pVfs, 10
60f0: 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  00000);.  return
6100: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
6110: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67  .** Invoke the g
6120: 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65  iven busy handle
6130: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
6140: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
6150: 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f  when an operatio
6160: 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20  n failed with a 
6170: 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73  lock..** If this
6180: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
6190: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
61a0: 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20  ock is retried. 
61b0: 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e   If it.** return
61c0: 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69  s 0, the operati
61d0: 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61  on aborts with a
61e0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  n SQLITE_BUSY er
61f0: 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ror..*/.int sqli
6200: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
6210: 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72  dler(BusyHandler
6220: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
6230: 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
6240: 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30  ) || p->xFunc==0
6250: 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29   || p->nBusy<0 )
6260: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20   return 0;.  rc 
6270: 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41  = p->xFunc(p->pA
6280: 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20  rg, p->nBusy);. 
6290: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
62a0: 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b    p->nBusy = -1;
62b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
62c0: 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20  >nBusy++;.  }.  
62d0: 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f  return rc; .}../
62e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
62f0: 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20  e sets the busy 
6300: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20  callback for an 
6310: 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  Sqlite database 
6320: 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  to the.** given 
6330: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
6340: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
6350: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
6360: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68  t sqlite3_busy_h
6370: 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65  andler(.  sqlite
6380: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78  3 *db,.  int (*x
6390: 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29  Busy)(void*,int)
63a0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
63b0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
63c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
63d0: 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  x);.  db->busyHa
63e0: 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42  ndler.xFunc = xB
63f0: 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  usy;.  db->busyH
6400: 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41  andler.pArg = pA
6410: 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  rg;.  db->busyHa
6420: 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
6430: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6440: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6450: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6460: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
6470: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
6480: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
6490: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
64a0: 6e 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67  ne sets the prog
64b0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ress callback fo
64c0: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
64d0: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
64e0: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
64f0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
6500: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20  given argument. 
6510: 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  The progress cal
6520: 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65  lback will.** be
6530: 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e   invoked every n
6540: 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  Ops opcodes..*/.
6550: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f  void sqlite3_pro
6560: 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20  gress_handler(. 
6570: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
6580: 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74   int nOps,.  int
6590: 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f   (*xProgress)(vo
65a0: 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70  id*), .  void *p
65b0: 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Arg.){.  sqlite3
65c0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
65d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e  >mutex);.  if( n
65e0: 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d  Ops>0 ){.    db-
65f0: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72  >xProgress = xPr
6600: 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e  ogress;.    db->
6610: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e  nProgressOps = n
6620: 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  Ops;.    db->pPr
6630: 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67  ogressArg = pArg
6640: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
6650: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30  b->xProgress = 0
6660: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
6670: 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20  essOps = 0;.    
6680: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
6690: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
66a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
66b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  db->mutex);.}.#e
66c0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
66d0: 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c  s routine instal
66e0: 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73  ls a default bus
66f0: 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77  y handler that w
6700: 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  aits for the.** 
6710: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
6720: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
6730: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
6740: 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  g 0..*/.int sqli
6750: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
6760: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
6770: 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e  t ms){.  if( ms>
6780: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73  0 ){.    db->bus
6790: 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20  yTimeout = ms;. 
67a0: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
67b0: 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69  handler(db, sqli
67c0: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
67d0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62  lback, (void*)db
67e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
67f0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
6800: 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a  dler(db, 0, 0);.
6810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
6820: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6830: 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69   Cause any pendi
6840: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ng operation to 
6850: 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c  stop at its earl
6860: 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79  iest opportunity
6870: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6880: 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69  3_interrupt(sqli
6890: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
68a0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
68b0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
68c0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
68d0: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
68e0: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
68f0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
6900: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
6910: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
6920: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
6930: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
6940: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
6950: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
6960: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
6970: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6980: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
6990: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
69a0: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
69b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
69c0: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
69d0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
69e0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
69f0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
6a00: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
6a10: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
6a20: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
6a30: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
6a40: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
6a50: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
6a60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
6a70: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
6a80: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
6a90: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
6aa0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
6ab0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
6ac0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
6ad0: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20    FuncDef *p;.  
6ae0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73  int nName;..  as
6af0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6b00: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
6b10: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75  ex) );.  if( zFu
6b20: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c  nctionName==0 ||
6b30: 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26 26  .      (xFunc &&
6b40: 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65   (xFinal || xSte
6b50: 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21  p)) || .      (!
6b60: 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  xFunc && (xFinal
6b70: 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a   && !xStep)) ||.
6b80: 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26        (!xFunc &&
6b90: 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74   (!xFinal && xSt
6ba0: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e  ep)) ||.      (n
6bb0: 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53  Arg<-1 || nArg>S
6bc0: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
6bd0: 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20  ON_ARG) ||.     
6be0: 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73   (255<(nName = s
6bf0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20  qlite3Strlen30( 
6c00: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29  zFunctionName)))
6c10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6c20: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
6c30: 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.  .#ifndef SQL
6c40: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
6c50: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
6c60: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
6c70: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
6c80: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
6c90: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
6ca0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
6cb0: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
6cc0: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
6cd0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
6ce0: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
6cf0: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
6d00: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
6d10: 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ly..  **.  ** If
6d20: 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73   SQLITE_ANY is s
6d30: 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68  pecified, add th
6d40: 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
6d50: 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  the function.  *
6d60: 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61  * to the hash ta
6d70: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
6d80: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
6d90: 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53  6 ){.    enc = S
6da0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
6db0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  E;.  }else if( e
6dc0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29  nc==SQLITE_ANY )
6dd0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
6de0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
6df0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
6e00: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
6e10: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
6e20: 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74          pUserDat
6e30: 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  a, xFunc, xStep,
6e40: 20 78 46 69 6e 61 6c 29 3b 0a 20 20 20 20 69 66   xFinal);.    if
6e50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6e60: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
6e70: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
6e80: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
6e90: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
6ea0: 55 54 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20  UTF16LE,.       
6eb0: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
6ec0: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
6ed0: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  al);.    }.    i
6ee0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6ef0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
6f00: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   rc;.    }.    e
6f10: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
6f20: 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  6BE;.  }.#else. 
6f30: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
6f40: 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  F8;.#endif.  .  
6f50: 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65  /* Check if an e
6f60: 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  xisting function
6f70: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
6f80: 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e  dden or deleted.
6f90: 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64   If so,.  ** and
6fa0: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
6fb0: 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75  e VMs, then retu
6fc0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
6fd0: 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20  If a function.  
6fe0: 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72  ** is being over
6ff0: 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62  ridden/deleted b
7000: 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ut there are no 
7010: 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f  active VMs, allo
7020: 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  w the.  ** opera
7030: 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65  tion to continue
7040: 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20   but invalidate 
7050: 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20  all precompiled 
7060: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
7070: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69  .  p = sqlite3Fi
7080: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
7090: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e  FunctionName, nN
70a0: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
70b0: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20  nc, 0);.  if( p 
70c0: 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d  && p->iPrefEnc==
70d0: 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d  enc && p->nArg==
70e0: 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  nArg ){.    if( 
70f0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
7100: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
7110: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
7120: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
7130: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
7140: 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d  ete/modify user-
7150: 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20  function due to 
7160: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
7170: 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  s");.      asser
7180: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
7190: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
71a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
71b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
71c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
71d0: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
71e0: 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  ts(db);.    }.  
71f0: 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  }..  p = sqlite3
7200: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
7210: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
7220: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38  nName, nArg, (u8
7230: 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65  )enc, 1);.  asse
7240: 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  rt(p || db->mall
7250: 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28  ocFailed);.  if(
7260: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
7270: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7280: 20 20 7d 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d    }.  p->flags =
7290: 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d   0;.  p->xFunc =
72a0: 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74   xFunc;.  p->xSt
72b0: 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d  ep = xStep;.  p-
72c0: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
72d0: 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  nal;.  p->pUserD
72e0: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
72f0: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31  .  p->nArg = (u1
7300: 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  6)nArg;.  return
7310: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7320: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
7330: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
7340: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
7350: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
7360: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
7370: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
7380: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e  nctionName,.  in
7390: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
73a0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
73b0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
73c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
73d0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
73e0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
73f0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
7400: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
7410: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
7420: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
7430: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
7440: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
7450: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
7460: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
7470: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
7480: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
7490: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
74a0: 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c  , enc, p, xFunc,
74b0: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b   xStep, xFinal);
74c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
74d0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
74e0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
74f0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7500: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7510: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7520: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
7530: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7540: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
7550: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
7560: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
7570: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
7580: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
7590: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
75a0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
75b0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
75c0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
75d0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
75e0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
75f0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
7600: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
7610: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
7620: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
7630: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
7640: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
7650: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
7660: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
7670: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
7680: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
7690: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
76a0: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
76b0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 29 3b 0a  ctionName, -1);.
76c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
76d0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
76e0: 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74  nc8, nArg, eText
76f0: 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  Rep, p, xFunc, x
7700: 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20  Step, xFinal);. 
7710: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7720: 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63  b, zFunc8);.  rc
7730: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
7740: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
7750: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
7760: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
7770: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
7780: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  if.../*.** Decla
7790: 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69  re that a functi
77a0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
77b0: 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74  loaded by a virt
77c0: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
77d0: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
77e0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
77f0: 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f  as a regular glo
7800: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  bal function, th
7810: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
7820: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
7830: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
7840: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
7850: 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61  then create.** a
7860: 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c   new one that al
7870: 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75  ways throws a ru
7880: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a  n-time error.  .
7890: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75  **.** When virtu
78a0: 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64  al tables intend
78b0: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f   to provide an o
78c0: 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69  verloaded functi
78d0: 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75  on, they.** shou
78e0: 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ld call this rou
78f0: 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  tine to make sur
7900: 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  e the global fun
7910: 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a  ction exists..**
7920: 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69   A global functi
7930: 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e  on must exist in
7940: 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20   order for name 
7950: 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f  resolution to wo
7960: 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a  rk.** properly..
7970: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
7980: 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
7990: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
79a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
79b0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
79c0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20  .){.  int nName 
79d0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
79e0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20  0(zName);.  int 
79f0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
7a00: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7a10: 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tex);.  if( sqli
7a20: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
7a30: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  db, zName, nName
7a40: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
7a50: 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  TF8, 0)==0 ){.  
7a60: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
7a70: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
7a80: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
7a90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7aa0: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
7ab0: 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f  e3InvalidFunctio
7ac0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  n, 0, 0);.  }.  
7ad0: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
7ae0: 78 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  xit(db, SQLITE_O
7af0: 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  K);.  sqlite3_mu
7b00: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7b10: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
7b20: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
7b30: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
7b40: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
7b50: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e   trace function.
7b60: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
7b70: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
7b80: 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a  egistered trace.
7b90: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
7ba0: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74   .**.** A NULL t
7bb0: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  race function me
7bc0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63  ans that no trac
7bd0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
7be0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
7bf0: 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74  trace is a point
7c00: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
7c10: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
7c20: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
7c30: 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61   each.** SQL sta
7c40: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
7c50: 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73  *sqlite3_trace(s
7c60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
7c70: 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a   (*xTrace)(void*
7c80: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76  ,const char*), v
7c90: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f  oid *pArg){.  vo
7ca0: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
7cb0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7cc0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
7cd0: 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41  ld = db->pTraceA
7ce0: 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65  rg;.  db->xTrace
7cf0: 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d   = xTrace;.  db-
7d00: 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
7d10: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
7d20: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
7d30: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
7d40: 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ld;.}./*.** Regi
7d50: 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66  ster a profile f
7d60: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
7d70: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
7d80: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
7d90: 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75  d .** profile fu
7da0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  nction is return
7db0: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
7dc0: 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  LL profile funct
7dd0: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
7de0: 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65  o profiling is e
7df0: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
7e00: 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  NULL.** profile 
7e10: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
7e20: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
7e30: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
7e40: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a  e conclusion of.
7e50: 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ** each SQL stat
7e60: 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75  ement that is ru
7e70: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
7e80: 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73  te3_profile(.  s
7e90: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
7ea0: 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76  id (*xProfile)(v
7eb0: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
7ec0: 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c  ,sqlite_uint64),
7ed0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
7ee0: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20  .  void *pOld;. 
7ef0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7f00: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
7f10: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50  .  pOld = db->pP
7f20: 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d  rofileArg;.  db-
7f30: 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f  >xProfile = xPro
7f40: 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f  file;.  db->pPro
7f50: 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  fileArg = pArg;.
7f60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7f70: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7f80: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
7f90: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7fa0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
7fb0: 2f 0a 0a 2f 2a 2a 2a 20 45 58 50 45 52 49 4d 45  /../*** EXPERIME
7fc0: 4e 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52  NTAL ***.**.** R
7fd0: 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69  egister a functi
7fe0: 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
7ff0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
8000: 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a  ion comments..**
8010: 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20   If the invoked 
8020: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
8030: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
8040: 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d  the commit becom
8050: 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  es a.** rollback
8060: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
8070: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a  e3_commit_hook(.
8080: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
8090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
80a0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
80b0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
80c0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c  */.  int (*xCall
80d0: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f  back)(void*),  /
80e0: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e  * Function to in
80f0: 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d  voke on each com
8100: 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  mit */.  void *p
8110: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
8120: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
8130: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
8140: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  /.){.  void *pOl
8150: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  d;.  sqlite3_mut
8160: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
8170: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
8180: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20  ->pCommitArg;.  
8190: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
81a0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
81b0: 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  .  db->pCommitAr
81c0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
81d0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
81e0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
81f0: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a  turn pOld;.}../*
8200: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
8210: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
8220: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
8230: 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
8240: 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
8250: 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
8260: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
8270: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
8280: 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65   *sqlite3_update
8290: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
82a0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
82b0: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
82c0: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
82d0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
82e0: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
82f0: 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  id*,int,char con
8300: 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20  st *,char const 
8310: 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c  *,sqlite_int64),
8320: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8340: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
8350: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
8360: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
8370: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8380: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
8390: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64   pRet = db->pUpd
83a0: 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55  ateArg;.  db->xU
83b0: 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20  pdateCallback = 
83c0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
83d0: 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  >pUpdateArg = pA
83e0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
83f0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
8400: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
8410: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
8420: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
8430: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
8440: 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
8450: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
8460: 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69  d.** back by thi
8470: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
8480: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
8490: 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
84a0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
84b0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
84c0: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
84d0: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
84e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
84f0: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
8500: 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63  id*), /* Callbac
8510: 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
8520: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
8530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
8540: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
8550: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
8560: 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
8570: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8580: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
8590: 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  et = db->pRollba
85a0: 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f  ckArg;.  db->xRo
85b0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d  llbackCallback =
85c0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
85d0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d  ->pRollbackArg =
85e0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
85f0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8600: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
8610: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
8620: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
8630: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d  eturns true if m
8640: 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c  ain-memory shoul
8650: 64 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  d be used instea
8660: 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72  d of.** a tempor
8670: 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61  ary file for tra
8680: 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c  nsient pager fil
8690: 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  es and statement
86a0: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
86b0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
86c0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
86d0: 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d  value of db->tem
86e0: 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65  p_store (runtime
86f0: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61  .** parameter) a
8700: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74  nd the compile t
8710: 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c  ime value of SQL
8720: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20  ITE_TEMP_STORE. 
8730: 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
8740: 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
8750: 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
8760: 70 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20  p between these 
8770: 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e  two values.** an
8780: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73  d this functions
8790: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a   return value..*
87a0: 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45  *.**   SQLITE_TE
87b0: 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d  MP_STORE     db-
87c0: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20  >temp_store     
87d0: 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70  Location of temp
87e0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  orary database.*
87f0: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
8800: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
8840: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
8850: 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20         any      
8860: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
8870: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
8880: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
8890: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
88b0: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
88c0: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
8900: 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 1).**   1     
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
8930: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
8940: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
8970: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
8980: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
8990: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
89a0: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
89b0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
89c0: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
89d0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
89e0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
8a00: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
8a10: 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20  .**   3         
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
8a40: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
8a50: 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1).*/.int sqlit
8a60: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63  e3TempInMemory(c
8a70: 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62  onst sqlite3 *db
8a80: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  ){.#if SQLITE_TE
8a90: 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65  MP_STORE==1.  re
8aa0: 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
8ab0: 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64  store==2 );.#end
8ac0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
8ad0: 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65  MP_STORE==2.  re
8ae0: 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
8af0: 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64  store!=1 );.#end
8b00: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
8b10: 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65  MP_STORE==3.  re
8b20: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23  turn 1;.#endif.#
8b30: 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
8b40: 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45  TORE<1 || SQLITE
8b50: 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20  _TEMP_STORE>3.  
8b60: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
8b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8b80: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8b90: 20 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 6e   to create a con
8ba0: 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74  nection to a dat
8bb0: 61 62 61 73 65 20 42 54 72 65 65 0a 2a 2a 20 64  abase BTree.** d
8bc0: 72 69 76 65 72 2e 20 20 49 66 20 7a 46 69 6c 65  river.  If zFile
8bd0: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
8be0: 20 6f 66 20 61 20 66 69 6c 65 2c 20 74 68 65 6e   of a file, then
8bf0: 20 74 68 61 74 20 66 69 6c 65 20 69 73 0a 2a 2a   that file is.**
8c00: 20 6f 70 65 6e 65 64 20 61 6e 64 20 75 73 65 64   opened and used
8c10: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
8c20: 69 73 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  is the magic nam
8c30: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  e ":memory:" the
8c40: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
8c50: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  e is stored in m
8c60: 65 6d 6f 72 79 20 28 61 6e 64 20 69 73 20 74 68  emory (and is th
8c70: 75 73 20 66 6f 72 67 6f 74 74 65 6e 20 61 73 20  us forgotten as 
8c80: 73 6f 6f 6e 20 61 73 0a 2a 2a 20 74 68 65 20 63  soon as.** the c
8c90: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f  onnection is clo
8ca0: 73 65 64 2e 29 20 20 49 66 20 7a 46 69 6c 65 6e  sed.)  If zFilen
8cb0: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
8cc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
8cd0: 20 69 73 20 61 20 22 76 69 72 74 75 61 6c 22 20   is a "virtual" 
8ce0: 64 61 74 61 62 61 73 65 20 66 6f 72 20 74 72 61  database for tra
8cf0: 6e 73 69 65 6e 74 20 75 73 65 20 6f 6e 6c 79 20  nsient use only 
8d00: 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 20 61  and is deleted a
8d10: 73 0a 2a 2a 20 73 6f 6f 6e 20 61 73 20 74 68 65  s.** soon as the
8d20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
8d30: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76  losed..**.** A v
8d40: 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  irtual database 
8d50: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20  can be either a 
8d60: 64 69 73 6b 20 66 69 6c 65 20 28 74 68 61 74 20  disk file (that 
8d70: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
8d80: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
8d90: 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
8da0: 73 65 64 29 20 6f 72 20 69 74 20 61 6e 20 62 65  sed) or it an be
8db0: 20 68 65 6c 64 20 65 6e 74 69 72 65 6c 79 20 69   held entirely i
8dc0: 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65  n memory..** The
8dd0: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
8de0: 6d 6f 72 79 28 29 20 66 75 6e 63 74 69 6f 6e 20  mory() function 
8df0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
8e00: 6d 69 6e 65 20 77 68 69 63 68 2e 0a 2a 2f 0a 69  mine which..*/.i
8e10: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
8e20: 61 63 74 6f 72 79 28 0a 20 20 63 6f 6e 73 74 20  actory(.  const 
8e30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
8e40: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61      /* Main data
8e50: 62 61 73 65 20 77 68 65 6e 20 6f 70 65 6e 69 6e  base when openin
8e60: 67 20 61 75 78 20 6f 74 68 65 72 77 69 73 65 20  g aux otherwise 
8e70: 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 */.  const cha
8e80: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
8e90: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8ea0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
8eb0: 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
8ec0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74  se */.  int omit
8ed0: 4a 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20 20 20  Journal,        
8ee0: 20 20 2f 2a 20 69 66 20 54 52 55 45 20 74 68 65    /* if TRUE the
8ef0: 6e 20 64 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  n do not journal
8f00: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
8f10: 69 6e 74 20 6e 43 61 63 68 65 2c 20 20 20 20 20  int nCache,     
8f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
8f30: 20 6d 61 6e 79 20 70 61 67 65 73 20 69 6e 20 74   many pages in t
8f40: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 2a 2f  he page cache */
8f50: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c  .  int vfsFlags,
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f70: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
8f80: 6f 75 67 68 20 74 6f 20 76 66 73 4f 70 65 6e 20  ough to vfsOpen 
8f90: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
8fa0: 74 72 65 65 20 20 20 20 20 20 20 20 20 20 20 2f  tree           /
8fb0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
8fc0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72   Btree object wr
8fd0: 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
8fe0: 0a 20 20 69 6e 74 20 62 74 46 6c 61 67 73 20 3d  .  int btFlags =
8ff0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
9000: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9010: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
9020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9030: 73 65 72 74 28 20 70 70 42 74 72 65 65 20 21 3d  sert( ppBtree !=
9040: 20 30 29 3b 0a 20 20 69 66 28 20 6f 6d 69 74 4a   0);.  if( omitJ
9050: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 62 74  ournal ){.    bt
9060: 46 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4f  Flags |= BTREE_O
9070: 4d 49 54 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d  MIT_JOURNAL;.  }
9080: 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73  .  if( db->flags
9090: 20 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64   & SQLITE_NoRead
90a0: 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 62 74 46 6c  lock ){.    btFl
90b0: 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f  ags |= BTREE_NO_
90c0: 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 23 69  READLOCK;.  }.#i
90d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
90e0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28  T_MEMORYDB.  if(
90f0: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 26 26   zFilename==0 &&
9100: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
9110: 6d 6f 72 79 28 64 62 29 20 29 7b 0a 20 20 20 20  mory(db) ){.    
9120: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65  zFilename = ":me
9130: 6d 6f 72 79 3a 22 3b 0a 20 20 7d 0a 23 65 6e 64  mory:";.  }.#end
9140: 69 66 0a 0a 20 20 69 66 28 20 28 76 66 73 46 6c  if..  if( (vfsFl
9150: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
9160: 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
9170: 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c   (zFilename==0 |
9180: 7c 20 2a 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 29  | *zFilename==0)
9190: 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73   ){.    vfsFlags
91a0: 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e   = (vfsFlags & ~
91b0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
91c0: 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _DB) | SQLITE_OP
91d0: 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a  EN_TEMP_DB;.  }.
91e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
91f0: 72 65 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  reeOpen(zFilenam
9200: 65 2c 20 28 73 71 6c 69 74 65 33 20 2a 29 64 62  e, (sqlite3 *)db
9210: 2c 20 70 70 42 74 72 65 65 2c 20 62 74 46 6c 61  , ppBtree, btFla
9220: 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 0a  gs, vfsFlags);..
9230: 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
9240: 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
9250: 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
9260: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
9270: 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a  size to the.  **
9280: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
9290: 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 63  Except, if the c
92a0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  all to BtreeOpen
92b0: 28 29 20 72 65 74 75 72 6e 65 64 20 61 20 68 61  () returned a ha
92c0: 6e 64 6c 65 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f  ndle.  ** open o
92d0: 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
92e0: 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
92f0: 2c 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  , do not change 
9300: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
9310: 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f  .  ** size..  */
9320: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
9330: 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74  E_OK && 0==sqlit
9340: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 2a 70  e3BtreeSchema(*p
9350: 70 42 74 72 65 65 2c 20 30 2c 20 30 29 20 29 7b  pBtree, 0, 0) ){
9360: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
9370: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 2a 70  eSetCacheSize(*p
9380: 70 42 74 72 65 65 2c 20 6e 43 61 63 68 65 29 3b  pBtree, nCache);
9390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
93a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
93b0: 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  n UTF-8 encoded 
93c0: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
93d0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
93e0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
93f0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
9400: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
9410: 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20  _errmsg(sqlite3 
9420: 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
9430: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  ar *z;.  if( !db
9440: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
9450: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
9460: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a  ITE_NOMEM);.  }.
9470: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
9480: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
9490: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
94a0: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
94b0: 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29  r(SQLITE_MISUSE)
94c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
94d0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
94e0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
94f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9500: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
9510: 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
9520: 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OMEM);.  }else{.
9530: 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73      z = (char*)s
9540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
9550: 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  t(db->pErr);.   
9560: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
9570: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9580: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
9590: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
95a0: 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
95b0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
95c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
95d0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
95e0: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
95f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9600: 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
9610: 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63  eturn UTF-16 enc
9620: 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
9630: 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
9640: 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
9650: 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
9660: 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
9670: 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73  lite3_errmsg16(s
9680: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
9690: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
96a0: 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20  outOfMem[] = {. 
96b0: 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
96c0: 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c  , ' ', 'o', 'f',
96d0: 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20   ' ', 'm', 'e', 
96e0: 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27  'm', 'o', 'r', '
96f0: 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61  y', 0.  };.  sta
9700: 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69  tic const u16 mi
9710: 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  suse[] = {.    '
9720: 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72  l', 'i', 'b', 'r
9730: 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27  ', 'a', 'r', 'y'
9740: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c  , ' ', .    'r',
9750: 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
9760: 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27  'i', 'n', 'e', '
9770: 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61   ', .    'c', 'a
9780: 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27  ', 'l', 'l', 'e'
9790: 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'd', ' ', .   
97a0: 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
97b0: 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
97c0: 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73  f', ' ', .    's
97d0: 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27  ', 'e', 'q', 'u'
97e0: 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c  , 'e', 'n', 'c',
97f0: 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20   'e', 0.  };..  
9800: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20  const void *z;. 
9810: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
9820: 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f  return (void *)o
9830: 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69  utOfMem;.  }.  i
9840: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
9850: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
9860: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
9870: 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b   (void *)misuse;
9880: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
9890: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
98a0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
98b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
98c0: 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a  .    z = (void *
98d0: 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c  )outOfMem;.  }el
98e0: 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  se{.    z = sqli
98f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
9900: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
9910: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
9920: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
9930: 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
9940: 31 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  1, sqlite3ErrStr
9950: 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a 20  (db->errCode),. 
9960: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
9970: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
9980: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20 3d  ATIC);.      z =
9990: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
99a0: 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
99b0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20  .    }.    /* A 
99c0: 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76  malloc() may hav
99d0: 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20  e failed within 
99e0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
99f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
9a00: 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e  ().    ** above.
9a10: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
9a20: 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64  case, then the d
9a30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9a40: 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20  flag needs to.  
9a50: 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20    ** be cleared 
9a60: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
9a70: 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63 74  . Do this direct
9a80: 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76  ly, instead of v
9a90: 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  ia.    ** sqlite
9aa0: 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61  3ApiExit(), to a
9ab0: 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68 65  void setting the
9ac0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
9ad0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
9ae0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d      */.    db->m
9af0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
9b00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
9b10: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
9b20: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9b30: 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
9b40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
9b50: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
9b60: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
9b70: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e  t error code gen
9b80: 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c  erated by an SQL
9b90: 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20  ite routine. If 
9ba0: 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65  NULL is.** passe
9bb0: 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
9bc0: 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20  on, we assume a 
9bd0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
9be0: 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  during sqlite3_o
9bf0: 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pen()..*/.int sq
9c00: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71  lite3_errcode(sq
9c10: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
9c20: 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33  ( db && !sqlite3
9c30: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
9c40: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
9c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
9c60: 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  USE;.  }.  if( !
9c70: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
9c80: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
9c90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9ca0: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
9cb0: 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
9cc0: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
9cd0: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
9ce0: 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
9cf0: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
9d00: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
9d10: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
9d20: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
9d30: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
9d40: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
9d50: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
9d60: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
9d70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9d80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
9d90: 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errCode;.}../*.*
9da0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
9db0: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
9dc0: 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22  n for database "
9dd0: 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69  db".  The name i
9de0: 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74  s zName.** and t
9df0: 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65  he encoding is e
9e00: 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nc..*/.static in
9e10: 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  t createCollatio
9e20: 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
9e30: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
9e40: 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
9e50: 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
9e60: 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
9e70: 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
9e80: 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
9e90: 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
9ea0: 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
9eb0: 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
9ec0: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32  Coll;.  int enc2
9ed0: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  ;.  int nName = 
9ee0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9ef0: 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73  zName);.  .  ass
9f00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9f10: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
9f20: 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  x) );..  /* If S
9f30: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
9f40: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
9f50: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
9f60: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
9f70: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
9f80: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
9f90: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
9fa0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
9fb0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
9fc0: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
9fd0: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
9fe0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
9ff0: 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20  .  enc2 = enc;. 
a000: 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d   testcase( enc2=
a010: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b  =SQLITE_UTF16 );
a020: 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
a030: 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
a040: 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28  ALIGNED );.  if(
a050: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
a060: 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c  F16 || enc2==SQL
a070: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
a080: 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20  D ){.    enc2 = 
a090: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
a0a0: 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e  VE;.  }.  if( en
a0b0: 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c2<SQLITE_UTF8 |
a0c0: 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54  | enc2>SQLITE_UT
a0d0: 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74  F16BE ){.    ret
a0e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
a0f0: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  E;.  }..  /* Che
a100: 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
a110: 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
a120: 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
a130: 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
a140: 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
a150: 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
a160: 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
a170: 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
a180: 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
a190: 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
a1a0: 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
a1b0: 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
a1c0: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ents..  */.  pCo
a1d0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
a1e0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
a1f0: 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  enc2, zName, 0);
a200: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
a210: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
a220: 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76     if( db->activ
a230: 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20  eVdbeCnt ){.    
a240: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
a250: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
a260: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
a270: 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
a280: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
a290: 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69  ence due to acti
a2a0: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
a2b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
a2c0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
a2d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
a2e0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
a2f0: 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f  ents(db);..    /
a300: 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  * If collation s
a310: 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61  equence pColl wa
a320: 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74  s created direct
a330: 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ly by a call to.
a340: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
a350: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c  reate_collation,
a360: 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74   and not generat
a370: 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  ed by synthCollS
a380: 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65  eq(),.    ** the
a390: 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64  n any copies mad
a3a0: 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  e by synthCollSe
a3b0: 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69  q() need to be i
a3c0: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20  nvalidated..    
a3d0: 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69  ** Also, collati
a3e0: 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20  on destructor - 
a3f0: 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d  CollSeq.xDel() -
a400: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65   function may ne
a410: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
a420: 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a  called..    */ .
a430: 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e      if( (pColl->
a440: 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54  enc & ~SQLITE_UT
a450: 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e  F16_ALIGNED)==en
a460: 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  c2 ){.      Coll
a470: 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *aColl = sql
a480: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
a490: 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
a4a0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, nName);.     
a4b0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
a4c0: 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
a4d0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
a4e0: 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d  q *p = &aColl[j]
a4f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
a500: 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
a510: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a520: 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20  ( p->xDel ){.   
a530: 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c           p->xDel
a540: 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20  (p->pUser);.    
a550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a560: 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20    p->xCmp = 0;. 
a570: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
a590: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
a5a0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
a5b0: 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29  )enc2, zName, 1)
a5c0: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b  ;.  if( pColl ){
a5d0: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  .    pColl->xCmp
a5e0: 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 20   = xCompare;.   
a5f0: 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
a600: 70 43 74 78 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d  pCtx;.    pColl-
a610: 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
a620: 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28    pColl->enc = (
a630: 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20  u8)(enc2 | (enc 
a640: 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  & SQLITE_UTF16_A
a650: 4c 49 47 4e 45 44 29 29 3b 0a 20 20 7d 0a 20 20  LIGNED));.  }.  
a660: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
a670: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
a680: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a690: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK;.}.../*.** Th
a6a0: 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73  is array defines
a6b0: 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
a6c0: 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75  ds on limit valu
a6d0: 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74  es.  The.** init
a6e0: 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20  ializer must be 
a6f0: 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74  kept in sync wit
a700: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d  h the SQLITE_LIM
a710: 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73  IT_*.** #defines
a720: 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a   in sqlite3.h..*
a730: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69  /.static const i
a740: 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20  nt aHardLimit[] 
a750: 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  = {.  SQLITE_MAX
a760: 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
a770: 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
a780: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
a790: 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f  OLUMN,.  SQLITE_
a7a0: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a  MAX_EXPR_DEPTH,.
a7b0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d    SQLITE_MAX_COM
a7c0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20  POUND_SELECT,.  
a7d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
a7e0: 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  OP,.  SQLITE_MAX
a7f0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20  _FUNCTION_ARG,. 
a800: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
a810: 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  CHED,.  SQLITE_M
a820: 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
a830: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
a840: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
a850: 4d 42 45 52 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  MBER,.};../*.** 
a860: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61  Make sure the ha
a870: 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65  rd limits are se
a880: 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20  t to reasonable 
a890: 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51  values.*/.#if SQ
a8a0: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c  LITE_MAX_LENGTH<
a8b0: 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
a8c0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75  TE_MAX_LENGTH mu
a8d0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
a8e0: 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
a8f0: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
a900: 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
a910: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
a920: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
a930: 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
a940: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
a950: 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49  _SQL_LENGTH>SQLI
a960: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20  TE_MAX_LENGTH.# 
a970: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
a980: 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
a990: 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20   not be greater 
a9a0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
a9b0: 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69  LENGTH.#endif.#i
a9c0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  f SQLITE_MAX_COM
a9d0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23  POUND_SELECT<2.#
a9e0: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
a9f0: 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
aa00: 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  T must be at lea
aa10: 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 2.#endif.#if 
aa20: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
aa30: 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51  OP<40.# error SQ
aa40: 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
aa50: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
aa60: 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  t 40.#endif.#if 
aa70: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
aa80: 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c  ION_ARG<0 || SQL
aa90: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
aaa0: 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f  _ARG>1000.# erro
aab0: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
aac0: 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
aad0: 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
aae0: 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  1000.#endif.#if 
aaf0: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
ab00: 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  HED<0 || SQLITE_
ab10: 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a  MAX_ATTACHED>30.
ab20: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
ab30: 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
ab40: 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
ab50: 64 20 33 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  d 30.#endif.#if 
ab60: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
ab70: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
ab80: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
ab90: 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
aba0: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
abb0: 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
abc0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
abd0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
abe0: 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
abf0: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
ac00: 55 4d 42 45 52 20 6d 75 73 74 20 62 65 20 61 74  UMBER must be at
ac10: 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
ac20: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
ac30: 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72  OLUMN>32767.# er
ac40: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
ac50: 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65  OLUMN must not e
ac60: 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64  xceed 32767.#end
ac70: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
ac80: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
ac90: 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
aca0: 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
acb0: 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
acc0: 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
acd0: 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
ace0: 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
acf0: 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
ad00: 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
ad10: 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
ad20: 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
ad30: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
ad40: 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
ad50: 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
ad60: 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
ad70: 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
ad80: 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
ad90: 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
ada0: 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
adb0: 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
adc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
add0: 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
ade0: 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
adf0: 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
ae00: 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 20 20  int oldLimit;.  
ae10: 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
ae20: 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
ae30: 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
ae40: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
ae50: 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
ae60: 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
ae70: 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
ae80: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65  =0 ){.    if( ne
ae90: 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69  wLimit>aHardLimi
aea0: 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20  t[limitId] ){.  
aeb0: 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61      newLimit = a
aec0: 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  HardLimit[limitI
aed0: 64 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  d];.    }.    db
aee0: 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
aef0: 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  ] = newLimit;.  
af00: 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69  }.  return oldLi
af10: 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  mit;.}../*.** Th
af20: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
af30: 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e  the work of open
af40: 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f  ing a database o
af50: 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73  n behalf of.** s
af60: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e  qlite3_open() an
af70: 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  d sqlite3_open16
af80: 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  (). The database
af90: 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65   filename "zFile
afa0: 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54  name"  .** is UT
afb0: 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a  F-8 encoded..*/.
afc0: 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44  static int openD
afd0: 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74  atabase(.  const
afe0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
aff0: 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69  , /* Database fi
b000: 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63  lename UTF-8 enc
b010: 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  oded */.  sqlite
b020: 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20  3 **ppDb,       
b030: 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65   /* OUT: Returne
b040: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
b050: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
b060: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 2f 2a  flags,        /*
b070: 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61   Operational fla
b080: 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
b090: 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f  ar *zVfs       /
b0a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46  * Name of the VF
b0b0: 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  S to use */.){. 
b0c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
b0d0: 69 6e 74 20 72 63 3b 0a 20 20 43 6f 6c 6c 53 65  int rc;.  CollSe
b0e0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
b0f0: 69 73 54 68 72 65 61 64 73 61 66 65 3b 0a 0a 20  isThreadsafe;.. 
b100: 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e   *ppDb = 0;.#ifn
b110: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b120: 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20  AUTOINIT.  rc = 
b130: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
b140: 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ze();.  if( rc )
b150: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
b160: 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  if..  if( sqlite
b170: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
b180: 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  oreMutex==0 ){. 
b190: 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
b1a0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
b1b0: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
b1c0: 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a  OPEN_NOMUTEX ){.
b1d0: 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
b1e0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
b1f0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
b200: 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
b210: 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
b220: 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  afe = 1;.  }else
b230: 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
b240: 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  fe = sqlite3Glob
b250: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
b260: 74 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  tex;.  }..  /* R
b270: 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
b280: 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
b290: 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  s parameter.  **
b2a0: 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  .  ** The SQLITE
b2b0: 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e  _OPEN_NOMUTEX an
b2c0: 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  d SQLITE_OPEN_FU
b2d0: 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65  LLMUTEX flags we
b2e0: 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69  re.  ** dealt wi
b2f0: 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  th in the previo
b300: 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20  us code block.  
b310: 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74  Besides these, t
b320: 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c  he only.  ** val
b330: 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66  id input flags f
b340: 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
b350: 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f  v2() are SQLITE_
b360: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20  OPEN_READONLY,. 
b370: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
b380: 52 45 41 44 57 52 49 54 45 2c 20 61 6e 64 20 53  READWRITE, and S
b390: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
b3a0: 45 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73  E.  Silently mas
b3b0: 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f  k.  ** off all o
b3c0: 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f  ther flags..  */
b3d0: 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
b3e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
b3f0: 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
b400: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
b410: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
b420: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
b430: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
b440: 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20  IN_DB |.        
b450: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
b460: 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20  EN_TEMP_DB | .  
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
b480: 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
b490: 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  NT_DB | .       
b4a0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
b4b0: 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
b4c0: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
b4d0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
b4e0: 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  EMP_JOURNAL | . 
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
b500: 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
b510: 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
b520: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
b530: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
b540: 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L |.            
b550: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e     SQLITE_OPEN_N
b560: 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  OMUTEX |.       
b570: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
b580: 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20  PEN_FULLMUTEX.  
b590: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
b5a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
b5b0: 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
b5c0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
b5d0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
b5e0: 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
b5f0: 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
b600: 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
b610: 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68  _out;.  if( isTh
b620: 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20  readsafe ){.    
b630: 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
b640: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
b650: 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
b660: 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
b670: 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
b680: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
b690: 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
b6a0: 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
b6b0: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
b6c0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
b6d0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
b6e0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
b6f0: 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
b700: 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
b710: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
b720: 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
b730: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
b740: 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
b750: 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
b760: 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
b770: 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
b780: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
b790: 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
b7a0: 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
b7b0: 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f  ));.  db->autoCo
b7c0: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e  mmit = 1;.  db->
b7d0: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31  nextAutovac = -1
b7e0: 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  ;.  db->nextPage
b7f0: 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  size = 0;.  db->
b800: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
b810: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 0a 23 69  ShortColNames.#i
b820: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
b830: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20  _FILE_FORMAT<4. 
b840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b850: 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  | SQLITE_LegacyF
b860: 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69  ileFmt.#endif.#i
b870: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b880: 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
b890: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
b8a0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64     | SQLITE_Load
b8b0: 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66  Extension.#endif
b8c0: 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
b8d0: 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
b8e0: 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
b8f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
b900: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
b910: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
b920: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
b930: 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20  dif..  db->pVfs 
b940: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
b950: 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
b960: 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20  !db->pVfs ){.   
b970: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
b980: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
b990: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e 6f  rror(db, rc, "no
b9a0: 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
b9b0: 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20  zVfs);.    goto 
b9c0: 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
b9d0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
b9e0: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
b9f0: 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
ba00: 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
ba10: 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
ba20: 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
ba30: 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
ba40: 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
ba50: 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
ba60: 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
ba70: 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
ba80: 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
ba90: 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
baa0: 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
bab0: 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
bac0: 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
bad0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
bae0: 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
baf0: 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
bb00: 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
bb10: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
bb20: 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
bb30: 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
bb40: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
bb50: 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
bb60: 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16LE, 0, binCol
bb70: 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
bb80: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
bb90: 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45   "RTRIM", SQLITE
bba0: 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c  _UTF8, (void*)1,
bbb0: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
bbc0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
bbd0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
bbe0: 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
bbf0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74  .  }.  db->pDflt
bc00: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
bc10: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  ndCollSeq(db, SQ
bc20: 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41  LITE_UTF8, "BINA
bc30: 52 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  RY", 0);.  asser
bc40: 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  t( db->pDfltColl
bc50: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  !=0 );..  /* Als
bc60: 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20 63 61  o add a UTF-8 ca
bc70: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63  se-insensitive c
bc80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
bc90: 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  e. */.  createCo
bca0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43  llation(db, "NOC
bcb0: 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ASE", SQLITE_UTF
bcc0: 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c  8, 0, nocaseColl
bcd0: 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a  atingFunc, 0);..
bce0: 20 20 2f 2a 20 53 65 74 20 66 6c 61 67 73 20 6f    /* Set flags o
bcf0: 6e 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63  n the built-in c
bd00: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
bd10: 65 73 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c  es */.  db->pDfl
bd20: 74 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51  tColl->type = SQ
bd30: 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
bd40: 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  pColl = sqli
bd50: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
bd60: 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
bd70: 22 4e 4f 43 41 53 45 22 2c 20 30 29 3b 0a 20 20  "NOCASE", 0);.  
bd80: 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
bd90: 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53   pColl->type = S
bda0: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53  QLITE_COLL_NOCAS
bdb0: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  E;.  }..  /* Ope
bdc0: 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
bdd0: 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
bde0: 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  .  db->openFlags
bdf0: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d   = flags;.  rc =
be00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63   sqlite3BtreeFac
be10: 74 6f 72 79 28 64 62 2c 20 7a 46 69 6c 65 6e 61  tory(db, zFilena
be20: 6d 65 2c 20 30 2c 20 53 51 4c 49 54 45 5f 44 45  me, 0, SQLITE_DE
be30: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
be40: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c                fl
be60: 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ags | SQLITE_OPE
be70: 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20 20 20 20 20  N_MAIN_DB,.     
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b 30        &db->aDb[0
bea0: 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 72 63  ].pBt);.  if( rc
beb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bec0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bed0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
bee0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
bef0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
bf00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bf10: 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  (db, rc, 0);.   
bf20: 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
bf30: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b  ;.  }.  db->aDb[
bf40: 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  0].pSchema = sql
bf50: 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
bf60: 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  , db->aDb[0].pBt
bf70: 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
bf80: 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
bf90: 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
bfa0: 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  );...  /* The de
bfb0: 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76  fault safety_lev
bfc0: 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  el for the main 
bfd0: 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c  database is 'ful
bfe0: 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70  l'; for the temp
bff0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69  .  ** database i
c000: 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69  t is 'NONE'. Thi
c010: 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61  s matches the pa
c020: 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c  ger layer defaul
c030: 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d  ts.  .  */.  db-
c040: 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[0].zName = 
c050: 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44  "main";.  db->aD
c060: 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[0].safety_leve
c070: 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62  l = 3;.  db->aDb
c080: 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d  [1].zName = "tem
c090: 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
c0a0: 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
c0b0: 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  1;..  db->magic 
c0c0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
c0d0: 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  PEN;.  if( db->m
c0e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
c0f0: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
c100: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ut;.  }..  /* Re
c110: 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74  gister all built
c120: 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62  -in functions, b
c130: 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ut do not attemp
c140: 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20  t to read the.  
c150: 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ** database sche
c160: 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20  ma yet. This is 
c170: 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
c180: 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65  e first time the
c190: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69   database.  ** i
c1a0: 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f  s accessed..  */
c1b0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
c1c0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
c1d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69  );.  sqlite3Regi
c1e0: 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74  sterBuiltinFunct
c1f0: 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ions(db);..  /* 
c200: 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65  Load automatic e
c210: 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65  xtensions - exte
c220: 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  nsions that have
c230: 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64   been registered
c240: 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
c250: 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69  sqlite3_automati
c260: 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50  c_extension() AP
c270: 49 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  I..  */.  sqlite
c280: 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69  3AutoLoadExtensi
c290: 6f 6e 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  ons(db);.  rc = 
c2a0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
c2b0: 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  db);.  if( rc!=S
c2c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c2d0: 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
c2e0: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
c2f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
c300: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
c310: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
c320: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
c330: 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
c340: 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
c350: 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
c360: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
c370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c380: 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
c390: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c3a0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
c3b0: 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
c3c0: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
c3d0: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
c3e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
c3f0: 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
c400: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
c410: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
c420: 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S3.  if( !db->ma
c430: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
c440: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c450: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
c460: 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
c470: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
c480: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
c490: 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
c4a0: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
c4b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c4c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
c4d0: 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
c4e0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
c4f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
c500: 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
c510: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
c520: 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
c530: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
c540: 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
c550: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
c560: 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30  3Error(db, rc, 0
c570: 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  );..  /* -DSQLIT
c580: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
c590: 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
c5a0: 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
c5b0: 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
c5c0: 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
c5d0: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
c5e0: 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
c5f0: 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
c600: 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
c610: 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
c620: 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
c630: 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
c640: 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
c650: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
c660: 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
c670: 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
c680: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
c690: 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
c6a0: 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
c6b0: 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
c6c0: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
c6d0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
c700: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
c710: 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
c720: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20    /* Enable the 
c730: 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63  lookaside-malloc
c740: 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20   subsystem */.  
c750: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
c760: 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f  b, 0, sqlite3Glo
c770: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
c780: 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  aside,.         
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
c7a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
c7b0: 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a  ig.nLookaside);.
c7c0: 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69  .opendb_out:.  i
c7d0: 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73  f( db ){.    ass
c7e0: 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d  ert( db->mutex!=
c7f0: 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66  0 || isThreadsaf
c800: 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47  e==0 || sqlite3G
c810: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
c820: 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  lMutex==0 );.   
c830: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
c840: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
c850: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
c860: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
c870: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c880: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
c890: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
c8a0: 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20  ;.    db = 0;.  
c8b0: 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
c8c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
c8d0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
c8e0: 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20  E_MAGIC_SICK;.  
c8f0: 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a  }.  *ppDb = db;.
c900: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
c910: 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
c920: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
c930: 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
c940: 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
c950: 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
c960: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
c970: 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
c980: 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
c990: 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
c9a0: 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9c0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
c9d0: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
c9e0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
c9f0: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
ca00: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
ca10: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
ca20: 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
ca30: 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
ca40: 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
ca50: 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
ca60: 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
ca70: 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
ca80: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
ca90: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
caa0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
cab0: 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
cac0: 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
cad0: 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
cae0: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
caf0: 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
cb00: 70 70 44 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66  ppDb, flags, zVf
cb10: 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  s);.}..#ifndef S
cb20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
cb30: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
cb40: 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
cb50: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
cb60: 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73  3_open16(.  cons
cb70: 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
cb80: 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
cb90: 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63  ppDb.){.  char c
cba0: 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38  onst *zFilename8
cbb0: 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65  ;   /* zFilename
cbc0: 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d   encoded in UTF-
cbd0: 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46  8 instead of UTF
cbe0: 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -16 */.  sqlite3
cbf0: 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
cc00: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
cc10: 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  t( zFilename );.
cc20: 20 20 61 73 73 65 72 74 28 20 70 70 44 62 20 29    assert( ppDb )
cc30: 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23  ;.  *ppDb = 0;.#
cc40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cc50: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63  IT_AUTOINIT.  rc
cc60: 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69   = sqlite3_initi
cc70: 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72  alize();.  if( r
cc80: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
cc90: 65 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73  endif.  pVal = s
cca0: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
ccb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
ccc0: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
ccd0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c  , zFilename, SQL
cce0: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c  ITE_UTF16NATIVE,
ccf0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
cd00: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20  .  zFilename8 = 
cd10: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
cd20: 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
cd30: 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  F8);.  if( zFile
cd40: 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  name8 ){.    rc 
cd50: 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  = openDatabase(z
cd60: 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c  Filename8, ppDb,
cd70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cd80: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
cd90: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
cda0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
cdb0: 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  E, 0);.    asser
cdc0: 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d  t( *ppDb || rc==
cdd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
cde0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cdf0: 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50  TE_OK && !DbHasP
ce00: 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30  roperty(*ppDb, 0
ce10: 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
ce20: 64 29 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28  d) ){.      ENC(
ce30: 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f  *ppDb) = SQLITE_
ce40: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
ce50: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ce60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
ce70: 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  M;.  }.  sqlite3
ce80: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
ce90: 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
cea0: 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29  e3ApiExit(0, rc)
ceb0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
cec0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
ced0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
cee0: 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
cef0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
cf00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
cf10: 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
cf20: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
cf30: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
cf40: 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
cf50: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
cf60: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
cf70: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
cf80: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
cf90: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
cfa0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
cfb0: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
cfc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
cfd0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
cfe0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
cff0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
d000: 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
d010: 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
d020: 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  , enc, pCtx, xCo
d030: 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63 20  mpare, 0);.  rc 
d040: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
d050: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
d060: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d070: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
d080: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d090: 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
d0a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d0b0: 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
d0c0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
d0d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d0e0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
d0f0: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
d100: 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
d110: 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
d120: 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
d130: 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
d140: 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
d150: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
d160: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
d170: 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
d180: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
d190: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d1a0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d1b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
d1c0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d1d0: 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
d1e0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
d1f0: 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  e, enc, pCtx, xC
d200: 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20  ompare, xDel);. 
d210: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
d220: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
d230: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d240: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
d250: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d260: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d270: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
d280: 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
d290: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
d2a0: 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
d2b0: 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
d2c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
d2d0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36  eate_collation16
d2e0: 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
d2f0: 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
d300: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63  zName,.  int enc
d310: 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
d320: 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
d330: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
d340: 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
d350: 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
d360: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d370: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38  ;.  char *zName8
d380: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d390: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d3a0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
d3b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d3c0: 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71  );.  zName8 = sq
d3d0: 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
d3e0: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  , zName, -1);.  
d3f0: 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20  if( zName8 ){.  
d400: 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
d410: 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
d420: 38 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  8, enc, pCtx, xC
d430: 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20  ompare, 0);.    
d440: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d450: 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20  , zName8);.  }. 
d460: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
d470: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
d480: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d490: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
d4a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
d4b0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d4c0: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
d4d0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d4e0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
d4f0: 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
d500: 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
d510: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
d520: 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
d530: 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
d540: 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
d550: 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
d560: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d570: 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
d580: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
d590: 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
d5a0: 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
d5b0: 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28  d(*xCollNeeded)(
d5c0: 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
d5d0: 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
d5e0: 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71  t char*).){.  sq
d5f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d600: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d610: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
d620: 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20  = xCollNeeded;. 
d630: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
d640: 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43  16 = 0;.  db->pC
d650: 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70  ollNeededArg = p
d660: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20  CollNeededArg;. 
d670: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d680: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d690: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d6a0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
d6b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
d6c0: 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  6./*.** Register
d6d0: 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
d6e0: 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61  uence factory ca
d6f0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
d700: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
d710: 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61  ** db. Replace a
d720: 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ny previously in
d730: 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f  stalled collatio
d740: 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
d750: 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
d760: 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
d770: 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ded16(.  sqlite3
d780: 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
d790: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
d7a0: 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
d7b0: 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c  ded16)(void*,sql
d7c0: 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
d7d0: 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  ep,const void*).
d7e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
d7f0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d800: 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
d810: 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62  Needed = 0;.  db
d820: 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
d830: 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b  = xCollNeeded16;
d840: 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
d850: 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
d860: 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
d870: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d880: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d890: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d8a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d8b0: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
d8c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d8d0: 4d 49 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45  MIT_GLOBALRECOVE
d8e0: 52 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  R.#ifndef SQLITE
d8f0: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
d900: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
d910: 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61  tion is now an a
d920: 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75  nachronism. It u
d930: 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74  sed to be used t
d940: 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
d950: 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  .** malloc() fai
d960: 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65  lure, but SQLite
d970: 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61   now does this a
d980: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f  utomatically..*/
d990: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .int sqlite3_glo
d9a0: 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64  bal_recover(void
d9b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
d9c0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
d9d0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65  #endif../*.** Te
d9e0: 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  st to see whethe
d9f0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74  r or not the dat
da00: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
da10: 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
da20: 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75  t.** mode.  Retu
da30: 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
da40: 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f   and FALSE if no
da50: 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d  t.  Autocommit m
da60: 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20  ode is on.** by 
da70: 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f  default.  Autoco
da80: 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64  mmit is disabled
da90: 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74   by a BEGIN stat
daa0: 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62  ement and reenab
dab0: 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65  led.** by the ne
dac0: 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c  xt COMMIT or ROL
dad0: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  LBACK..**.******
dae0: 2a 20 54 48 49 53 20 49 53 20 41 4e 20 45 58 50  * THIS IS AN EXP
daf0: 45 52 49 4d 45 4e 54 41 4c 20 41 50 49 20 41 4e  ERIMENTAL API AN
db00: 44 20 49 53 20 53 55 42 4a 45 43 54 20 54 4f 20  D IS SUBJECT TO 
db10: 43 48 41 4e 47 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f  CHANGE ******.*/
db20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74  .int sqlite3_get
db30: 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69  _autocommit(sqli
db40: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
db50: 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  rn db->autoCommi
db60: 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  t;.}..#ifdef SQL
db70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
db80: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
db90: 75 74 69 6e 65 20 69 73 20 73 75 62 74 69 74 75  utine is subtitu
dba0: 74 65 64 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74  ted for constant
dbb0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
dbc0: 69 6e 0a 2a 2a 20 64 65 62 75 67 67 69 6e 67 20  in.** debugging 
dbd0: 62 75 69 6c 64 73 2e 20 20 54 68 69 73 20 70 72  builds.  This pr
dbe0: 6f 76 69 64 65 73 20 61 20 77 61 79 20 74 6f 20  ovides a way to 
dbf0: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
dc00: 20 66 6f 72 20 77 68 65 6e 0a 2a 2a 20 63 6f 72   for when.** cor
dc10: 72 75 70 74 69 6f 6e 20 69 73 20 66 69 72 73 74  ruption is first
dc20: 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e   detected..*/.in
dc30: 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74  t sqlite3Corrupt
dc40: 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
dc50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
dc60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
dc70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
dc80: 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
dc90: 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e  This is a conven
dca0: 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68  ience routine th
dcb0: 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  at makes sure th
dcc0: 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70  at all thread-sp
dcd0: 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66  ecific.** data f
dce0: 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68  or this thread h
dcf0: 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  as been dealloca
dd00: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ted..**.** SQLit
dd10: 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
dd20: 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
dd30: 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f   data so this ro
dd40: 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a  utine is now a.*
dd50: 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20  * no-op.  It is 
dd60: 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73  retained for his
dd70: 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
dd80: 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ility..*/.void s
dd90: 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
dda0: 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23  eanup(void){.}.#
ddb0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
ddc0: 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  urn meta informa
ddd0: 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65  tion about a spe
dde0: 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20  cific column of 
ddf0: 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
de00: 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
de10: 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73   in sqlite3.h (s
de20: 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20  qlite.h.in) for 
de30: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64  details..*/.#ifd
de40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
de50: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
de60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62  .int sqlite3_tab
de70: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
de80: 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ta(.  sqlite3 *d
de90: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
dea0: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
deb0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
dec0: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
ded0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
dee0: 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c  ase name or NULL
def0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
df00: 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20   *zTableName,   
df10: 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20    /* Table name 
df20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
df30: 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20  *zColumnName,   
df40: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
df50: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
df60: 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20  **pzDataType,   
df70: 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c   /* OUTPUT: Decl
df80: 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a  ared data type *
df90: 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
dfa0: 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20  *pzCollSeq,     
dfb0: 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61  /* OUTPUT: Colla
dfc0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
dfd0: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f  me */.  int *pNo
dfe0: 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  tNull,          
dff0: 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
e000: 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20  rue if NOT NULL 
e010: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74  constraint exist
e020: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69  s */.  int *pPri
e030: 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20  maryKey,        
e040: 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
e050: 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72  ue if column par
e060: 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74  t of PK */.  int
e070: 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20   *pAutoinc      
e080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
e090: 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
e0a0: 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65  mn is auto-incre
e0b0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
e0c0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
e0d0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c  rMsg = 0;.  Tabl
e0e0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43  e *pTab = 0;.  C
e0f0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b  olumn *pCol = 0;
e100: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20  .  int iCol;..  
e110: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74  char const *zDat
e120: 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  aType = 0;.  cha
e130: 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65  r const *zCollSe
e140: 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74  q = 0;.  int not
e150: 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  null = 0;.  int 
e160: 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a  primarykey = 0;.
e170: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20    int autoinc = 
e180: 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  0;..  /* Ensure 
e190: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
e1a0: 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61  ema has been loa
e1b0: 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
e1c0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
e1d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 28 76 6f 69 64  >mutex);.  (void
e1e0: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e  )sqlite3SafetyOn
e1f0: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
e200: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
e210: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
e220: 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
e230: 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  g);.  if( SQLITE
e240: 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67  _OK!=rc ){.    g
e250: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
e260: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
e270: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65  the table in que
e280: 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20  stion */.  pTab 
e290: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
e2a0: 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d  le(db, zTableNam
e2b0: 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  e, zDbName);.  i
e2c0: 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62  f( !pTab || pTab
e2d0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
e2e0: 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67   pTab = 0;.    g
e2f0: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
e300: 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
e310: 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69  e column for whi
e320: 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65  ch info is reque
e330: 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73 71  sted */.  if( sq
e340: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
e350: 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
e360: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
e370: 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  Key;.    if( iCo
e380: 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43  l>=0 ){.      pC
e390: 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
e3a0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20 20  [iCol];.    }.  
e3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
e3c0: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
e3d0: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
e3e0: 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
e3f0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
e400: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
e410: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
e420: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d  l->zName, zColum
e430: 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
e440: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e450: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
e460: 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  Col==pTab->nCol 
e470: 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
e480: 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 72  0;.      goto er
e490: 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ror_out;.    }. 
e4a0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
e4b0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f  lowing block sto
e4c0: 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66  res the meta inf
e4d0: 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
e4e0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20  ll be returned. 
e4f0: 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65   ** to the calle
e500: 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  r in local varia
e510: 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20  bles zDataType, 
e520: 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c  zCollSeq, notnul
e530: 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20  l, primarykey.  
e540: 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20  ** and autoinc. 
e550: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
e560: 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73  ere are two poss
e570: 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20  ibilities:.  ** 
e580: 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65  .  **     1. The
e590: 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d   specified colum
e5a0: 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64  n name was rowid
e5b0: 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f  ", "oid" or "_ro
e5c0: 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20  wid_" .  **     
e5d0: 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20     and there is 
e5e0: 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65  no explicitly de
e5f0: 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d  clared IPK colum
e600: 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  n. .  **.  **   
e610: 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69    2. The table i
e620: 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64  s not a view and
e630: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
e640: 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a   identified an .
e650: 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c    **        expl
e660: 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
e670: 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74  column. Copy met
e680: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
e690: 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a  om *pCol..  */ .
e6a0: 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20    if( pCol ){.  
e6b0: 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43    zDataType = pC
e6c0: 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a  ol->zType;.    z
e6d0: 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e  CollSeq = pCol->
e6e0: 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75  zColl;.    notnu
e6f0: 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75  ll = pCol->notNu
e700: 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61  ll!=0;.    prima
e710: 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e 69  rykey  = pCol->i
e720: 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20 20  sPrimKey!=0;.   
e730: 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d   autoinc = pTab-
e740: 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20  >iPKey==iCol && 
e750: 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
e760: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
e770: 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  nt)!=0;.  }else{
e780: 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
e790: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
e7a0: 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a  primarykey = 1;.
e7b0: 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c    }.  if( !zColl
e7c0: 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c  Seq ){.    zColl
e7d0: 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  Seq = "BINARY";.
e7e0: 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a    }..error_out:.
e7f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
e800: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 28 76  aveAll(db);.  (v
e810: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
e820: 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  yOff(db);..  /* 
e830: 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63  Whether the func
e840: 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65  tion call succee
e850: 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73  ded or failed, s
e860: 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  et the output pa
e870: 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f  rameters.  ** to
e880: 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20   whatever their 
e890: 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72  local counterpar
e8a0: 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61  ts contain. If a
e8b0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
e8c0: 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73  r,.  ** this has
e8d0: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a   the effect of z
e8e0: 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75  eroing all outpu
e8f0: 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  t parameters..  
e900: 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54  */.  if( pzDataT
e910: 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70  ype ) *pzDataTyp
e920: 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20  e = zDataType;. 
e930: 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29   if( pzCollSeq )
e940: 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43   *pzCollSeq = zC
e950: 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e  ollSeq;.  if( pN
e960: 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75  otNull ) *pNotNu
e970: 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20  ll = notnull;.  
e980: 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20  if( pPrimaryKey 
e990: 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d  ) *pPrimaryKey =
e9a0: 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
e9b0: 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70  f( pAutoinc ) *p
e9c0: 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e  Autoinc = autoin
e9d0: 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  c;..  if( SQLITE
e9e0: 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62  _OK==rc && !pTab
e9f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
ea00: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
ea10: 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  g);.    zErrMsg 
ea20: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
ea30: 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  (db, "no such ta
ea40: 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25  ble column: %s.%
ea50: 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a  s", zTableName,.
ea60: 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e          zColumnN
ea70: 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
ea80: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
ea90: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
eaa0: 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
eab0: 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
eac0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
ead0: 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
eae0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
eaf0: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
eb00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
eb10: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
eb20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
eb30: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
eb40: 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
eb50: 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
eb60: 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
eb70: 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69  time slept..*/.i
eb80: 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  nt sqlite3_sleep
eb90: 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69  (int ms){.  sqli
eba0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
ebb0: 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20   int rc;.  pVfs 
ebc0: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
ebd0: 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66  nd(0);.  if( pVf
ebe0: 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
ebf0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
ec00: 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69  tion works in mi
ec10: 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20  lliseconds, but 
ec20: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f  the underlying O
ec30: 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41  sSleep() .  ** A
ec40: 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63  PI uses microsec
ec50: 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20  onds. Hence the 
ec60: 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72  1000's..  */.  r
ec70: 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c  c = (sqlite3OsSl
ec80: 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d  eep(pVfs, 1000*m
ec90: 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  s)/1000);.  retu
eca0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ecb0: 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
ecc0: 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  e the extended r
ecd0: 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a  esult codes..*/.
ece0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
ecf0: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
ed00: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
ed10: 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c  nt onoff){.  sql
ed20: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ed30: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
ed40: 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f  b->errMask = ono
ed50: 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  ff ? 0xffffffff 
ed60: 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65  : 0xff;.  sqlite
ed70: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
ed80: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
ed90: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
eda0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
edb0: 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d  e xFileControl m
edc0: 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69  ethod on a parti
edd0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a  cular database..
ede0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  */.int sqlite3_f
edf0: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69  ile_control(sqli
ee00: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
ee10: 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e  har *zDbName, in
ee20: 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
ee30: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ee40: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e  LITE_ERROR;.  in
ee50: 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
ee60: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ee70: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
ee80: 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  DbName==0 ){.   
ee90: 20 69 44 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   iDb = 0;.  }els
eea0: 65 7b 0a 20 20 20 20 66 6f 72 28 69 44 62 3d 30  e{.    for(iDb=0
eeb0: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
eec0: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Db++){.      if(
eed0: 20 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b   strcmp(db->aDb[
eee0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 4e  iDb].zName, zDbN
eef0: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
ef00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
ef10: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 7b 0a   iDb<db->nDb ){.
ef20: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 72 65      Btree *pBtre
ef30: 65 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  e = db->aDb[iDb]
ef40: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
ef50: 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20 50 61  tree ){.      Pa
ef60: 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
ef70: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
ef80: 2a 66 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  *fd;.      sqlit
ef90: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
efa0: 72 65 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ree);.      pPag
efb0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
efc0: 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a  ePager(pBtree);.
efd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
efe0: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  ager!=0 );.     
eff0: 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67   fd = sqlite3Pag
f000: 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
f010: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 64        assert( fd
f020: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
f030: 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
f040: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f050: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
f060: 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29  ol(fd, op, pArg)
f070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f080: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
f090: 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 7d  e(pBtree);.    }
f0a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
f0b0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f0c0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f0d0: 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rc;   .}../*.** 
f0e0: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65  Interface to the
f0f0: 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a   testing logic..
f100: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
f110: 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20  est_control(int 
f120: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20  op, ...){.  int 
f130: 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  rc = 0;.#ifndef 
f140: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
f150: 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69  TIN_TEST.  va_li
f160: 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
f170: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
f180: 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
f190: 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74  /*.    ** Save t
f1a0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
f1b0: 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20   of the PRNG..  
f1c0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
f1d0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
f1e0: 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20  NG_SAVE: {.     
f1f0: 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65   sqlite3PrngSave
f200: 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
f210: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
f220: 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f   /*.    ** Resto
f230: 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  re the state of 
f240: 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20  the PRNG to the 
f250: 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64  last state saved
f260: 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52   using.    ** PR
f270: 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e  NG_SAVE.  If PRN
f280: 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72  G_SAVE has never
f290: 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c   before been cal
f2a0: 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
f2b0: 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20   this verb acts 
f2c0: 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e  like PRNG_RESET.
f2d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f2e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
f2f0: 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b  _PRNG_RESTORE: {
f300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
f310: 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29  ngRestoreState()
f320: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f330: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
f340: 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52   ** Reset the PR
f350: 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75  NG back to its u
f360: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61  ninitialized sta
f370: 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61  te.  The next ca
f380: 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
f390: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
f3a0: 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68  ) will reseed th
f3b0: 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73  e PRNG using a s
f3c0: 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a  ingle call.    *
f3d0: 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d  * to the xRandom
f3e0: 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74  ness method of t
f3f0: 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a  he default VFS..
f400: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
f410: 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
f420: 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20  PRNG_RESET: {.  
f430: 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52      sqlite3PrngR
f440: 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20 20 20  esetState();.   
f450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f460: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
f470: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
f480: 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54  trol(BITVEC_TEST
f490: 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29  , size, program)
f4a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
f4b0: 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73  un a test agains
f4c0: 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63  t a Bitvec objec
f4d0: 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20  t of size.  The 
f4e0: 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74  program argument
f4f0: 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72  .    ** is an ar
f500: 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
f510: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
f520: 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d   test.  Return -
f530: 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65  1 on a.    ** me
f540: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
f550: 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63  error, 0 on succ
f560: 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  ess, or non-zero
f570: 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
f580: 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71     ** See the sq
f590: 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
f5a0: 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64  inTest() for add
f5b0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
f5c0: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
f5d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
f5e0: 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
f5f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  : {.      int sz
f600: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
f610: 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  t);.      int *a
f620: 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  Prog = va_arg(ap
f630: 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72  , int*);.      r
f640: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
f650: 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c  cBuiltinTest(sz,
f660: 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62   aProg);.      b
f670: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
f680: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
f690: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
f6a0: 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  (BENIGN_MALLOC_H
f6b0: 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45  OOKS, xBegin, xE
f6c0: 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd).    **.    *
f6d0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73  * Register hooks
f6e0: 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69   to call to indi
f6f0: 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f  cate which mallo
f700: 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20  c() failures .  
f710: 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e    ** are benign.
f720: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
f730: 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
f740: 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  _BENIGN_MALLOC_H
f750: 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79  OOKS: {.      ty
f760: 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69  pedef void (*voi
f770: 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64  d_function)(void
f780: 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  );.      void_fu
f790: 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65  nction xBenignBe
f7a0: 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  gin;.      void_
f7b0: 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
f7c0: 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  End;.      xBeni
f7d0: 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67  gnBegin = va_arg
f7e0: 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
f7f0: 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  on);.      xBeni
f800: 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61  gnEnd = va_arg(a
f810: 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
f820: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f830: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b  BenignMallocHook
f840: 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20  s(xBenignBegin, 
f850: 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20  xBenignEnd);.   
f860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f870: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
f880: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
f890: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
f8a0: 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
f8b0: 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  E, unsigned int 
f8c0: 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
f8d0: 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47   Set the PENDING
f8e0: 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c   byte to the val
f8f0: 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ue in the argume
f900: 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20  nt, if X>0..    
f910: 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
f920: 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74  es if X==0.  Ret
f930: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
f940: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74   the pending byt
f950: 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65  e.    ** as it e
f960: 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74  xisting before t
f970: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
f980: 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  called..    **. 
f990: 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a     ** IMPORTANT:
f9a0: 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
f9b0: 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d  ENDING byte from
f9c0: 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75   0x40000000 resu
f9d0: 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e  lts in.    ** an
f9e0: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61   incompatible da
f9f0: 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d  tabase file form
fa00: 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68  at.  Changing th
fa10: 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20  e PENDING byte. 
fa20: 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20     ** while any 
fa30: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
fa40: 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75  ion is open resu
fa50: 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64  lts in undefined
fa60: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69 6c 65   and.    ** dile
fa70: 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72  terious behavior
fa80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
fa90: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
faa0: 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20  L_PENDING_BYTE: 
fab0: 7b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  {.      unsigned
fac0: 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61   int newVal = va
fad0: 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65  _arg(ap, unsigne
fae0: 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  d int);.      rc
faf0: 20 3d 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e   = sqlite3Pendin
fb00: 67 42 79 74 65 3b 0a 20 20 20 20 20 20 69 66 28  gByte;.      if(
fb10: 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65   newVal ) sqlite
fb20: 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e  3PendingByte = n
fb30: 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 62 72 65  ewVal;.      bre
fb40: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
fb50: 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
fb60: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
fb70: 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
fb80: 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
fb90: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
fba0: 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
fbb0: 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
fbc0: 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
fbd0: 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
fbe0: 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
fbf0: 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
fc00: 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
fc10: 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
fc20: 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
fc30: 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
fc40: 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
fc50: 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
fc60: 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
fc70: 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
fc80: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
fc90: 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
fca0: 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
fcb0: 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
fcc0: 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
fcd0: 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
fce0: 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
fcf0: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
fd00: 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
fd10: 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
fd20: 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
fd30: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
fd40: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
fd50: 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
fd60: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
fd70: 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
fd80: 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
fd90: 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
fda0: 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61  ssert( (x = va_a
fdb0: 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
fdc0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
fdd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fde0: 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
fdf0: 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
fe00: 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
fe10: 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
fe20: 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
fe30: 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
fe40: 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
fe50: 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
fe60: 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
fe70: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
fe80: 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
fe90: 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
fea0: 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
feb0: 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
fec0: 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
fed0: 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
fee0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
fef0: 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
ff00: 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
ff10: 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
ff20: 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
ff30: 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
ff40: 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
ff50: 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
ff60: 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
ff70: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
ff80: 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
ff90: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
ffa0: 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
ffb0: 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
ffc0: 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
ffd0: 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
ffe0: 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
fff0: 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
10000 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
10010 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
10020 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
10030 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
10040 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
10050 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
10060 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
10070 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
10080 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
10090 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
100a0 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
100b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
100c0 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
100d0 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
100e0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
100f0 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
10100 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
10110 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
10120 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
10130 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
10140 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
10150 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
10160 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
10170 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
10180 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
10190 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
101a0 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
101b0 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
101c0 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
101d0 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
101e0 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
101f0 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
10200 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
10210 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
10220 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
10230 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
10240 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
10250 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
10260 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
10270 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
10280 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
10290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
102a0 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
102b0 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
102c0 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
102d0 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
102e0 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
102f0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
10300 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
10310 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
10320 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
10330 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
10340 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
10350 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
10360 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
10370 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
10380 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
10390 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
103a0 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
103b0 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
103c0 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
103d0 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
103e0 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
103f0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
10400 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
10410 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
10420 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
10430 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
10440 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
10450 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
10460 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
10470 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
10480 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10490 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
104a0 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
104b0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
104c0 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
104d0 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
104e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
104f0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
10500 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
10510 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 76 61  .    }..  }.  va
10520 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
10530 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10540 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a  BUILTIN_TEST */.
10550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.